1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright (C) 1999-2016 Free Software Foundation, Inc.
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
5 Largely rewritten by Alan Modra.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
24 /* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
34 #include "elf/ppc64.h"
35 #include "elf64-ppc.h"
38 static bfd_reloc_status_type ppc64_elf_ha_reloc
39 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
40 static bfd_reloc_status_type ppc64_elf_branch_reloc
41 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
42 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
43 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
44 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
45 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
46 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
47 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
48 static bfd_reloc_status_type ppc64_elf_toc_reloc
49 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
50 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
51 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
52 static bfd_reloc_status_type ppc64_elf_toc64_reloc
53 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
54 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
55 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
56 static bfd_vma opd_entry_value
57 (asection
*, bfd_vma
, asection
**, bfd_vma
*, bfd_boolean
);
59 #define TARGET_LITTLE_SYM powerpc_elf64_le_vec
60 #define TARGET_LITTLE_NAME "elf64-powerpcle"
61 #define TARGET_BIG_SYM powerpc_elf64_vec
62 #define TARGET_BIG_NAME "elf64-powerpc"
63 #define ELF_ARCH bfd_arch_powerpc
64 #define ELF_TARGET_ID PPC64_ELF_DATA
65 #define ELF_MACHINE_CODE EM_PPC64
66 #define ELF_MAXPAGESIZE 0x10000
67 #define ELF_COMMONPAGESIZE 0x10000
68 #define elf_info_to_howto ppc64_elf_info_to_howto
70 #define elf_backend_want_got_sym 0
71 #define elf_backend_want_plt_sym 0
72 #define elf_backend_plt_alignment 3
73 #define elf_backend_plt_not_loaded 1
74 #define elf_backend_got_header_size 8
75 #define elf_backend_can_gc_sections 1
76 #define elf_backend_can_refcount 1
77 #define elf_backend_rela_normal 1
78 #define elf_backend_dtrel_excludes_plt 1
79 #define elf_backend_default_execstack 0
81 #define bfd_elf64_mkobject ppc64_elf_mkobject
82 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
83 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
84 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
85 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
86 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
87 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
88 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
89 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
90 #define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
92 #define elf_backend_object_p ppc64_elf_object_p
93 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
94 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
95 #define elf_backend_write_core_note ppc64_elf_write_core_note
96 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
97 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
98 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
99 #define elf_backend_check_directives ppc64_elf_before_check_relocs
100 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
101 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
102 #define elf_backend_check_relocs ppc64_elf_check_relocs
103 #define elf_backend_gc_keep ppc64_elf_gc_keep
104 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
105 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
106 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
107 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
108 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
109 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
110 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
111 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
112 #define elf_backend_hash_symbol ppc64_elf_hash_symbol
113 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
114 #define elf_backend_action_discarded ppc64_elf_action_discarded
115 #define elf_backend_relocate_section ppc64_elf_relocate_section
116 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
117 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
118 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
119 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
120 #define elf_backend_special_sections ppc64_elf_special_sections
121 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
122 #define elf_backend_merge_symbol ppc64_elf_merge_symbol
124 /* The name of the dynamic interpreter. This is put in the .interp
126 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
128 /* The size in bytes of an entry in the procedure linkage table. */
129 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
131 /* The initial size of the plt reserved for the dynamic linker. */
132 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
134 /* Offsets to some stack save slots. */
136 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
137 /* This one is dodgy. ELFv2 does not have a linker word, so use the
138 CR save slot. Used only by optimised __tls_get_addr call stub,
139 relying on __tls_get_addr_opt not saving CR.. */
140 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
142 /* TOC base pointers offset from start of TOC. */
143 #define TOC_BASE_OFF 0x8000
144 /* TOC base alignment. */
145 #define TOC_BASE_ALIGN 256
147 /* Offset of tp and dtp pointers from start of TLS block. */
148 #define TP_OFFSET 0x7000
149 #define DTP_OFFSET 0x8000
151 /* .plt call stub instructions. The normal stub is like this, but
152 sometimes the .plt entry crosses a 64k boundary and we need to
153 insert an addi to adjust r11. */
154 #define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
155 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
156 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
157 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
158 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
159 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
160 #define BCTR 0x4e800420 /* bctr */
162 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
163 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
164 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
166 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
167 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
168 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
169 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
170 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
171 #define BNECTR 0x4ca20420 /* bnectr+ */
172 #define BNECTR_P4 0x4ce20420 /* bnectr+ */
174 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
175 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
176 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
178 #define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
179 #define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
180 #define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
182 #define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
183 #define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
184 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
185 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
186 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
188 /* glink call stub instructions. We enter with the index in R0. */
189 #define GLINK_CALL_STUB_SIZE (16*4)
193 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
194 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
196 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
197 /* ld %2,(0b-1b)(%11) */
198 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
199 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
205 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */
206 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
207 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
208 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
209 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
212 #define NOP 0x60000000
214 /* Some other nops. */
215 #define CROR_151515 0x4def7b82
216 #define CROR_313131 0x4ffffb82
218 /* .glink entries for the first 32k functions are two instructions. */
219 #define LI_R0_0 0x38000000 /* li %r0,0 */
220 #define B_DOT 0x48000000 /* b . */
222 /* After that, we need two instructions to load the index, followed by
224 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
225 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
227 /* Instructions used by the save and restore reg functions. */
228 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
229 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
230 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
231 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
232 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
233 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
234 #define LI_R12_0 0x39800000 /* li %r12,0 */
235 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
236 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
237 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
238 #define BLR 0x4e800020 /* blr */
240 /* Since .opd is an array of descriptors and each entry will end up
241 with identical R_PPC64_RELATIVE relocs, there is really no need to
242 propagate .opd relocs; The dynamic linker should be taught to
243 relocate .opd without reloc entries. */
244 #ifndef NO_OPD_RELOCS
245 #define NO_OPD_RELOCS 0
249 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
253 abiversion (bfd
*abfd
)
255 return elf_elfheader (abfd
)->e_flags
& EF_PPC64_ABI
;
259 set_abiversion (bfd
*abfd
, int ver
)
261 elf_elfheader (abfd
)->e_flags
&= ~EF_PPC64_ABI
;
262 elf_elfheader (abfd
)->e_flags
|= ver
& EF_PPC64_ABI
;
265 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
267 /* Relocation HOWTO's. */
268 static reloc_howto_type
*ppc64_elf_howto_table
[(int) R_PPC64_max
];
270 static reloc_howto_type ppc64_elf_howto_raw
[] = {
271 /* This reloc does nothing. */
272 HOWTO (R_PPC64_NONE
, /* type */
274 3, /* size (0 = byte, 1 = short, 2 = long) */
276 FALSE
, /* pc_relative */
278 complain_overflow_dont
, /* complain_on_overflow */
279 bfd_elf_generic_reloc
, /* special_function */
280 "R_PPC64_NONE", /* name */
281 FALSE
, /* partial_inplace */
284 FALSE
), /* pcrel_offset */
286 /* A standard 32 bit relocation. */
287 HOWTO (R_PPC64_ADDR32
, /* type */
289 2, /* size (0 = byte, 1 = short, 2 = long) */
291 FALSE
, /* pc_relative */
293 complain_overflow_bitfield
, /* complain_on_overflow */
294 bfd_elf_generic_reloc
, /* special_function */
295 "R_PPC64_ADDR32", /* name */
296 FALSE
, /* partial_inplace */
298 0xffffffff, /* dst_mask */
299 FALSE
), /* pcrel_offset */
301 /* An absolute 26 bit branch; the lower two bits must be zero.
302 FIXME: we don't check that, we just clear them. */
303 HOWTO (R_PPC64_ADDR24
, /* type */
305 2, /* size (0 = byte, 1 = short, 2 = long) */
307 FALSE
, /* pc_relative */
309 complain_overflow_bitfield
, /* complain_on_overflow */
310 bfd_elf_generic_reloc
, /* special_function */
311 "R_PPC64_ADDR24", /* name */
312 FALSE
, /* partial_inplace */
314 0x03fffffc, /* dst_mask */
315 FALSE
), /* pcrel_offset */
317 /* A standard 16 bit relocation. */
318 HOWTO (R_PPC64_ADDR16
, /* type */
320 1, /* size (0 = byte, 1 = short, 2 = long) */
322 FALSE
, /* pc_relative */
324 complain_overflow_bitfield
, /* complain_on_overflow */
325 bfd_elf_generic_reloc
, /* special_function */
326 "R_PPC64_ADDR16", /* name */
327 FALSE
, /* partial_inplace */
329 0xffff, /* dst_mask */
330 FALSE
), /* pcrel_offset */
332 /* A 16 bit relocation without overflow. */
333 HOWTO (R_PPC64_ADDR16_LO
, /* type */
335 1, /* size (0 = byte, 1 = short, 2 = long) */
337 FALSE
, /* pc_relative */
339 complain_overflow_dont
,/* complain_on_overflow */
340 bfd_elf_generic_reloc
, /* special_function */
341 "R_PPC64_ADDR16_LO", /* name */
342 FALSE
, /* partial_inplace */
344 0xffff, /* dst_mask */
345 FALSE
), /* pcrel_offset */
347 /* Bits 16-31 of an address. */
348 HOWTO (R_PPC64_ADDR16_HI
, /* type */
350 1, /* size (0 = byte, 1 = short, 2 = long) */
352 FALSE
, /* pc_relative */
354 complain_overflow_signed
, /* complain_on_overflow */
355 bfd_elf_generic_reloc
, /* special_function */
356 "R_PPC64_ADDR16_HI", /* name */
357 FALSE
, /* partial_inplace */
359 0xffff, /* dst_mask */
360 FALSE
), /* pcrel_offset */
362 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
363 bits, treated as a signed number, is negative. */
364 HOWTO (R_PPC64_ADDR16_HA
, /* type */
366 1, /* size (0 = byte, 1 = short, 2 = long) */
368 FALSE
, /* pc_relative */
370 complain_overflow_signed
, /* complain_on_overflow */
371 ppc64_elf_ha_reloc
, /* special_function */
372 "R_PPC64_ADDR16_HA", /* name */
373 FALSE
, /* partial_inplace */
375 0xffff, /* dst_mask */
376 FALSE
), /* pcrel_offset */
378 /* An absolute 16 bit branch; the lower two bits must be zero.
379 FIXME: we don't check that, we just clear them. */
380 HOWTO (R_PPC64_ADDR14
, /* type */
382 2, /* size (0 = byte, 1 = short, 2 = long) */
384 FALSE
, /* pc_relative */
386 complain_overflow_signed
, /* complain_on_overflow */
387 ppc64_elf_branch_reloc
, /* special_function */
388 "R_PPC64_ADDR14", /* name */
389 FALSE
, /* partial_inplace */
391 0x0000fffc, /* dst_mask */
392 FALSE
), /* pcrel_offset */
394 /* An absolute 16 bit branch, for which bit 10 should be set to
395 indicate that the branch is expected to be taken. The lower two
396 bits must be zero. */
397 HOWTO (R_PPC64_ADDR14_BRTAKEN
, /* type */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
401 FALSE
, /* pc_relative */
403 complain_overflow_signed
, /* complain_on_overflow */
404 ppc64_elf_brtaken_reloc
, /* special_function */
405 "R_PPC64_ADDR14_BRTAKEN",/* name */
406 FALSE
, /* partial_inplace */
408 0x0000fffc, /* dst_mask */
409 FALSE
), /* pcrel_offset */
411 /* An absolute 16 bit branch, for which bit 10 should be set to
412 indicate that the branch is not expected to be taken. The lower
413 two bits must be zero. */
414 HOWTO (R_PPC64_ADDR14_BRNTAKEN
, /* type */
416 2, /* size (0 = byte, 1 = short, 2 = long) */
418 FALSE
, /* pc_relative */
420 complain_overflow_signed
, /* complain_on_overflow */
421 ppc64_elf_brtaken_reloc
, /* special_function */
422 "R_PPC64_ADDR14_BRNTAKEN",/* name */
423 FALSE
, /* partial_inplace */
425 0x0000fffc, /* dst_mask */
426 FALSE
), /* pcrel_offset */
428 /* A relative 26 bit branch; the lower two bits must be zero. */
429 HOWTO (R_PPC64_REL24
, /* type */
431 2, /* size (0 = byte, 1 = short, 2 = long) */
433 TRUE
, /* pc_relative */
435 complain_overflow_signed
, /* complain_on_overflow */
436 ppc64_elf_branch_reloc
, /* special_function */
437 "R_PPC64_REL24", /* name */
438 FALSE
, /* partial_inplace */
440 0x03fffffc, /* dst_mask */
441 TRUE
), /* pcrel_offset */
443 /* A relative 16 bit branch; the lower two bits must be zero. */
444 HOWTO (R_PPC64_REL14
, /* type */
446 2, /* size (0 = byte, 1 = short, 2 = long) */
448 TRUE
, /* pc_relative */
450 complain_overflow_signed
, /* complain_on_overflow */
451 ppc64_elf_branch_reloc
, /* special_function */
452 "R_PPC64_REL14", /* name */
453 FALSE
, /* partial_inplace */
455 0x0000fffc, /* dst_mask */
456 TRUE
), /* pcrel_offset */
458 /* A relative 16 bit branch. Bit 10 should be set to indicate that
459 the branch is expected to be taken. The lower two bits must be
461 HOWTO (R_PPC64_REL14_BRTAKEN
, /* type */
463 2, /* size (0 = byte, 1 = short, 2 = long) */
465 TRUE
, /* pc_relative */
467 complain_overflow_signed
, /* complain_on_overflow */
468 ppc64_elf_brtaken_reloc
, /* special_function */
469 "R_PPC64_REL14_BRTAKEN", /* name */
470 FALSE
, /* partial_inplace */
472 0x0000fffc, /* dst_mask */
473 TRUE
), /* pcrel_offset */
475 /* A relative 16 bit branch. Bit 10 should be set to indicate that
476 the branch is not expected to be taken. The lower two bits must
478 HOWTO (R_PPC64_REL14_BRNTAKEN
, /* type */
480 2, /* size (0 = byte, 1 = short, 2 = long) */
482 TRUE
, /* pc_relative */
484 complain_overflow_signed
, /* complain_on_overflow */
485 ppc64_elf_brtaken_reloc
, /* special_function */
486 "R_PPC64_REL14_BRNTAKEN",/* name */
487 FALSE
, /* partial_inplace */
489 0x0000fffc, /* dst_mask */
490 TRUE
), /* pcrel_offset */
492 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
494 HOWTO (R_PPC64_GOT16
, /* type */
496 1, /* size (0 = byte, 1 = short, 2 = long) */
498 FALSE
, /* pc_relative */
500 complain_overflow_signed
, /* complain_on_overflow */
501 ppc64_elf_unhandled_reloc
, /* special_function */
502 "R_PPC64_GOT16", /* name */
503 FALSE
, /* partial_inplace */
505 0xffff, /* dst_mask */
506 FALSE
), /* pcrel_offset */
508 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
510 HOWTO (R_PPC64_GOT16_LO
, /* type */
512 1, /* size (0 = byte, 1 = short, 2 = long) */
514 FALSE
, /* pc_relative */
516 complain_overflow_dont
, /* complain_on_overflow */
517 ppc64_elf_unhandled_reloc
, /* special_function */
518 "R_PPC64_GOT16_LO", /* name */
519 FALSE
, /* partial_inplace */
521 0xffff, /* dst_mask */
522 FALSE
), /* pcrel_offset */
524 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
526 HOWTO (R_PPC64_GOT16_HI
, /* type */
528 1, /* size (0 = byte, 1 = short, 2 = long) */
530 FALSE
, /* pc_relative */
532 complain_overflow_signed
,/* complain_on_overflow */
533 ppc64_elf_unhandled_reloc
, /* special_function */
534 "R_PPC64_GOT16_HI", /* name */
535 FALSE
, /* partial_inplace */
537 0xffff, /* dst_mask */
538 FALSE
), /* pcrel_offset */
540 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
542 HOWTO (R_PPC64_GOT16_HA
, /* type */
544 1, /* size (0 = byte, 1 = short, 2 = long) */
546 FALSE
, /* pc_relative */
548 complain_overflow_signed
,/* complain_on_overflow */
549 ppc64_elf_unhandled_reloc
, /* special_function */
550 "R_PPC64_GOT16_HA", /* name */
551 FALSE
, /* partial_inplace */
553 0xffff, /* dst_mask */
554 FALSE
), /* pcrel_offset */
556 /* This is used only by the dynamic linker. The symbol should exist
557 both in the object being run and in some shared library. The
558 dynamic linker copies the data addressed by the symbol from the
559 shared library into the object, because the object being
560 run has to have the data at some particular address. */
561 HOWTO (R_PPC64_COPY
, /* type */
563 0, /* this one is variable size */
565 FALSE
, /* pc_relative */
567 complain_overflow_dont
, /* complain_on_overflow */
568 ppc64_elf_unhandled_reloc
, /* special_function */
569 "R_PPC64_COPY", /* name */
570 FALSE
, /* partial_inplace */
573 FALSE
), /* pcrel_offset */
575 /* Like R_PPC64_ADDR64, but used when setting global offset table
577 HOWTO (R_PPC64_GLOB_DAT
, /* type */
579 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
581 FALSE
, /* pc_relative */
583 complain_overflow_dont
, /* complain_on_overflow */
584 ppc64_elf_unhandled_reloc
, /* special_function */
585 "R_PPC64_GLOB_DAT", /* name */
586 FALSE
, /* partial_inplace */
588 ONES (64), /* dst_mask */
589 FALSE
), /* pcrel_offset */
591 /* Created by the link editor. Marks a procedure linkage table
592 entry for a symbol. */
593 HOWTO (R_PPC64_JMP_SLOT
, /* type */
595 0, /* size (0 = byte, 1 = short, 2 = long) */
597 FALSE
, /* pc_relative */
599 complain_overflow_dont
, /* complain_on_overflow */
600 ppc64_elf_unhandled_reloc
, /* special_function */
601 "R_PPC64_JMP_SLOT", /* name */
602 FALSE
, /* partial_inplace */
605 FALSE
), /* pcrel_offset */
607 /* Used only by the dynamic linker. When the object is run, this
608 doubleword64 is set to the load address of the object, plus the
610 HOWTO (R_PPC64_RELATIVE
, /* type */
612 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
614 FALSE
, /* pc_relative */
616 complain_overflow_dont
, /* complain_on_overflow */
617 bfd_elf_generic_reloc
, /* special_function */
618 "R_PPC64_RELATIVE", /* name */
619 FALSE
, /* partial_inplace */
621 ONES (64), /* dst_mask */
622 FALSE
), /* pcrel_offset */
624 /* Like R_PPC64_ADDR32, but may be unaligned. */
625 HOWTO (R_PPC64_UADDR32
, /* type */
627 2, /* size (0 = byte, 1 = short, 2 = long) */
629 FALSE
, /* pc_relative */
631 complain_overflow_bitfield
, /* complain_on_overflow */
632 bfd_elf_generic_reloc
, /* special_function */
633 "R_PPC64_UADDR32", /* name */
634 FALSE
, /* partial_inplace */
636 0xffffffff, /* dst_mask */
637 FALSE
), /* pcrel_offset */
639 /* Like R_PPC64_ADDR16, but may be unaligned. */
640 HOWTO (R_PPC64_UADDR16
, /* type */
642 1, /* size (0 = byte, 1 = short, 2 = long) */
644 FALSE
, /* pc_relative */
646 complain_overflow_bitfield
, /* complain_on_overflow */
647 bfd_elf_generic_reloc
, /* special_function */
648 "R_PPC64_UADDR16", /* name */
649 FALSE
, /* partial_inplace */
651 0xffff, /* dst_mask */
652 FALSE
), /* pcrel_offset */
654 /* 32-bit PC relative. */
655 HOWTO (R_PPC64_REL32
, /* type */
657 2, /* size (0 = byte, 1 = short, 2 = long) */
659 TRUE
, /* pc_relative */
661 complain_overflow_signed
, /* complain_on_overflow */
662 bfd_elf_generic_reloc
, /* special_function */
663 "R_PPC64_REL32", /* name */
664 FALSE
, /* partial_inplace */
666 0xffffffff, /* dst_mask */
667 TRUE
), /* pcrel_offset */
669 /* 32-bit relocation to the symbol's procedure linkage table. */
670 HOWTO (R_PPC64_PLT32
, /* type */
672 2, /* size (0 = byte, 1 = short, 2 = long) */
674 FALSE
, /* pc_relative */
676 complain_overflow_bitfield
, /* complain_on_overflow */
677 ppc64_elf_unhandled_reloc
, /* special_function */
678 "R_PPC64_PLT32", /* name */
679 FALSE
, /* partial_inplace */
681 0xffffffff, /* dst_mask */
682 FALSE
), /* pcrel_offset */
684 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
685 FIXME: R_PPC64_PLTREL32 not supported. */
686 HOWTO (R_PPC64_PLTREL32
, /* type */
688 2, /* size (0 = byte, 1 = short, 2 = long) */
690 TRUE
, /* pc_relative */
692 complain_overflow_signed
, /* complain_on_overflow */
693 ppc64_elf_unhandled_reloc
, /* special_function */
694 "R_PPC64_PLTREL32", /* name */
695 FALSE
, /* partial_inplace */
697 0xffffffff, /* dst_mask */
698 TRUE
), /* pcrel_offset */
700 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
702 HOWTO (R_PPC64_PLT16_LO
, /* type */
704 1, /* size (0 = byte, 1 = short, 2 = long) */
706 FALSE
, /* pc_relative */
708 complain_overflow_dont
, /* complain_on_overflow */
709 ppc64_elf_unhandled_reloc
, /* special_function */
710 "R_PPC64_PLT16_LO", /* name */
711 FALSE
, /* partial_inplace */
713 0xffff, /* dst_mask */
714 FALSE
), /* pcrel_offset */
716 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
718 HOWTO (R_PPC64_PLT16_HI
, /* type */
720 1, /* size (0 = byte, 1 = short, 2 = long) */
722 FALSE
, /* pc_relative */
724 complain_overflow_signed
, /* complain_on_overflow */
725 ppc64_elf_unhandled_reloc
, /* special_function */
726 "R_PPC64_PLT16_HI", /* name */
727 FALSE
, /* partial_inplace */
729 0xffff, /* dst_mask */
730 FALSE
), /* pcrel_offset */
732 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
734 HOWTO (R_PPC64_PLT16_HA
, /* type */
736 1, /* size (0 = byte, 1 = short, 2 = long) */
738 FALSE
, /* pc_relative */
740 complain_overflow_signed
, /* complain_on_overflow */
741 ppc64_elf_unhandled_reloc
, /* special_function */
742 "R_PPC64_PLT16_HA", /* name */
743 FALSE
, /* partial_inplace */
745 0xffff, /* dst_mask */
746 FALSE
), /* pcrel_offset */
748 /* 16-bit section relative relocation. */
749 HOWTO (R_PPC64_SECTOFF
, /* type */
751 1, /* size (0 = byte, 1 = short, 2 = long) */
753 FALSE
, /* pc_relative */
755 complain_overflow_signed
, /* complain_on_overflow */
756 ppc64_elf_sectoff_reloc
, /* special_function */
757 "R_PPC64_SECTOFF", /* name */
758 FALSE
, /* partial_inplace */
760 0xffff, /* dst_mask */
761 FALSE
), /* pcrel_offset */
763 /* Like R_PPC64_SECTOFF, but no overflow warning. */
764 HOWTO (R_PPC64_SECTOFF_LO
, /* type */
766 1, /* size (0 = byte, 1 = short, 2 = long) */
768 FALSE
, /* pc_relative */
770 complain_overflow_dont
, /* complain_on_overflow */
771 ppc64_elf_sectoff_reloc
, /* special_function */
772 "R_PPC64_SECTOFF_LO", /* name */
773 FALSE
, /* partial_inplace */
775 0xffff, /* dst_mask */
776 FALSE
), /* pcrel_offset */
778 /* 16-bit upper half section relative relocation. */
779 HOWTO (R_PPC64_SECTOFF_HI
, /* type */
781 1, /* size (0 = byte, 1 = short, 2 = long) */
783 FALSE
, /* pc_relative */
785 complain_overflow_signed
, /* complain_on_overflow */
786 ppc64_elf_sectoff_reloc
, /* special_function */
787 "R_PPC64_SECTOFF_HI", /* name */
788 FALSE
, /* partial_inplace */
790 0xffff, /* dst_mask */
791 FALSE
), /* pcrel_offset */
793 /* 16-bit upper half adjusted section relative relocation. */
794 HOWTO (R_PPC64_SECTOFF_HA
, /* type */
796 1, /* size (0 = byte, 1 = short, 2 = long) */
798 FALSE
, /* pc_relative */
800 complain_overflow_signed
, /* complain_on_overflow */
801 ppc64_elf_sectoff_ha_reloc
, /* special_function */
802 "R_PPC64_SECTOFF_HA", /* name */
803 FALSE
, /* partial_inplace */
805 0xffff, /* dst_mask */
806 FALSE
), /* pcrel_offset */
808 /* Like R_PPC64_REL24 without touching the two least significant bits. */
809 HOWTO (R_PPC64_REL30
, /* type */
811 2, /* size (0 = byte, 1 = short, 2 = long) */
813 TRUE
, /* pc_relative */
815 complain_overflow_dont
, /* complain_on_overflow */
816 bfd_elf_generic_reloc
, /* special_function */
817 "R_PPC64_REL30", /* name */
818 FALSE
, /* partial_inplace */
820 0xfffffffc, /* dst_mask */
821 TRUE
), /* pcrel_offset */
823 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
825 /* A standard 64-bit relocation. */
826 HOWTO (R_PPC64_ADDR64
, /* type */
828 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
830 FALSE
, /* pc_relative */
832 complain_overflow_dont
, /* complain_on_overflow */
833 bfd_elf_generic_reloc
, /* special_function */
834 "R_PPC64_ADDR64", /* name */
835 FALSE
, /* partial_inplace */
837 ONES (64), /* dst_mask */
838 FALSE
), /* pcrel_offset */
840 /* The bits 32-47 of an address. */
841 HOWTO (R_PPC64_ADDR16_HIGHER
, /* type */
843 1, /* size (0 = byte, 1 = short, 2 = long) */
845 FALSE
, /* pc_relative */
847 complain_overflow_dont
, /* complain_on_overflow */
848 bfd_elf_generic_reloc
, /* special_function */
849 "R_PPC64_ADDR16_HIGHER", /* name */
850 FALSE
, /* partial_inplace */
852 0xffff, /* dst_mask */
853 FALSE
), /* pcrel_offset */
855 /* The bits 32-47 of an address, plus 1 if the contents of the low
856 16 bits, treated as a signed number, is negative. */
857 HOWTO (R_PPC64_ADDR16_HIGHERA
, /* type */
859 1, /* size (0 = byte, 1 = short, 2 = long) */
861 FALSE
, /* pc_relative */
863 complain_overflow_dont
, /* complain_on_overflow */
864 ppc64_elf_ha_reloc
, /* special_function */
865 "R_PPC64_ADDR16_HIGHERA", /* name */
866 FALSE
, /* partial_inplace */
868 0xffff, /* dst_mask */
869 FALSE
), /* pcrel_offset */
871 /* The bits 48-63 of an address. */
872 HOWTO (R_PPC64_ADDR16_HIGHEST
,/* type */
874 1, /* size (0 = byte, 1 = short, 2 = long) */
876 FALSE
, /* pc_relative */
878 complain_overflow_dont
, /* complain_on_overflow */
879 bfd_elf_generic_reloc
, /* special_function */
880 "R_PPC64_ADDR16_HIGHEST", /* name */
881 FALSE
, /* partial_inplace */
883 0xffff, /* dst_mask */
884 FALSE
), /* pcrel_offset */
886 /* The bits 48-63 of an address, plus 1 if the contents of the low
887 16 bits, treated as a signed number, is negative. */
888 HOWTO (R_PPC64_ADDR16_HIGHESTA
,/* type */
890 1, /* size (0 = byte, 1 = short, 2 = long) */
892 FALSE
, /* pc_relative */
894 complain_overflow_dont
, /* complain_on_overflow */
895 ppc64_elf_ha_reloc
, /* special_function */
896 "R_PPC64_ADDR16_HIGHESTA", /* name */
897 FALSE
, /* partial_inplace */
899 0xffff, /* dst_mask */
900 FALSE
), /* pcrel_offset */
902 /* Like ADDR64, but may be unaligned. */
903 HOWTO (R_PPC64_UADDR64
, /* type */
905 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
907 FALSE
, /* pc_relative */
909 complain_overflow_dont
, /* complain_on_overflow */
910 bfd_elf_generic_reloc
, /* special_function */
911 "R_PPC64_UADDR64", /* name */
912 FALSE
, /* partial_inplace */
914 ONES (64), /* dst_mask */
915 FALSE
), /* pcrel_offset */
917 /* 64-bit relative relocation. */
918 HOWTO (R_PPC64_REL64
, /* type */
920 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
922 TRUE
, /* pc_relative */
924 complain_overflow_dont
, /* complain_on_overflow */
925 bfd_elf_generic_reloc
, /* special_function */
926 "R_PPC64_REL64", /* name */
927 FALSE
, /* partial_inplace */
929 ONES (64), /* dst_mask */
930 TRUE
), /* pcrel_offset */
932 /* 64-bit relocation to the symbol's procedure linkage table. */
933 HOWTO (R_PPC64_PLT64
, /* type */
935 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
937 FALSE
, /* pc_relative */
939 complain_overflow_dont
, /* complain_on_overflow */
940 ppc64_elf_unhandled_reloc
, /* special_function */
941 "R_PPC64_PLT64", /* name */
942 FALSE
, /* partial_inplace */
944 ONES (64), /* dst_mask */
945 FALSE
), /* pcrel_offset */
947 /* 64-bit PC relative relocation to the symbol's procedure linkage
949 /* FIXME: R_PPC64_PLTREL64 not supported. */
950 HOWTO (R_PPC64_PLTREL64
, /* type */
952 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
954 TRUE
, /* pc_relative */
956 complain_overflow_dont
, /* complain_on_overflow */
957 ppc64_elf_unhandled_reloc
, /* special_function */
958 "R_PPC64_PLTREL64", /* name */
959 FALSE
, /* partial_inplace */
961 ONES (64), /* dst_mask */
962 TRUE
), /* pcrel_offset */
964 /* 16 bit TOC-relative relocation. */
966 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
967 HOWTO (R_PPC64_TOC16
, /* type */
969 1, /* size (0 = byte, 1 = short, 2 = long) */
971 FALSE
, /* pc_relative */
973 complain_overflow_signed
, /* complain_on_overflow */
974 ppc64_elf_toc_reloc
, /* special_function */
975 "R_PPC64_TOC16", /* name */
976 FALSE
, /* partial_inplace */
978 0xffff, /* dst_mask */
979 FALSE
), /* pcrel_offset */
981 /* 16 bit TOC-relative relocation without overflow. */
983 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
984 HOWTO (R_PPC64_TOC16_LO
, /* type */
986 1, /* size (0 = byte, 1 = short, 2 = long) */
988 FALSE
, /* pc_relative */
990 complain_overflow_dont
, /* complain_on_overflow */
991 ppc64_elf_toc_reloc
, /* special_function */
992 "R_PPC64_TOC16_LO", /* name */
993 FALSE
, /* partial_inplace */
995 0xffff, /* dst_mask */
996 FALSE
), /* pcrel_offset */
998 /* 16 bit TOC-relative relocation, high 16 bits. */
1000 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
1001 HOWTO (R_PPC64_TOC16_HI
, /* type */
1002 16, /* rightshift */
1003 1, /* size (0 = byte, 1 = short, 2 = long) */
1005 FALSE
, /* pc_relative */
1007 complain_overflow_signed
, /* complain_on_overflow */
1008 ppc64_elf_toc_reloc
, /* special_function */
1009 "R_PPC64_TOC16_HI", /* name */
1010 FALSE
, /* partial_inplace */
1012 0xffff, /* dst_mask */
1013 FALSE
), /* pcrel_offset */
1015 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1016 contents of the low 16 bits, treated as a signed number, is
1019 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1020 HOWTO (R_PPC64_TOC16_HA
, /* type */
1021 16, /* rightshift */
1022 1, /* size (0 = byte, 1 = short, 2 = long) */
1024 FALSE
, /* pc_relative */
1026 complain_overflow_signed
, /* complain_on_overflow */
1027 ppc64_elf_toc_ha_reloc
, /* special_function */
1028 "R_PPC64_TOC16_HA", /* name */
1029 FALSE
, /* partial_inplace */
1031 0xffff, /* dst_mask */
1032 FALSE
), /* pcrel_offset */
1034 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1036 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1037 HOWTO (R_PPC64_TOC
, /* type */
1039 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1041 FALSE
, /* pc_relative */
1043 complain_overflow_dont
, /* complain_on_overflow */
1044 ppc64_elf_toc64_reloc
, /* special_function */
1045 "R_PPC64_TOC", /* name */
1046 FALSE
, /* partial_inplace */
1048 ONES (64), /* dst_mask */
1049 FALSE
), /* pcrel_offset */
1051 /* Like R_PPC64_GOT16, but also informs the link editor that the
1052 value to relocate may (!) refer to a PLT entry which the link
1053 editor (a) may replace with the symbol value. If the link editor
1054 is unable to fully resolve the symbol, it may (b) create a PLT
1055 entry and store the address to the new PLT entry in the GOT.
1056 This permits lazy resolution of function symbols at run time.
1057 The link editor may also skip all of this and just (c) emit a
1058 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1059 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1060 HOWTO (R_PPC64_PLTGOT16
, /* type */
1062 1, /* size (0 = byte, 1 = short, 2 = long) */
1064 FALSE
, /* pc_relative */
1066 complain_overflow_signed
, /* complain_on_overflow */
1067 ppc64_elf_unhandled_reloc
, /* special_function */
1068 "R_PPC64_PLTGOT16", /* name */
1069 FALSE
, /* partial_inplace */
1071 0xffff, /* dst_mask */
1072 FALSE
), /* pcrel_offset */
1074 /* Like R_PPC64_PLTGOT16, but without overflow. */
1075 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1076 HOWTO (R_PPC64_PLTGOT16_LO
, /* type */
1078 1, /* size (0 = byte, 1 = short, 2 = long) */
1080 FALSE
, /* pc_relative */
1082 complain_overflow_dont
, /* complain_on_overflow */
1083 ppc64_elf_unhandled_reloc
, /* special_function */
1084 "R_PPC64_PLTGOT16_LO", /* name */
1085 FALSE
, /* partial_inplace */
1087 0xffff, /* dst_mask */
1088 FALSE
), /* pcrel_offset */
1090 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1091 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1092 HOWTO (R_PPC64_PLTGOT16_HI
, /* type */
1093 16, /* rightshift */
1094 1, /* size (0 = byte, 1 = short, 2 = long) */
1096 FALSE
, /* pc_relative */
1098 complain_overflow_signed
, /* complain_on_overflow */
1099 ppc64_elf_unhandled_reloc
, /* special_function */
1100 "R_PPC64_PLTGOT16_HI", /* name */
1101 FALSE
, /* partial_inplace */
1103 0xffff, /* dst_mask */
1104 FALSE
), /* pcrel_offset */
1106 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1107 1 if the contents of the low 16 bits, treated as a signed number,
1109 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1110 HOWTO (R_PPC64_PLTGOT16_HA
, /* type */
1111 16, /* rightshift */
1112 1, /* size (0 = byte, 1 = short, 2 = long) */
1114 FALSE
, /* pc_relative */
1116 complain_overflow_signed
, /* complain_on_overflow */
1117 ppc64_elf_unhandled_reloc
, /* special_function */
1118 "R_PPC64_PLTGOT16_HA", /* name */
1119 FALSE
, /* partial_inplace */
1121 0xffff, /* dst_mask */
1122 FALSE
), /* pcrel_offset */
1124 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1125 HOWTO (R_PPC64_ADDR16_DS
, /* type */
1127 1, /* size (0 = byte, 1 = short, 2 = long) */
1129 FALSE
, /* pc_relative */
1131 complain_overflow_signed
, /* complain_on_overflow */
1132 bfd_elf_generic_reloc
, /* special_function */
1133 "R_PPC64_ADDR16_DS", /* name */
1134 FALSE
, /* partial_inplace */
1136 0xfffc, /* dst_mask */
1137 FALSE
), /* pcrel_offset */
1139 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1140 HOWTO (R_PPC64_ADDR16_LO_DS
, /* type */
1142 1, /* size (0 = byte, 1 = short, 2 = long) */
1144 FALSE
, /* pc_relative */
1146 complain_overflow_dont
,/* complain_on_overflow */
1147 bfd_elf_generic_reloc
, /* special_function */
1148 "R_PPC64_ADDR16_LO_DS",/* name */
1149 FALSE
, /* partial_inplace */
1151 0xfffc, /* dst_mask */
1152 FALSE
), /* pcrel_offset */
1154 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1155 HOWTO (R_PPC64_GOT16_DS
, /* type */
1157 1, /* size (0 = byte, 1 = short, 2 = long) */
1159 FALSE
, /* pc_relative */
1161 complain_overflow_signed
, /* complain_on_overflow */
1162 ppc64_elf_unhandled_reloc
, /* special_function */
1163 "R_PPC64_GOT16_DS", /* name */
1164 FALSE
, /* partial_inplace */
1166 0xfffc, /* dst_mask */
1167 FALSE
), /* pcrel_offset */
1169 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1170 HOWTO (R_PPC64_GOT16_LO_DS
, /* type */
1172 1, /* size (0 = byte, 1 = short, 2 = long) */
1174 FALSE
, /* pc_relative */
1176 complain_overflow_dont
, /* complain_on_overflow */
1177 ppc64_elf_unhandled_reloc
, /* special_function */
1178 "R_PPC64_GOT16_LO_DS", /* name */
1179 FALSE
, /* partial_inplace */
1181 0xfffc, /* dst_mask */
1182 FALSE
), /* pcrel_offset */
1184 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1185 HOWTO (R_PPC64_PLT16_LO_DS
, /* type */
1187 1, /* size (0 = byte, 1 = short, 2 = long) */
1189 FALSE
, /* pc_relative */
1191 complain_overflow_dont
, /* complain_on_overflow */
1192 ppc64_elf_unhandled_reloc
, /* special_function */
1193 "R_PPC64_PLT16_LO_DS", /* name */
1194 FALSE
, /* partial_inplace */
1196 0xfffc, /* dst_mask */
1197 FALSE
), /* pcrel_offset */
1199 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1200 HOWTO (R_PPC64_SECTOFF_DS
, /* type */
1202 1, /* size (0 = byte, 1 = short, 2 = long) */
1204 FALSE
, /* pc_relative */
1206 complain_overflow_signed
, /* complain_on_overflow */
1207 ppc64_elf_sectoff_reloc
, /* special_function */
1208 "R_PPC64_SECTOFF_DS", /* name */
1209 FALSE
, /* partial_inplace */
1211 0xfffc, /* dst_mask */
1212 FALSE
), /* pcrel_offset */
1214 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1215 HOWTO (R_PPC64_SECTOFF_LO_DS
, /* type */
1217 1, /* size (0 = byte, 1 = short, 2 = long) */
1219 FALSE
, /* pc_relative */
1221 complain_overflow_dont
, /* complain_on_overflow */
1222 ppc64_elf_sectoff_reloc
, /* special_function */
1223 "R_PPC64_SECTOFF_LO_DS",/* name */
1224 FALSE
, /* partial_inplace */
1226 0xfffc, /* dst_mask */
1227 FALSE
), /* pcrel_offset */
1229 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1230 HOWTO (R_PPC64_TOC16_DS
, /* type */
1232 1, /* size (0 = byte, 1 = short, 2 = long) */
1234 FALSE
, /* pc_relative */
1236 complain_overflow_signed
, /* complain_on_overflow */
1237 ppc64_elf_toc_reloc
, /* special_function */
1238 "R_PPC64_TOC16_DS", /* name */
1239 FALSE
, /* partial_inplace */
1241 0xfffc, /* dst_mask */
1242 FALSE
), /* pcrel_offset */
1244 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1245 HOWTO (R_PPC64_TOC16_LO_DS
, /* type */
1247 1, /* size (0 = byte, 1 = short, 2 = long) */
1249 FALSE
, /* pc_relative */
1251 complain_overflow_dont
, /* complain_on_overflow */
1252 ppc64_elf_toc_reloc
, /* special_function */
1253 "R_PPC64_TOC16_LO_DS", /* name */
1254 FALSE
, /* partial_inplace */
1256 0xfffc, /* dst_mask */
1257 FALSE
), /* pcrel_offset */
1259 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1260 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1261 HOWTO (R_PPC64_PLTGOT16_DS
, /* type */
1263 1, /* size (0 = byte, 1 = short, 2 = long) */
1265 FALSE
, /* pc_relative */
1267 complain_overflow_signed
, /* complain_on_overflow */
1268 ppc64_elf_unhandled_reloc
, /* special_function */
1269 "R_PPC64_PLTGOT16_DS", /* name */
1270 FALSE
, /* partial_inplace */
1272 0xfffc, /* dst_mask */
1273 FALSE
), /* pcrel_offset */
1275 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1276 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1277 HOWTO (R_PPC64_PLTGOT16_LO_DS
,/* type */
1279 1, /* size (0 = byte, 1 = short, 2 = long) */
1281 FALSE
, /* pc_relative */
1283 complain_overflow_dont
, /* complain_on_overflow */
1284 ppc64_elf_unhandled_reloc
, /* special_function */
1285 "R_PPC64_PLTGOT16_LO_DS",/* name */
1286 FALSE
, /* partial_inplace */
1288 0xfffc, /* dst_mask */
1289 FALSE
), /* pcrel_offset */
1291 /* Marker relocs for TLS. */
1294 2, /* size (0 = byte, 1 = short, 2 = long) */
1296 FALSE
, /* pc_relative */
1298 complain_overflow_dont
, /* complain_on_overflow */
1299 bfd_elf_generic_reloc
, /* special_function */
1300 "R_PPC64_TLS", /* name */
1301 FALSE
, /* partial_inplace */
1304 FALSE
), /* pcrel_offset */
1306 HOWTO (R_PPC64_TLSGD
,
1308 2, /* size (0 = byte, 1 = short, 2 = long) */
1310 FALSE
, /* pc_relative */
1312 complain_overflow_dont
, /* complain_on_overflow */
1313 bfd_elf_generic_reloc
, /* special_function */
1314 "R_PPC64_TLSGD", /* name */
1315 FALSE
, /* partial_inplace */
1318 FALSE
), /* pcrel_offset */
1320 HOWTO (R_PPC64_TLSLD
,
1322 2, /* size (0 = byte, 1 = short, 2 = long) */
1324 FALSE
, /* pc_relative */
1326 complain_overflow_dont
, /* complain_on_overflow */
1327 bfd_elf_generic_reloc
, /* special_function */
1328 "R_PPC64_TLSLD", /* name */
1329 FALSE
, /* partial_inplace */
1332 FALSE
), /* pcrel_offset */
1334 HOWTO (R_PPC64_TOCSAVE
,
1336 2, /* size (0 = byte, 1 = short, 2 = long) */
1338 FALSE
, /* pc_relative */
1340 complain_overflow_dont
, /* complain_on_overflow */
1341 bfd_elf_generic_reloc
, /* special_function */
1342 "R_PPC64_TOCSAVE", /* name */
1343 FALSE
, /* partial_inplace */
1346 FALSE
), /* pcrel_offset */
1348 /* Computes the load module index of the load module that contains the
1349 definition of its TLS sym. */
1350 HOWTO (R_PPC64_DTPMOD64
,
1352 4, /* size (0 = byte, 1 = short, 2 = long) */
1354 FALSE
, /* pc_relative */
1356 complain_overflow_dont
, /* complain_on_overflow */
1357 ppc64_elf_unhandled_reloc
, /* special_function */
1358 "R_PPC64_DTPMOD64", /* name */
1359 FALSE
, /* partial_inplace */
1361 ONES (64), /* dst_mask */
1362 FALSE
), /* pcrel_offset */
1364 /* Computes a dtv-relative displacement, the difference between the value
1365 of sym+add and the base address of the thread-local storage block that
1366 contains the definition of sym, minus 0x8000. */
1367 HOWTO (R_PPC64_DTPREL64
,
1369 4, /* size (0 = byte, 1 = short, 2 = long) */
1371 FALSE
, /* pc_relative */
1373 complain_overflow_dont
, /* complain_on_overflow */
1374 ppc64_elf_unhandled_reloc
, /* special_function */
1375 "R_PPC64_DTPREL64", /* name */
1376 FALSE
, /* partial_inplace */
1378 ONES (64), /* dst_mask */
1379 FALSE
), /* pcrel_offset */
1381 /* A 16 bit dtprel reloc. */
1382 HOWTO (R_PPC64_DTPREL16
,
1384 1, /* size (0 = byte, 1 = short, 2 = long) */
1386 FALSE
, /* pc_relative */
1388 complain_overflow_signed
, /* complain_on_overflow */
1389 ppc64_elf_unhandled_reloc
, /* special_function */
1390 "R_PPC64_DTPREL16", /* name */
1391 FALSE
, /* partial_inplace */
1393 0xffff, /* dst_mask */
1394 FALSE
), /* pcrel_offset */
1396 /* Like DTPREL16, but no overflow. */
1397 HOWTO (R_PPC64_DTPREL16_LO
,
1399 1, /* size (0 = byte, 1 = short, 2 = long) */
1401 FALSE
, /* pc_relative */
1403 complain_overflow_dont
, /* complain_on_overflow */
1404 ppc64_elf_unhandled_reloc
, /* special_function */
1405 "R_PPC64_DTPREL16_LO", /* name */
1406 FALSE
, /* partial_inplace */
1408 0xffff, /* dst_mask */
1409 FALSE
), /* pcrel_offset */
1411 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1412 HOWTO (R_PPC64_DTPREL16_HI
,
1413 16, /* rightshift */
1414 1, /* size (0 = byte, 1 = short, 2 = long) */
1416 FALSE
, /* pc_relative */
1418 complain_overflow_signed
, /* complain_on_overflow */
1419 ppc64_elf_unhandled_reloc
, /* special_function */
1420 "R_PPC64_DTPREL16_HI", /* name */
1421 FALSE
, /* partial_inplace */
1423 0xffff, /* dst_mask */
1424 FALSE
), /* pcrel_offset */
1426 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1427 HOWTO (R_PPC64_DTPREL16_HA
,
1428 16, /* rightshift */
1429 1, /* size (0 = byte, 1 = short, 2 = long) */
1431 FALSE
, /* pc_relative */
1433 complain_overflow_signed
, /* complain_on_overflow */
1434 ppc64_elf_unhandled_reloc
, /* special_function */
1435 "R_PPC64_DTPREL16_HA", /* name */
1436 FALSE
, /* partial_inplace */
1438 0xffff, /* dst_mask */
1439 FALSE
), /* pcrel_offset */
1441 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1442 HOWTO (R_PPC64_DTPREL16_HIGHER
,
1443 32, /* rightshift */
1444 1, /* size (0 = byte, 1 = short, 2 = long) */
1446 FALSE
, /* pc_relative */
1448 complain_overflow_dont
, /* complain_on_overflow */
1449 ppc64_elf_unhandled_reloc
, /* special_function */
1450 "R_PPC64_DTPREL16_HIGHER", /* name */
1451 FALSE
, /* partial_inplace */
1453 0xffff, /* dst_mask */
1454 FALSE
), /* pcrel_offset */
1456 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1457 HOWTO (R_PPC64_DTPREL16_HIGHERA
,
1458 32, /* rightshift */
1459 1, /* size (0 = byte, 1 = short, 2 = long) */
1461 FALSE
, /* pc_relative */
1463 complain_overflow_dont
, /* complain_on_overflow */
1464 ppc64_elf_unhandled_reloc
, /* special_function */
1465 "R_PPC64_DTPREL16_HIGHERA", /* name */
1466 FALSE
, /* partial_inplace */
1468 0xffff, /* dst_mask */
1469 FALSE
), /* pcrel_offset */
1471 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1472 HOWTO (R_PPC64_DTPREL16_HIGHEST
,
1473 48, /* rightshift */
1474 1, /* size (0 = byte, 1 = short, 2 = long) */
1476 FALSE
, /* pc_relative */
1478 complain_overflow_dont
, /* complain_on_overflow */
1479 ppc64_elf_unhandled_reloc
, /* special_function */
1480 "R_PPC64_DTPREL16_HIGHEST", /* name */
1481 FALSE
, /* partial_inplace */
1483 0xffff, /* dst_mask */
1484 FALSE
), /* pcrel_offset */
1486 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1487 HOWTO (R_PPC64_DTPREL16_HIGHESTA
,
1488 48, /* rightshift */
1489 1, /* size (0 = byte, 1 = short, 2 = long) */
1491 FALSE
, /* pc_relative */
1493 complain_overflow_dont
, /* complain_on_overflow */
1494 ppc64_elf_unhandled_reloc
, /* special_function */
1495 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1496 FALSE
, /* partial_inplace */
1498 0xffff, /* dst_mask */
1499 FALSE
), /* pcrel_offset */
1501 /* Like DTPREL16, but for insns with a DS field. */
1502 HOWTO (R_PPC64_DTPREL16_DS
,
1504 1, /* size (0 = byte, 1 = short, 2 = long) */
1506 FALSE
, /* pc_relative */
1508 complain_overflow_signed
, /* complain_on_overflow */
1509 ppc64_elf_unhandled_reloc
, /* special_function */
1510 "R_PPC64_DTPREL16_DS", /* name */
1511 FALSE
, /* partial_inplace */
1513 0xfffc, /* dst_mask */
1514 FALSE
), /* pcrel_offset */
1516 /* Like DTPREL16_DS, but no overflow. */
1517 HOWTO (R_PPC64_DTPREL16_LO_DS
,
1519 1, /* size (0 = byte, 1 = short, 2 = long) */
1521 FALSE
, /* pc_relative */
1523 complain_overflow_dont
, /* complain_on_overflow */
1524 ppc64_elf_unhandled_reloc
, /* special_function */
1525 "R_PPC64_DTPREL16_LO_DS", /* name */
1526 FALSE
, /* partial_inplace */
1528 0xfffc, /* dst_mask */
1529 FALSE
), /* pcrel_offset */
1531 /* Computes a tp-relative displacement, the difference between the value of
1532 sym+add and the value of the thread pointer (r13). */
1533 HOWTO (R_PPC64_TPREL64
,
1535 4, /* size (0 = byte, 1 = short, 2 = long) */
1537 FALSE
, /* pc_relative */
1539 complain_overflow_dont
, /* complain_on_overflow */
1540 ppc64_elf_unhandled_reloc
, /* special_function */
1541 "R_PPC64_TPREL64", /* name */
1542 FALSE
, /* partial_inplace */
1544 ONES (64), /* dst_mask */
1545 FALSE
), /* pcrel_offset */
1547 /* A 16 bit tprel reloc. */
1548 HOWTO (R_PPC64_TPREL16
,
1550 1, /* size (0 = byte, 1 = short, 2 = long) */
1552 FALSE
, /* pc_relative */
1554 complain_overflow_signed
, /* complain_on_overflow */
1555 ppc64_elf_unhandled_reloc
, /* special_function */
1556 "R_PPC64_TPREL16", /* name */
1557 FALSE
, /* partial_inplace */
1559 0xffff, /* dst_mask */
1560 FALSE
), /* pcrel_offset */
1562 /* Like TPREL16, but no overflow. */
1563 HOWTO (R_PPC64_TPREL16_LO
,
1565 1, /* size (0 = byte, 1 = short, 2 = long) */
1567 FALSE
, /* pc_relative */
1569 complain_overflow_dont
, /* complain_on_overflow */
1570 ppc64_elf_unhandled_reloc
, /* special_function */
1571 "R_PPC64_TPREL16_LO", /* name */
1572 FALSE
, /* partial_inplace */
1574 0xffff, /* dst_mask */
1575 FALSE
), /* pcrel_offset */
1577 /* Like TPREL16_LO, but next higher group of 16 bits. */
1578 HOWTO (R_PPC64_TPREL16_HI
,
1579 16, /* rightshift */
1580 1, /* size (0 = byte, 1 = short, 2 = long) */
1582 FALSE
, /* pc_relative */
1584 complain_overflow_signed
, /* complain_on_overflow */
1585 ppc64_elf_unhandled_reloc
, /* special_function */
1586 "R_PPC64_TPREL16_HI", /* name */
1587 FALSE
, /* partial_inplace */
1589 0xffff, /* dst_mask */
1590 FALSE
), /* pcrel_offset */
1592 /* Like TPREL16_HI, but adjust for low 16 bits. */
1593 HOWTO (R_PPC64_TPREL16_HA
,
1594 16, /* rightshift */
1595 1, /* size (0 = byte, 1 = short, 2 = long) */
1597 FALSE
, /* pc_relative */
1599 complain_overflow_signed
, /* complain_on_overflow */
1600 ppc64_elf_unhandled_reloc
, /* special_function */
1601 "R_PPC64_TPREL16_HA", /* name */
1602 FALSE
, /* partial_inplace */
1604 0xffff, /* dst_mask */
1605 FALSE
), /* pcrel_offset */
1607 /* Like TPREL16_HI, but next higher group of 16 bits. */
1608 HOWTO (R_PPC64_TPREL16_HIGHER
,
1609 32, /* rightshift */
1610 1, /* size (0 = byte, 1 = short, 2 = long) */
1612 FALSE
, /* pc_relative */
1614 complain_overflow_dont
, /* complain_on_overflow */
1615 ppc64_elf_unhandled_reloc
, /* special_function */
1616 "R_PPC64_TPREL16_HIGHER", /* name */
1617 FALSE
, /* partial_inplace */
1619 0xffff, /* dst_mask */
1620 FALSE
), /* pcrel_offset */
1622 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1623 HOWTO (R_PPC64_TPREL16_HIGHERA
,
1624 32, /* rightshift */
1625 1, /* size (0 = byte, 1 = short, 2 = long) */
1627 FALSE
, /* pc_relative */
1629 complain_overflow_dont
, /* complain_on_overflow */
1630 ppc64_elf_unhandled_reloc
, /* special_function */
1631 "R_PPC64_TPREL16_HIGHERA", /* name */
1632 FALSE
, /* partial_inplace */
1634 0xffff, /* dst_mask */
1635 FALSE
), /* pcrel_offset */
1637 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1638 HOWTO (R_PPC64_TPREL16_HIGHEST
,
1639 48, /* rightshift */
1640 1, /* size (0 = byte, 1 = short, 2 = long) */
1642 FALSE
, /* pc_relative */
1644 complain_overflow_dont
, /* complain_on_overflow */
1645 ppc64_elf_unhandled_reloc
, /* special_function */
1646 "R_PPC64_TPREL16_HIGHEST", /* name */
1647 FALSE
, /* partial_inplace */
1649 0xffff, /* dst_mask */
1650 FALSE
), /* pcrel_offset */
1652 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1653 HOWTO (R_PPC64_TPREL16_HIGHESTA
,
1654 48, /* rightshift */
1655 1, /* size (0 = byte, 1 = short, 2 = long) */
1657 FALSE
, /* pc_relative */
1659 complain_overflow_dont
, /* complain_on_overflow */
1660 ppc64_elf_unhandled_reloc
, /* special_function */
1661 "R_PPC64_TPREL16_HIGHESTA", /* name */
1662 FALSE
, /* partial_inplace */
1664 0xffff, /* dst_mask */
1665 FALSE
), /* pcrel_offset */
1667 /* Like TPREL16, but for insns with a DS field. */
1668 HOWTO (R_PPC64_TPREL16_DS
,
1670 1, /* size (0 = byte, 1 = short, 2 = long) */
1672 FALSE
, /* pc_relative */
1674 complain_overflow_signed
, /* complain_on_overflow */
1675 ppc64_elf_unhandled_reloc
, /* special_function */
1676 "R_PPC64_TPREL16_DS", /* name */
1677 FALSE
, /* partial_inplace */
1679 0xfffc, /* dst_mask */
1680 FALSE
), /* pcrel_offset */
1682 /* Like TPREL16_DS, but no overflow. */
1683 HOWTO (R_PPC64_TPREL16_LO_DS
,
1685 1, /* size (0 = byte, 1 = short, 2 = long) */
1687 FALSE
, /* pc_relative */
1689 complain_overflow_dont
, /* complain_on_overflow */
1690 ppc64_elf_unhandled_reloc
, /* special_function */
1691 "R_PPC64_TPREL16_LO_DS", /* name */
1692 FALSE
, /* partial_inplace */
1694 0xfffc, /* dst_mask */
1695 FALSE
), /* pcrel_offset */
1697 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1698 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1699 to the first entry relative to the TOC base (r2). */
1700 HOWTO (R_PPC64_GOT_TLSGD16
,
1702 1, /* size (0 = byte, 1 = short, 2 = long) */
1704 FALSE
, /* pc_relative */
1706 complain_overflow_signed
, /* complain_on_overflow */
1707 ppc64_elf_unhandled_reloc
, /* special_function */
1708 "R_PPC64_GOT_TLSGD16", /* name */
1709 FALSE
, /* partial_inplace */
1711 0xffff, /* dst_mask */
1712 FALSE
), /* pcrel_offset */
1714 /* Like GOT_TLSGD16, but no overflow. */
1715 HOWTO (R_PPC64_GOT_TLSGD16_LO
,
1717 1, /* size (0 = byte, 1 = short, 2 = long) */
1719 FALSE
, /* pc_relative */
1721 complain_overflow_dont
, /* complain_on_overflow */
1722 ppc64_elf_unhandled_reloc
, /* special_function */
1723 "R_PPC64_GOT_TLSGD16_LO", /* name */
1724 FALSE
, /* partial_inplace */
1726 0xffff, /* dst_mask */
1727 FALSE
), /* pcrel_offset */
1729 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1730 HOWTO (R_PPC64_GOT_TLSGD16_HI
,
1731 16, /* rightshift */
1732 1, /* size (0 = byte, 1 = short, 2 = long) */
1734 FALSE
, /* pc_relative */
1736 complain_overflow_signed
, /* complain_on_overflow */
1737 ppc64_elf_unhandled_reloc
, /* special_function */
1738 "R_PPC64_GOT_TLSGD16_HI", /* name */
1739 FALSE
, /* partial_inplace */
1741 0xffff, /* dst_mask */
1742 FALSE
), /* pcrel_offset */
1744 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1745 HOWTO (R_PPC64_GOT_TLSGD16_HA
,
1746 16, /* rightshift */
1747 1, /* size (0 = byte, 1 = short, 2 = long) */
1749 FALSE
, /* pc_relative */
1751 complain_overflow_signed
, /* complain_on_overflow */
1752 ppc64_elf_unhandled_reloc
, /* special_function */
1753 "R_PPC64_GOT_TLSGD16_HA", /* name */
1754 FALSE
, /* partial_inplace */
1756 0xffff, /* dst_mask */
1757 FALSE
), /* pcrel_offset */
1759 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1760 with values (sym+add)@dtpmod and zero, and computes the offset to the
1761 first entry relative to the TOC base (r2). */
1762 HOWTO (R_PPC64_GOT_TLSLD16
,
1764 1, /* size (0 = byte, 1 = short, 2 = long) */
1766 FALSE
, /* pc_relative */
1768 complain_overflow_signed
, /* complain_on_overflow */
1769 ppc64_elf_unhandled_reloc
, /* special_function */
1770 "R_PPC64_GOT_TLSLD16", /* name */
1771 FALSE
, /* partial_inplace */
1773 0xffff, /* dst_mask */
1774 FALSE
), /* pcrel_offset */
1776 /* Like GOT_TLSLD16, but no overflow. */
1777 HOWTO (R_PPC64_GOT_TLSLD16_LO
,
1779 1, /* size (0 = byte, 1 = short, 2 = long) */
1781 FALSE
, /* pc_relative */
1783 complain_overflow_dont
, /* complain_on_overflow */
1784 ppc64_elf_unhandled_reloc
, /* special_function */
1785 "R_PPC64_GOT_TLSLD16_LO", /* name */
1786 FALSE
, /* partial_inplace */
1788 0xffff, /* dst_mask */
1789 FALSE
), /* pcrel_offset */
1791 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1792 HOWTO (R_PPC64_GOT_TLSLD16_HI
,
1793 16, /* rightshift */
1794 1, /* size (0 = byte, 1 = short, 2 = long) */
1796 FALSE
, /* pc_relative */
1798 complain_overflow_signed
, /* complain_on_overflow */
1799 ppc64_elf_unhandled_reloc
, /* special_function */
1800 "R_PPC64_GOT_TLSLD16_HI", /* name */
1801 FALSE
, /* partial_inplace */
1803 0xffff, /* dst_mask */
1804 FALSE
), /* pcrel_offset */
1806 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1807 HOWTO (R_PPC64_GOT_TLSLD16_HA
,
1808 16, /* rightshift */
1809 1, /* size (0 = byte, 1 = short, 2 = long) */
1811 FALSE
, /* pc_relative */
1813 complain_overflow_signed
, /* complain_on_overflow */
1814 ppc64_elf_unhandled_reloc
, /* special_function */
1815 "R_PPC64_GOT_TLSLD16_HA", /* name */
1816 FALSE
, /* partial_inplace */
1818 0xffff, /* dst_mask */
1819 FALSE
), /* pcrel_offset */
1821 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1822 the offset to the entry relative to the TOC base (r2). */
1823 HOWTO (R_PPC64_GOT_DTPREL16_DS
,
1825 1, /* size (0 = byte, 1 = short, 2 = long) */
1827 FALSE
, /* pc_relative */
1829 complain_overflow_signed
, /* complain_on_overflow */
1830 ppc64_elf_unhandled_reloc
, /* special_function */
1831 "R_PPC64_GOT_DTPREL16_DS", /* name */
1832 FALSE
, /* partial_inplace */
1834 0xfffc, /* dst_mask */
1835 FALSE
), /* pcrel_offset */
1837 /* Like GOT_DTPREL16_DS, but no overflow. */
1838 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS
,
1840 1, /* size (0 = byte, 1 = short, 2 = long) */
1842 FALSE
, /* pc_relative */
1844 complain_overflow_dont
, /* complain_on_overflow */
1845 ppc64_elf_unhandled_reloc
, /* special_function */
1846 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1847 FALSE
, /* partial_inplace */
1849 0xfffc, /* dst_mask */
1850 FALSE
), /* pcrel_offset */
1852 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1853 HOWTO (R_PPC64_GOT_DTPREL16_HI
,
1854 16, /* rightshift */
1855 1, /* size (0 = byte, 1 = short, 2 = long) */
1857 FALSE
, /* pc_relative */
1859 complain_overflow_signed
, /* complain_on_overflow */
1860 ppc64_elf_unhandled_reloc
, /* special_function */
1861 "R_PPC64_GOT_DTPREL16_HI", /* name */
1862 FALSE
, /* partial_inplace */
1864 0xffff, /* dst_mask */
1865 FALSE
), /* pcrel_offset */
1867 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1868 HOWTO (R_PPC64_GOT_DTPREL16_HA
,
1869 16, /* rightshift */
1870 1, /* size (0 = byte, 1 = short, 2 = long) */
1872 FALSE
, /* pc_relative */
1874 complain_overflow_signed
, /* complain_on_overflow */
1875 ppc64_elf_unhandled_reloc
, /* special_function */
1876 "R_PPC64_GOT_DTPREL16_HA", /* name */
1877 FALSE
, /* partial_inplace */
1879 0xffff, /* dst_mask */
1880 FALSE
), /* pcrel_offset */
1882 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1883 offset to the entry relative to the TOC base (r2). */
1884 HOWTO (R_PPC64_GOT_TPREL16_DS
,
1886 1, /* size (0 = byte, 1 = short, 2 = long) */
1888 FALSE
, /* pc_relative */
1890 complain_overflow_signed
, /* complain_on_overflow */
1891 ppc64_elf_unhandled_reloc
, /* special_function */
1892 "R_PPC64_GOT_TPREL16_DS", /* name */
1893 FALSE
, /* partial_inplace */
1895 0xfffc, /* dst_mask */
1896 FALSE
), /* pcrel_offset */
1898 /* Like GOT_TPREL16_DS, but no overflow. */
1899 HOWTO (R_PPC64_GOT_TPREL16_LO_DS
,
1901 1, /* size (0 = byte, 1 = short, 2 = long) */
1903 FALSE
, /* pc_relative */
1905 complain_overflow_dont
, /* complain_on_overflow */
1906 ppc64_elf_unhandled_reloc
, /* special_function */
1907 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1908 FALSE
, /* partial_inplace */
1910 0xfffc, /* dst_mask */
1911 FALSE
), /* pcrel_offset */
1913 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1914 HOWTO (R_PPC64_GOT_TPREL16_HI
,
1915 16, /* rightshift */
1916 1, /* size (0 = byte, 1 = short, 2 = long) */
1918 FALSE
, /* pc_relative */
1920 complain_overflow_signed
, /* complain_on_overflow */
1921 ppc64_elf_unhandled_reloc
, /* special_function */
1922 "R_PPC64_GOT_TPREL16_HI", /* name */
1923 FALSE
, /* partial_inplace */
1925 0xffff, /* dst_mask */
1926 FALSE
), /* pcrel_offset */
1928 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1929 HOWTO (R_PPC64_GOT_TPREL16_HA
,
1930 16, /* rightshift */
1931 1, /* size (0 = byte, 1 = short, 2 = long) */
1933 FALSE
, /* pc_relative */
1935 complain_overflow_signed
, /* complain_on_overflow */
1936 ppc64_elf_unhandled_reloc
, /* special_function */
1937 "R_PPC64_GOT_TPREL16_HA", /* name */
1938 FALSE
, /* partial_inplace */
1940 0xffff, /* dst_mask */
1941 FALSE
), /* pcrel_offset */
1943 HOWTO (R_PPC64_JMP_IREL
, /* type */
1945 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1947 FALSE
, /* pc_relative */
1949 complain_overflow_dont
, /* complain_on_overflow */
1950 ppc64_elf_unhandled_reloc
, /* special_function */
1951 "R_PPC64_JMP_IREL", /* name */
1952 FALSE
, /* partial_inplace */
1955 FALSE
), /* pcrel_offset */
1957 HOWTO (R_PPC64_IRELATIVE
, /* type */
1959 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1961 FALSE
, /* pc_relative */
1963 complain_overflow_dont
, /* complain_on_overflow */
1964 bfd_elf_generic_reloc
, /* special_function */
1965 "R_PPC64_IRELATIVE", /* name */
1966 FALSE
, /* partial_inplace */
1968 ONES (64), /* dst_mask */
1969 FALSE
), /* pcrel_offset */
1971 /* A 16 bit relative relocation. */
1972 HOWTO (R_PPC64_REL16
, /* type */
1974 1, /* size (0 = byte, 1 = short, 2 = long) */
1976 TRUE
, /* pc_relative */
1978 complain_overflow_signed
, /* complain_on_overflow */
1979 bfd_elf_generic_reloc
, /* special_function */
1980 "R_PPC64_REL16", /* name */
1981 FALSE
, /* partial_inplace */
1983 0xffff, /* dst_mask */
1984 TRUE
), /* pcrel_offset */
1986 /* A 16 bit relative relocation without overflow. */
1987 HOWTO (R_PPC64_REL16_LO
, /* type */
1989 1, /* size (0 = byte, 1 = short, 2 = long) */
1991 TRUE
, /* pc_relative */
1993 complain_overflow_dont
,/* complain_on_overflow */
1994 bfd_elf_generic_reloc
, /* special_function */
1995 "R_PPC64_REL16_LO", /* name */
1996 FALSE
, /* partial_inplace */
1998 0xffff, /* dst_mask */
1999 TRUE
), /* pcrel_offset */
2001 /* The high order 16 bits of a relative address. */
2002 HOWTO (R_PPC64_REL16_HI
, /* type */
2003 16, /* rightshift */
2004 1, /* size (0 = byte, 1 = short, 2 = long) */
2006 TRUE
, /* pc_relative */
2008 complain_overflow_signed
, /* complain_on_overflow */
2009 bfd_elf_generic_reloc
, /* special_function */
2010 "R_PPC64_REL16_HI", /* name */
2011 FALSE
, /* partial_inplace */
2013 0xffff, /* dst_mask */
2014 TRUE
), /* pcrel_offset */
2016 /* The high order 16 bits of a relative address, plus 1 if the contents of
2017 the low 16 bits, treated as a signed number, is negative. */
2018 HOWTO (R_PPC64_REL16_HA
, /* type */
2019 16, /* rightshift */
2020 1, /* size (0 = byte, 1 = short, 2 = long) */
2022 TRUE
, /* pc_relative */
2024 complain_overflow_signed
, /* complain_on_overflow */
2025 ppc64_elf_ha_reloc
, /* special_function */
2026 "R_PPC64_REL16_HA", /* name */
2027 FALSE
, /* partial_inplace */
2029 0xffff, /* dst_mask */
2030 TRUE
), /* pcrel_offset */
2032 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
2033 HOWTO (R_PPC64_REL16DX_HA
, /* type */
2034 16, /* rightshift */
2035 2, /* size (0 = byte, 1 = short, 2 = long) */
2037 TRUE
, /* pc_relative */
2039 complain_overflow_signed
, /* complain_on_overflow */
2040 ppc64_elf_ha_reloc
, /* special_function */
2041 "R_PPC64_REL16DX_HA", /* name */
2042 FALSE
, /* partial_inplace */
2044 0x1fffc1, /* dst_mask */
2045 TRUE
), /* pcrel_offset */
2047 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2048 HOWTO (R_PPC64_ADDR16_HIGH
, /* type */
2049 16, /* rightshift */
2050 1, /* size (0 = byte, 1 = short, 2 = long) */
2052 FALSE
, /* pc_relative */
2054 complain_overflow_dont
, /* complain_on_overflow */
2055 bfd_elf_generic_reloc
, /* special_function */
2056 "R_PPC64_ADDR16_HIGH", /* name */
2057 FALSE
, /* partial_inplace */
2059 0xffff, /* dst_mask */
2060 FALSE
), /* pcrel_offset */
2062 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2063 HOWTO (R_PPC64_ADDR16_HIGHA
, /* type */
2064 16, /* rightshift */
2065 1, /* size (0 = byte, 1 = short, 2 = long) */
2067 FALSE
, /* pc_relative */
2069 complain_overflow_dont
, /* complain_on_overflow */
2070 ppc64_elf_ha_reloc
, /* special_function */
2071 "R_PPC64_ADDR16_HIGHA", /* name */
2072 FALSE
, /* partial_inplace */
2074 0xffff, /* dst_mask */
2075 FALSE
), /* pcrel_offset */
2077 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2078 HOWTO (R_PPC64_DTPREL16_HIGH
,
2079 16, /* rightshift */
2080 1, /* size (0 = byte, 1 = short, 2 = long) */
2082 FALSE
, /* pc_relative */
2084 complain_overflow_dont
, /* complain_on_overflow */
2085 ppc64_elf_unhandled_reloc
, /* special_function */
2086 "R_PPC64_DTPREL16_HIGH", /* name */
2087 FALSE
, /* partial_inplace */
2089 0xffff, /* dst_mask */
2090 FALSE
), /* pcrel_offset */
2092 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2093 HOWTO (R_PPC64_DTPREL16_HIGHA
,
2094 16, /* rightshift */
2095 1, /* size (0 = byte, 1 = short, 2 = long) */
2097 FALSE
, /* pc_relative */
2099 complain_overflow_dont
, /* complain_on_overflow */
2100 ppc64_elf_unhandled_reloc
, /* special_function */
2101 "R_PPC64_DTPREL16_HIGHA", /* name */
2102 FALSE
, /* partial_inplace */
2104 0xffff, /* dst_mask */
2105 FALSE
), /* pcrel_offset */
2107 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2108 HOWTO (R_PPC64_TPREL16_HIGH
,
2109 16, /* rightshift */
2110 1, /* size (0 = byte, 1 = short, 2 = long) */
2112 FALSE
, /* pc_relative */
2114 complain_overflow_dont
, /* complain_on_overflow */
2115 ppc64_elf_unhandled_reloc
, /* special_function */
2116 "R_PPC64_TPREL16_HIGH", /* name */
2117 FALSE
, /* partial_inplace */
2119 0xffff, /* dst_mask */
2120 FALSE
), /* pcrel_offset */
2122 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2123 HOWTO (R_PPC64_TPREL16_HIGHA
,
2124 16, /* rightshift */
2125 1, /* size (0 = byte, 1 = short, 2 = long) */
2127 FALSE
, /* pc_relative */
2129 complain_overflow_dont
, /* complain_on_overflow */
2130 ppc64_elf_unhandled_reloc
, /* special_function */
2131 "R_PPC64_TPREL16_HIGHA", /* name */
2132 FALSE
, /* partial_inplace */
2134 0xffff, /* dst_mask */
2135 FALSE
), /* pcrel_offset */
2137 /* Marker reloc on ELFv2 large-model function entry. */
2138 HOWTO (R_PPC64_ENTRY
,
2140 2, /* size (0 = byte, 1 = short, 2 = long) */
2142 FALSE
, /* pc_relative */
2144 complain_overflow_dont
, /* complain_on_overflow */
2145 bfd_elf_generic_reloc
, /* special_function */
2146 "R_PPC64_ENTRY", /* name */
2147 FALSE
, /* partial_inplace */
2150 FALSE
), /* pcrel_offset */
2152 /* Like ADDR64, but use local entry point of function. */
2153 HOWTO (R_PPC64_ADDR64_LOCAL
, /* type */
2155 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2157 FALSE
, /* pc_relative */
2159 complain_overflow_dont
, /* complain_on_overflow */
2160 bfd_elf_generic_reloc
, /* special_function */
2161 "R_PPC64_ADDR64_LOCAL", /* name */
2162 FALSE
, /* partial_inplace */
2164 ONES (64), /* dst_mask */
2165 FALSE
), /* pcrel_offset */
2167 /* GNU extension to record C++ vtable hierarchy. */
2168 HOWTO (R_PPC64_GNU_VTINHERIT
, /* type */
2170 0, /* size (0 = byte, 1 = short, 2 = long) */
2172 FALSE
, /* pc_relative */
2174 complain_overflow_dont
, /* complain_on_overflow */
2175 NULL
, /* special_function */
2176 "R_PPC64_GNU_VTINHERIT", /* name */
2177 FALSE
, /* partial_inplace */
2180 FALSE
), /* pcrel_offset */
2182 /* GNU extension to record C++ vtable member usage. */
2183 HOWTO (R_PPC64_GNU_VTENTRY
, /* type */
2185 0, /* size (0 = byte, 1 = short, 2 = long) */
2187 FALSE
, /* pc_relative */
2189 complain_overflow_dont
, /* complain_on_overflow */
2190 NULL
, /* special_function */
2191 "R_PPC64_GNU_VTENTRY", /* name */
2192 FALSE
, /* partial_inplace */
2195 FALSE
), /* pcrel_offset */
2199 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2203 ppc_howto_init (void)
2205 unsigned int i
, type
;
2207 for (i
= 0; i
< ARRAY_SIZE (ppc64_elf_howto_raw
); i
++)
2209 type
= ppc64_elf_howto_raw
[i
].type
;
2210 BFD_ASSERT (type
< ARRAY_SIZE (ppc64_elf_howto_table
));
2211 ppc64_elf_howto_table
[type
] = &ppc64_elf_howto_raw
[i
];
2215 static reloc_howto_type
*
2216 ppc64_elf_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
2217 bfd_reloc_code_real_type code
)
2219 enum elf_ppc64_reloc_type r
= R_PPC64_NONE
;
2221 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
2222 /* Initialize howto table if needed. */
2230 case BFD_RELOC_NONE
: r
= R_PPC64_NONE
;
2232 case BFD_RELOC_32
: r
= R_PPC64_ADDR32
;
2234 case BFD_RELOC_PPC_BA26
: r
= R_PPC64_ADDR24
;
2236 case BFD_RELOC_16
: r
= R_PPC64_ADDR16
;
2238 case BFD_RELOC_LO16
: r
= R_PPC64_ADDR16_LO
;
2240 case BFD_RELOC_HI16
: r
= R_PPC64_ADDR16_HI
;
2242 case BFD_RELOC_PPC64_ADDR16_HIGH
: r
= R_PPC64_ADDR16_HIGH
;
2244 case BFD_RELOC_HI16_S
: r
= R_PPC64_ADDR16_HA
;
2246 case BFD_RELOC_PPC64_ADDR16_HIGHA
: r
= R_PPC64_ADDR16_HIGHA
;
2248 case BFD_RELOC_PPC_BA16
: r
= R_PPC64_ADDR14
;
2250 case BFD_RELOC_PPC_BA16_BRTAKEN
: r
= R_PPC64_ADDR14_BRTAKEN
;
2252 case BFD_RELOC_PPC_BA16_BRNTAKEN
: r
= R_PPC64_ADDR14_BRNTAKEN
;
2254 case BFD_RELOC_PPC_B26
: r
= R_PPC64_REL24
;
2256 case BFD_RELOC_PPC_B16
: r
= R_PPC64_REL14
;
2258 case BFD_RELOC_PPC_B16_BRTAKEN
: r
= R_PPC64_REL14_BRTAKEN
;
2260 case BFD_RELOC_PPC_B16_BRNTAKEN
: r
= R_PPC64_REL14_BRNTAKEN
;
2262 case BFD_RELOC_16_GOTOFF
: r
= R_PPC64_GOT16
;
2264 case BFD_RELOC_LO16_GOTOFF
: r
= R_PPC64_GOT16_LO
;
2266 case BFD_RELOC_HI16_GOTOFF
: r
= R_PPC64_GOT16_HI
;
2268 case BFD_RELOC_HI16_S_GOTOFF
: r
= R_PPC64_GOT16_HA
;
2270 case BFD_RELOC_PPC_COPY
: r
= R_PPC64_COPY
;
2272 case BFD_RELOC_PPC_GLOB_DAT
: r
= R_PPC64_GLOB_DAT
;
2274 case BFD_RELOC_32_PCREL
: r
= R_PPC64_REL32
;
2276 case BFD_RELOC_32_PLTOFF
: r
= R_PPC64_PLT32
;
2278 case BFD_RELOC_32_PLT_PCREL
: r
= R_PPC64_PLTREL32
;
2280 case BFD_RELOC_LO16_PLTOFF
: r
= R_PPC64_PLT16_LO
;
2282 case BFD_RELOC_HI16_PLTOFF
: r
= R_PPC64_PLT16_HI
;
2284 case BFD_RELOC_HI16_S_PLTOFF
: r
= R_PPC64_PLT16_HA
;
2286 case BFD_RELOC_16_BASEREL
: r
= R_PPC64_SECTOFF
;
2288 case BFD_RELOC_LO16_BASEREL
: r
= R_PPC64_SECTOFF_LO
;
2290 case BFD_RELOC_HI16_BASEREL
: r
= R_PPC64_SECTOFF_HI
;
2292 case BFD_RELOC_HI16_S_BASEREL
: r
= R_PPC64_SECTOFF_HA
;
2294 case BFD_RELOC_CTOR
: r
= R_PPC64_ADDR64
;
2296 case BFD_RELOC_64
: r
= R_PPC64_ADDR64
;
2298 case BFD_RELOC_PPC64_HIGHER
: r
= R_PPC64_ADDR16_HIGHER
;
2300 case BFD_RELOC_PPC64_HIGHER_S
: r
= R_PPC64_ADDR16_HIGHERA
;
2302 case BFD_RELOC_PPC64_HIGHEST
: r
= R_PPC64_ADDR16_HIGHEST
;
2304 case BFD_RELOC_PPC64_HIGHEST_S
: r
= R_PPC64_ADDR16_HIGHESTA
;
2306 case BFD_RELOC_64_PCREL
: r
= R_PPC64_REL64
;
2308 case BFD_RELOC_64_PLTOFF
: r
= R_PPC64_PLT64
;
2310 case BFD_RELOC_64_PLT_PCREL
: r
= R_PPC64_PLTREL64
;
2312 case BFD_RELOC_PPC_TOC16
: r
= R_PPC64_TOC16
;
2314 case BFD_RELOC_PPC64_TOC16_LO
: r
= R_PPC64_TOC16_LO
;
2316 case BFD_RELOC_PPC64_TOC16_HI
: r
= R_PPC64_TOC16_HI
;
2318 case BFD_RELOC_PPC64_TOC16_HA
: r
= R_PPC64_TOC16_HA
;
2320 case BFD_RELOC_PPC64_TOC
: r
= R_PPC64_TOC
;
2322 case BFD_RELOC_PPC64_PLTGOT16
: r
= R_PPC64_PLTGOT16
;
2324 case BFD_RELOC_PPC64_PLTGOT16_LO
: r
= R_PPC64_PLTGOT16_LO
;
2326 case BFD_RELOC_PPC64_PLTGOT16_HI
: r
= R_PPC64_PLTGOT16_HI
;
2328 case BFD_RELOC_PPC64_PLTGOT16_HA
: r
= R_PPC64_PLTGOT16_HA
;
2330 case BFD_RELOC_PPC64_ADDR16_DS
: r
= R_PPC64_ADDR16_DS
;
2332 case BFD_RELOC_PPC64_ADDR16_LO_DS
: r
= R_PPC64_ADDR16_LO_DS
;
2334 case BFD_RELOC_PPC64_GOT16_DS
: r
= R_PPC64_GOT16_DS
;
2336 case BFD_RELOC_PPC64_GOT16_LO_DS
: r
= R_PPC64_GOT16_LO_DS
;
2338 case BFD_RELOC_PPC64_PLT16_LO_DS
: r
= R_PPC64_PLT16_LO_DS
;
2340 case BFD_RELOC_PPC64_SECTOFF_DS
: r
= R_PPC64_SECTOFF_DS
;
2342 case BFD_RELOC_PPC64_SECTOFF_LO_DS
: r
= R_PPC64_SECTOFF_LO_DS
;
2344 case BFD_RELOC_PPC64_TOC16_DS
: r
= R_PPC64_TOC16_DS
;
2346 case BFD_RELOC_PPC64_TOC16_LO_DS
: r
= R_PPC64_TOC16_LO_DS
;
2348 case BFD_RELOC_PPC64_PLTGOT16_DS
: r
= R_PPC64_PLTGOT16_DS
;
2350 case BFD_RELOC_PPC64_PLTGOT16_LO_DS
: r
= R_PPC64_PLTGOT16_LO_DS
;
2352 case BFD_RELOC_PPC_TLS
: r
= R_PPC64_TLS
;
2354 case BFD_RELOC_PPC_TLSGD
: r
= R_PPC64_TLSGD
;
2356 case BFD_RELOC_PPC_TLSLD
: r
= R_PPC64_TLSLD
;
2358 case BFD_RELOC_PPC_DTPMOD
: r
= R_PPC64_DTPMOD64
;
2360 case BFD_RELOC_PPC_TPREL16
: r
= R_PPC64_TPREL16
;
2362 case BFD_RELOC_PPC_TPREL16_LO
: r
= R_PPC64_TPREL16_LO
;
2364 case BFD_RELOC_PPC_TPREL16_HI
: r
= R_PPC64_TPREL16_HI
;
2366 case BFD_RELOC_PPC64_TPREL16_HIGH
: r
= R_PPC64_TPREL16_HIGH
;
2368 case BFD_RELOC_PPC_TPREL16_HA
: r
= R_PPC64_TPREL16_HA
;
2370 case BFD_RELOC_PPC64_TPREL16_HIGHA
: r
= R_PPC64_TPREL16_HIGHA
;
2372 case BFD_RELOC_PPC_TPREL
: r
= R_PPC64_TPREL64
;
2374 case BFD_RELOC_PPC_DTPREL16
: r
= R_PPC64_DTPREL16
;
2376 case BFD_RELOC_PPC_DTPREL16_LO
: r
= R_PPC64_DTPREL16_LO
;
2378 case BFD_RELOC_PPC_DTPREL16_HI
: r
= R_PPC64_DTPREL16_HI
;
2380 case BFD_RELOC_PPC64_DTPREL16_HIGH
: r
= R_PPC64_DTPREL16_HIGH
;
2382 case BFD_RELOC_PPC_DTPREL16_HA
: r
= R_PPC64_DTPREL16_HA
;
2384 case BFD_RELOC_PPC64_DTPREL16_HIGHA
: r
= R_PPC64_DTPREL16_HIGHA
;
2386 case BFD_RELOC_PPC_DTPREL
: r
= R_PPC64_DTPREL64
;
2388 case BFD_RELOC_PPC_GOT_TLSGD16
: r
= R_PPC64_GOT_TLSGD16
;
2390 case BFD_RELOC_PPC_GOT_TLSGD16_LO
: r
= R_PPC64_GOT_TLSGD16_LO
;
2392 case BFD_RELOC_PPC_GOT_TLSGD16_HI
: r
= R_PPC64_GOT_TLSGD16_HI
;
2394 case BFD_RELOC_PPC_GOT_TLSGD16_HA
: r
= R_PPC64_GOT_TLSGD16_HA
;
2396 case BFD_RELOC_PPC_GOT_TLSLD16
: r
= R_PPC64_GOT_TLSLD16
;
2398 case BFD_RELOC_PPC_GOT_TLSLD16_LO
: r
= R_PPC64_GOT_TLSLD16_LO
;
2400 case BFD_RELOC_PPC_GOT_TLSLD16_HI
: r
= R_PPC64_GOT_TLSLD16_HI
;
2402 case BFD_RELOC_PPC_GOT_TLSLD16_HA
: r
= R_PPC64_GOT_TLSLD16_HA
;
2404 case BFD_RELOC_PPC_GOT_TPREL16
: r
= R_PPC64_GOT_TPREL16_DS
;
2406 case BFD_RELOC_PPC_GOT_TPREL16_LO
: r
= R_PPC64_GOT_TPREL16_LO_DS
;
2408 case BFD_RELOC_PPC_GOT_TPREL16_HI
: r
= R_PPC64_GOT_TPREL16_HI
;
2410 case BFD_RELOC_PPC_GOT_TPREL16_HA
: r
= R_PPC64_GOT_TPREL16_HA
;
2412 case BFD_RELOC_PPC_GOT_DTPREL16
: r
= R_PPC64_GOT_DTPREL16_DS
;
2414 case BFD_RELOC_PPC_GOT_DTPREL16_LO
: r
= R_PPC64_GOT_DTPREL16_LO_DS
;
2416 case BFD_RELOC_PPC_GOT_DTPREL16_HI
: r
= R_PPC64_GOT_DTPREL16_HI
;
2418 case BFD_RELOC_PPC_GOT_DTPREL16_HA
: r
= R_PPC64_GOT_DTPREL16_HA
;
2420 case BFD_RELOC_PPC64_TPREL16_DS
: r
= R_PPC64_TPREL16_DS
;
2422 case BFD_RELOC_PPC64_TPREL16_LO_DS
: r
= R_PPC64_TPREL16_LO_DS
;
2424 case BFD_RELOC_PPC64_TPREL16_HIGHER
: r
= R_PPC64_TPREL16_HIGHER
;
2426 case BFD_RELOC_PPC64_TPREL16_HIGHERA
: r
= R_PPC64_TPREL16_HIGHERA
;
2428 case BFD_RELOC_PPC64_TPREL16_HIGHEST
: r
= R_PPC64_TPREL16_HIGHEST
;
2430 case BFD_RELOC_PPC64_TPREL16_HIGHESTA
: r
= R_PPC64_TPREL16_HIGHESTA
;
2432 case BFD_RELOC_PPC64_DTPREL16_DS
: r
= R_PPC64_DTPREL16_DS
;
2434 case BFD_RELOC_PPC64_DTPREL16_LO_DS
: r
= R_PPC64_DTPREL16_LO_DS
;
2436 case BFD_RELOC_PPC64_DTPREL16_HIGHER
: r
= R_PPC64_DTPREL16_HIGHER
;
2438 case BFD_RELOC_PPC64_DTPREL16_HIGHERA
: r
= R_PPC64_DTPREL16_HIGHERA
;
2440 case BFD_RELOC_PPC64_DTPREL16_HIGHEST
: r
= R_PPC64_DTPREL16_HIGHEST
;
2442 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA
: r
= R_PPC64_DTPREL16_HIGHESTA
;
2444 case BFD_RELOC_16_PCREL
: r
= R_PPC64_REL16
;
2446 case BFD_RELOC_LO16_PCREL
: r
= R_PPC64_REL16_LO
;
2448 case BFD_RELOC_HI16_PCREL
: r
= R_PPC64_REL16_HI
;
2450 case BFD_RELOC_HI16_S_PCREL
: r
= R_PPC64_REL16_HA
;
2452 case BFD_RELOC_PPC_REL16DX_HA
: r
= R_PPC64_REL16DX_HA
;
2454 case BFD_RELOC_PPC64_ENTRY
: r
= R_PPC64_ENTRY
;
2456 case BFD_RELOC_PPC64_ADDR64_LOCAL
: r
= R_PPC64_ADDR64_LOCAL
;
2458 case BFD_RELOC_VTABLE_INHERIT
: r
= R_PPC64_GNU_VTINHERIT
;
2460 case BFD_RELOC_VTABLE_ENTRY
: r
= R_PPC64_GNU_VTENTRY
;
2464 return ppc64_elf_howto_table
[r
];
2467 static reloc_howto_type
*
2468 ppc64_elf_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
2473 for (i
= 0; i
< ARRAY_SIZE (ppc64_elf_howto_raw
); i
++)
2474 if (ppc64_elf_howto_raw
[i
].name
!= NULL
2475 && strcasecmp (ppc64_elf_howto_raw
[i
].name
, r_name
) == 0)
2476 return &ppc64_elf_howto_raw
[i
];
2481 /* Set the howto pointer for a PowerPC ELF reloc. */
2484 ppc64_elf_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
2485 Elf_Internal_Rela
*dst
)
2489 /* Initialize howto table if needed. */
2490 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
2493 type
= ELF64_R_TYPE (dst
->r_info
);
2494 if (type
>= ARRAY_SIZE (ppc64_elf_howto_table
))
2496 /* xgettext:c-format */
2497 _bfd_error_handler (_("%B: invalid relocation type %d"),
2499 type
= R_PPC64_NONE
;
2501 cache_ptr
->howto
= ppc64_elf_howto_table
[type
];
2504 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2506 static bfd_reloc_status_type
2507 ppc64_elf_ha_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2508 void *data
, asection
*input_section
,
2509 bfd
*output_bfd
, char **error_message
)
2511 enum elf_ppc64_reloc_type r_type
;
2513 bfd_size_type octets
;
2516 /* If this is a relocatable link (output_bfd test tells us), just
2517 call the generic function. Any adjustment will be done at final
2519 if (output_bfd
!= NULL
)
2520 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2521 input_section
, output_bfd
, error_message
);
2523 /* Adjust the addend for sign extension of the low 16 bits.
2524 We won't actually be using the low 16 bits, so trashing them
2526 reloc_entry
->addend
+= 0x8000;
2527 r_type
= reloc_entry
->howto
->type
;
2528 if (r_type
!= R_PPC64_REL16DX_HA
)
2529 return bfd_reloc_continue
;
2532 if (!bfd_is_com_section (symbol
->section
))
2533 value
= symbol
->value
;
2534 value
+= (reloc_entry
->addend
2535 + symbol
->section
->output_offset
2536 + symbol
->section
->output_section
->vma
);
2537 value
-= (reloc_entry
->address
2538 + input_section
->output_offset
2539 + input_section
->output_section
->vma
);
2540 value
= (bfd_signed_vma
) value
>> 16;
2542 octets
= reloc_entry
->address
* bfd_octets_per_byte (abfd
);
2543 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ octets
);
2545 insn
|= (value
& 0xffc1) | ((value
& 0x3e) << 15);
2546 bfd_put_32 (abfd
, insn
, (bfd_byte
*) data
+ octets
);
2547 if (value
+ 0x8000 > 0xffff)
2548 return bfd_reloc_overflow
;
2549 return bfd_reloc_ok
;
2552 static bfd_reloc_status_type
2553 ppc64_elf_branch_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2554 void *data
, asection
*input_section
,
2555 bfd
*output_bfd
, char **error_message
)
2557 if (output_bfd
!= NULL
)
2558 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2559 input_section
, output_bfd
, error_message
);
2561 if (strcmp (symbol
->section
->name
, ".opd") == 0
2562 && (symbol
->section
->owner
->flags
& DYNAMIC
) == 0)
2564 bfd_vma dest
= opd_entry_value (symbol
->section
,
2565 symbol
->value
+ reloc_entry
->addend
,
2567 if (dest
!= (bfd_vma
) -1)
2568 reloc_entry
->addend
= dest
- (symbol
->value
2569 + symbol
->section
->output_section
->vma
2570 + symbol
->section
->output_offset
);
2574 elf_symbol_type
*elfsym
= (elf_symbol_type
*) symbol
;
2576 if (symbol
->section
->owner
!= abfd
2577 && symbol
->section
->owner
!= NULL
2578 && abiversion (symbol
->section
->owner
) >= 2)
2582 for (i
= 0; i
< symbol
->section
->owner
->symcount
; ++i
)
2584 asymbol
*symdef
= symbol
->section
->owner
->outsymbols
[i
];
2586 if (strcmp (symdef
->name
, symbol
->name
) == 0)
2588 elfsym
= (elf_symbol_type
*) symdef
;
2594 += PPC64_LOCAL_ENTRY_OFFSET (elfsym
->internal_elf_sym
.st_other
);
2596 return bfd_reloc_continue
;
2599 static bfd_reloc_status_type
2600 ppc64_elf_brtaken_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2601 void *data
, asection
*input_section
,
2602 bfd
*output_bfd
, char **error_message
)
2605 enum elf_ppc64_reloc_type r_type
;
2606 bfd_size_type octets
;
2607 /* Assume 'at' branch hints. */
2608 bfd_boolean is_isa_v2
= TRUE
;
2610 /* If this is a relocatable link (output_bfd test tells us), just
2611 call the generic function. Any adjustment will be done at final
2613 if (output_bfd
!= NULL
)
2614 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2615 input_section
, output_bfd
, error_message
);
2617 octets
= reloc_entry
->address
* bfd_octets_per_byte (abfd
);
2618 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ octets
);
2619 insn
&= ~(0x01 << 21);
2620 r_type
= reloc_entry
->howto
->type
;
2621 if (r_type
== R_PPC64_ADDR14_BRTAKEN
2622 || r_type
== R_PPC64_REL14_BRTAKEN
)
2623 insn
|= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2627 /* Set 'a' bit. This is 0b00010 in BO field for branch
2628 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2629 for branch on CTR insns (BO == 1a00t or 1a01t). */
2630 if ((insn
& (0x14 << 21)) == (0x04 << 21))
2632 else if ((insn
& (0x14 << 21)) == (0x10 << 21))
2642 if (!bfd_is_com_section (symbol
->section
))
2643 target
= symbol
->value
;
2644 target
+= symbol
->section
->output_section
->vma
;
2645 target
+= symbol
->section
->output_offset
;
2646 target
+= reloc_entry
->addend
;
2648 from
= (reloc_entry
->address
2649 + input_section
->output_offset
2650 + input_section
->output_section
->vma
);
2652 /* Invert 'y' bit if not the default. */
2653 if ((bfd_signed_vma
) (target
- from
) < 0)
2656 bfd_put_32 (abfd
, insn
, (bfd_byte
*) data
+ octets
);
2658 return ppc64_elf_branch_reloc (abfd
, reloc_entry
, symbol
, data
,
2659 input_section
, output_bfd
, error_message
);
2662 static bfd_reloc_status_type
2663 ppc64_elf_sectoff_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2664 void *data
, asection
*input_section
,
2665 bfd
*output_bfd
, char **error_message
)
2667 /* If this is a relocatable link (output_bfd test tells us), just
2668 call the generic function. Any adjustment will be done at final
2670 if (output_bfd
!= NULL
)
2671 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2672 input_section
, output_bfd
, error_message
);
2674 /* Subtract the symbol section base address. */
2675 reloc_entry
->addend
-= symbol
->section
->output_section
->vma
;
2676 return bfd_reloc_continue
;
2679 static bfd_reloc_status_type
2680 ppc64_elf_sectoff_ha_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2681 void *data
, asection
*input_section
,
2682 bfd
*output_bfd
, char **error_message
)
2684 /* If this is a relocatable link (output_bfd test tells us), just
2685 call the generic function. Any adjustment will be done at final
2687 if (output_bfd
!= NULL
)
2688 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2689 input_section
, output_bfd
, error_message
);
2691 /* Subtract the symbol section base address. */
2692 reloc_entry
->addend
-= symbol
->section
->output_section
->vma
;
2694 /* Adjust the addend for sign extension of the low 16 bits. */
2695 reloc_entry
->addend
+= 0x8000;
2696 return bfd_reloc_continue
;
2699 static bfd_reloc_status_type
2700 ppc64_elf_toc_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2701 void *data
, asection
*input_section
,
2702 bfd
*output_bfd
, char **error_message
)
2706 /* If this is a relocatable link (output_bfd test tells us), just
2707 call the generic function. Any adjustment will be done at final
2709 if (output_bfd
!= NULL
)
2710 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2711 input_section
, output_bfd
, error_message
);
2713 TOCstart
= _bfd_get_gp_value (input_section
->output_section
->owner
);
2715 TOCstart
= ppc64_elf_set_toc (NULL
, input_section
->output_section
->owner
);
2717 /* Subtract the TOC base address. */
2718 reloc_entry
->addend
-= TOCstart
+ TOC_BASE_OFF
;
2719 return bfd_reloc_continue
;
2722 static bfd_reloc_status_type
2723 ppc64_elf_toc_ha_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2724 void *data
, asection
*input_section
,
2725 bfd
*output_bfd
, char **error_message
)
2729 /* If this is a relocatable link (output_bfd test tells us), just
2730 call the generic function. Any adjustment will be done at final
2732 if (output_bfd
!= NULL
)
2733 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2734 input_section
, output_bfd
, error_message
);
2736 TOCstart
= _bfd_get_gp_value (input_section
->output_section
->owner
);
2738 TOCstart
= ppc64_elf_set_toc (NULL
, input_section
->output_section
->owner
);
2740 /* Subtract the TOC base address. */
2741 reloc_entry
->addend
-= TOCstart
+ TOC_BASE_OFF
;
2743 /* Adjust the addend for sign extension of the low 16 bits. */
2744 reloc_entry
->addend
+= 0x8000;
2745 return bfd_reloc_continue
;
2748 static bfd_reloc_status_type
2749 ppc64_elf_toc64_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2750 void *data
, asection
*input_section
,
2751 bfd
*output_bfd
, char **error_message
)
2754 bfd_size_type octets
;
2756 /* If this is a relocatable link (output_bfd test tells us), just
2757 call the generic function. Any adjustment will be done at final
2759 if (output_bfd
!= NULL
)
2760 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2761 input_section
, output_bfd
, error_message
);
2763 TOCstart
= _bfd_get_gp_value (input_section
->output_section
->owner
);
2765 TOCstart
= ppc64_elf_set_toc (NULL
, input_section
->output_section
->owner
);
2767 octets
= reloc_entry
->address
* bfd_octets_per_byte (abfd
);
2768 bfd_put_64 (abfd
, TOCstart
+ TOC_BASE_OFF
, (bfd_byte
*) data
+ octets
);
2769 return bfd_reloc_ok
;
2772 static bfd_reloc_status_type
2773 ppc64_elf_unhandled_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2774 void *data
, asection
*input_section
,
2775 bfd
*output_bfd
, char **error_message
)
2777 /* If this is a relocatable link (output_bfd test tells us), just
2778 call the generic function. Any adjustment will be done at final
2780 if (output_bfd
!= NULL
)
2781 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2782 input_section
, output_bfd
, error_message
);
2784 if (error_message
!= NULL
)
2786 static char buf
[60];
2787 sprintf (buf
, "generic linker can't handle %s",
2788 reloc_entry
->howto
->name
);
2789 *error_message
= buf
;
2791 return bfd_reloc_dangerous
;
2794 /* Track GOT entries needed for a given symbol. We might need more
2795 than one got entry per symbol. */
2798 struct got_entry
*next
;
2800 /* The symbol addend that we'll be placing in the GOT. */
2803 /* Unlike other ELF targets, we use separate GOT entries for the same
2804 symbol referenced from different input files. This is to support
2805 automatic multiple TOC/GOT sections, where the TOC base can vary
2806 from one input file to another. After partitioning into TOC groups
2807 we merge entries within the group.
2809 Point to the BFD owning this GOT entry. */
2812 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2813 TLS_TPREL or TLS_DTPREL for tls entries. */
2814 unsigned char tls_type
;
2816 /* Non-zero if got.ent points to real entry. */
2817 unsigned char is_indirect
;
2819 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2822 bfd_signed_vma refcount
;
2824 struct got_entry
*ent
;
2828 /* The same for PLT. */
2831 struct plt_entry
*next
;
2837 bfd_signed_vma refcount
;
2842 struct ppc64_elf_obj_tdata
2844 struct elf_obj_tdata elf
;
2846 /* Shortcuts to dynamic linker sections. */
2850 /* Used during garbage collection. We attach global symbols defined
2851 on removed .opd entries to this section so that the sym is removed. */
2852 asection
*deleted_section
;
2854 /* TLS local dynamic got entry handling. Support for multiple GOT
2855 sections means we potentially need one of these for each input bfd. */
2856 struct got_entry tlsld_got
;
2859 /* A copy of relocs before they are modified for --emit-relocs. */
2860 Elf_Internal_Rela
*relocs
;
2862 /* Section contents. */
2866 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2867 the reloc to be in the range -32768 to 32767. */
2868 unsigned int has_small_toc_reloc
: 1;
2870 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2871 instruction not one we handle. */
2872 unsigned int unexpected_toc_insn
: 1;
2875 #define ppc64_elf_tdata(bfd) \
2876 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2878 #define ppc64_tlsld_got(bfd) \
2879 (&ppc64_elf_tdata (bfd)->tlsld_got)
2881 #define is_ppc64_elf(bfd) \
2882 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2883 && elf_object_id (bfd) == PPC64_ELF_DATA)
2885 /* Override the generic function because we store some extras. */
2888 ppc64_elf_mkobject (bfd
*abfd
)
2890 return bfd_elf_allocate_object (abfd
, sizeof (struct ppc64_elf_obj_tdata
),
2894 /* Fix bad default arch selected for a 64 bit input bfd when the
2895 default is 32 bit. Also select arch based on apuinfo. */
2898 ppc64_elf_object_p (bfd
*abfd
)
2900 if (!abfd
->arch_info
->the_default
)
2903 if (abfd
->arch_info
->bits_per_word
== 32)
2905 Elf_Internal_Ehdr
*i_ehdr
= elf_elfheader (abfd
);
2907 if (i_ehdr
->e_ident
[EI_CLASS
] == ELFCLASS64
)
2909 /* Relies on arch after 32 bit default being 64 bit default. */
2910 abfd
->arch_info
= abfd
->arch_info
->next
;
2911 BFD_ASSERT (abfd
->arch_info
->bits_per_word
== 64);
2914 return _bfd_elf_ppc_set_arch (abfd
);
2917 /* Support for core dump NOTE sections. */
2920 ppc64_elf_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
2922 size_t offset
, size
;
2924 if (note
->descsz
!= 504)
2928 elf_tdata (abfd
)->core
->signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
2931 elf_tdata (abfd
)->core
->lwpid
= bfd_get_32 (abfd
, note
->descdata
+ 32);
2937 /* Make a ".reg/999" section. */
2938 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
2939 size
, note
->descpos
+ offset
);
2943 ppc64_elf_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
2945 if (note
->descsz
!= 136)
2948 elf_tdata (abfd
)->core
->pid
2949 = bfd_get_32 (abfd
, note
->descdata
+ 24);
2950 elf_tdata (abfd
)->core
->program
2951 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 40, 16);
2952 elf_tdata (abfd
)->core
->command
2953 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 56, 80);
2959 ppc64_elf_write_core_note (bfd
*abfd
, char *buf
, int *bufsiz
, int note_type
,
2972 va_start (ap
, note_type
);
2973 memset (data
, 0, sizeof (data
));
2974 strncpy (data
+ 40, va_arg (ap
, const char *), 16);
2975 strncpy (data
+ 56, va_arg (ap
, const char *), 80);
2977 return elfcore_write_note (abfd
, buf
, bufsiz
,
2978 "CORE", note_type
, data
, sizeof (data
));
2989 va_start (ap
, note_type
);
2990 memset (data
, 0, 112);
2991 pid
= va_arg (ap
, long);
2992 bfd_put_32 (abfd
, pid
, data
+ 32);
2993 cursig
= va_arg (ap
, int);
2994 bfd_put_16 (abfd
, cursig
, data
+ 12);
2995 greg
= va_arg (ap
, const void *);
2996 memcpy (data
+ 112, greg
, 384);
2997 memset (data
+ 496, 0, 8);
2999 return elfcore_write_note (abfd
, buf
, bufsiz
,
3000 "CORE", note_type
, data
, sizeof (data
));
3005 /* Add extra PPC sections. */
3007 static const struct bfd_elf_special_section ppc64_elf_special_sections
[]=
3009 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS
, 0 },
3010 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
},
3011 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
3012 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
3013 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
3014 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
},
3015 { NULL
, 0, 0, 0, 0 }
3018 enum _ppc64_sec_type
{
3024 struct _ppc64_elf_section_data
3026 struct bfd_elf_section_data elf
;
3030 /* An array with one entry for each opd function descriptor,
3031 and some spares since opd entries may be either 16 or 24 bytes. */
3032 #define OPD_NDX(OFF) ((OFF) >> 4)
3033 struct _opd_sec_data
3035 /* Points to the function code section for local opd entries. */
3036 asection
**func_sec
;
3038 /* After editing .opd, adjust references to opd local syms. */
3042 /* An array for toc sections, indexed by offset/8. */
3043 struct _toc_sec_data
3045 /* Specifies the relocation symbol index used at a given toc offset. */
3048 /* And the relocation addend. */
3053 enum _ppc64_sec_type sec_type
:2;
3055 /* Flag set when small branches are detected. Used to
3056 select suitable defaults for the stub group size. */
3057 unsigned int has_14bit_branch
:1;
3060 #define ppc64_elf_section_data(sec) \
3061 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
3064 ppc64_elf_new_section_hook (bfd
*abfd
, asection
*sec
)
3066 if (!sec
->used_by_bfd
)
3068 struct _ppc64_elf_section_data
*sdata
;
3069 bfd_size_type amt
= sizeof (*sdata
);
3071 sdata
= bfd_zalloc (abfd
, amt
);
3074 sec
->used_by_bfd
= sdata
;
3077 return _bfd_elf_new_section_hook (abfd
, sec
);
3080 static struct _opd_sec_data
*
3081 get_opd_info (asection
* sec
)
3084 && ppc64_elf_section_data (sec
) != NULL
3085 && ppc64_elf_section_data (sec
)->sec_type
== sec_opd
)
3086 return &ppc64_elf_section_data (sec
)->u
.opd
;
3090 /* Parameters for the qsort hook. */
3091 static bfd_boolean synthetic_relocatable
;
3092 static asection
*synthetic_opd
;
3094 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
3097 compare_symbols (const void *ap
, const void *bp
)
3099 const asymbol
*a
= * (const asymbol
**) ap
;
3100 const asymbol
*b
= * (const asymbol
**) bp
;
3102 /* Section symbols first. */
3103 if ((a
->flags
& BSF_SECTION_SYM
) && !(b
->flags
& BSF_SECTION_SYM
))
3105 if (!(a
->flags
& BSF_SECTION_SYM
) && (b
->flags
& BSF_SECTION_SYM
))
3108 /* then .opd symbols. */
3109 if (synthetic_opd
!= NULL
)
3111 if (strcmp (a
->section
->name
, ".opd") == 0
3112 && strcmp (b
->section
->name
, ".opd") != 0)
3114 if (strcmp (a
->section
->name
, ".opd") != 0
3115 && strcmp (b
->section
->name
, ".opd") == 0)
3119 /* then other code symbols. */
3120 if ((a
->section
->flags
& (SEC_CODE
| SEC_ALLOC
| SEC_THREAD_LOCAL
))
3121 == (SEC_CODE
| SEC_ALLOC
)
3122 && (b
->section
->flags
& (SEC_CODE
| SEC_ALLOC
| SEC_THREAD_LOCAL
))
3123 != (SEC_CODE
| SEC_ALLOC
))
3126 if ((a
->section
->flags
& (SEC_CODE
| SEC_ALLOC
| SEC_THREAD_LOCAL
))
3127 != (SEC_CODE
| SEC_ALLOC
)
3128 && (b
->section
->flags
& (SEC_CODE
| SEC_ALLOC
| SEC_THREAD_LOCAL
))
3129 == (SEC_CODE
| SEC_ALLOC
))
3132 if (synthetic_relocatable
)
3134 if (a
->section
->id
< b
->section
->id
)
3137 if (a
->section
->id
> b
->section
->id
)
3141 if (a
->value
+ a
->section
->vma
< b
->value
+ b
->section
->vma
)
3144 if (a
->value
+ a
->section
->vma
> b
->value
+ b
->section
->vma
)
3147 /* For syms with the same value, prefer strong dynamic global function
3148 syms over other syms. */
3149 if ((a
->flags
& BSF_GLOBAL
) != 0 && (b
->flags
& BSF_GLOBAL
) == 0)
3152 if ((a
->flags
& BSF_GLOBAL
) == 0 && (b
->flags
& BSF_GLOBAL
) != 0)
3155 if ((a
->flags
& BSF_FUNCTION
) != 0 && (b
->flags
& BSF_FUNCTION
) == 0)
3158 if ((a
->flags
& BSF_FUNCTION
) == 0 && (b
->flags
& BSF_FUNCTION
) != 0)
3161 if ((a
->flags
& BSF_WEAK
) == 0 && (b
->flags
& BSF_WEAK
) != 0)
3164 if ((a
->flags
& BSF_WEAK
) != 0 && (b
->flags
& BSF_WEAK
) == 0)
3167 if ((a
->flags
& BSF_DYNAMIC
) != 0 && (b
->flags
& BSF_DYNAMIC
) == 0)
3170 if ((a
->flags
& BSF_DYNAMIC
) == 0 && (b
->flags
& BSF_DYNAMIC
) != 0)
3176 /* Search SYMS for a symbol of the given VALUE. */
3179 sym_exists_at (asymbol
**syms
, long lo
, long hi
, unsigned int id
, bfd_vma value
)
3183 if (id
== (unsigned) -1)
3187 mid
= (lo
+ hi
) >> 1;
3188 if (syms
[mid
]->value
+ syms
[mid
]->section
->vma
< value
)
3190 else if (syms
[mid
]->value
+ syms
[mid
]->section
->vma
> value
)
3200 mid
= (lo
+ hi
) >> 1;
3201 if (syms
[mid
]->section
->id
< id
)
3203 else if (syms
[mid
]->section
->id
> id
)
3205 else if (syms
[mid
]->value
< value
)
3207 else if (syms
[mid
]->value
> value
)
3217 section_covers_vma (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*section
, void *ptr
)
3219 bfd_vma vma
= *(bfd_vma
*) ptr
;
3220 return ((section
->flags
& SEC_ALLOC
) != 0
3221 && section
->vma
<= vma
3222 && vma
< section
->vma
+ section
->size
);
3225 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3226 entry syms. Also generate @plt symbols for the glink branch table.
3227 Returns count of synthetic symbols in RET or -1 on error. */
3230 ppc64_elf_get_synthetic_symtab (bfd
*abfd
,
3231 long static_count
, asymbol
**static_syms
,
3232 long dyn_count
, asymbol
**dyn_syms
,
3239 long symcount
, codesecsym
, codesecsymend
, secsymend
, opdsymend
;
3240 asection
*opd
= NULL
;
3241 bfd_boolean relocatable
= (abfd
->flags
& (EXEC_P
| DYNAMIC
)) == 0;
3243 int abi
= abiversion (abfd
);
3249 opd
= bfd_get_section_by_name (abfd
, ".opd");
3250 if (opd
== NULL
&& abi
== 1)
3254 symcount
= static_count
;
3256 symcount
+= dyn_count
;
3260 syms
= bfd_malloc ((symcount
+ 1) * sizeof (*syms
));
3264 if (!relocatable
&& static_count
!= 0 && dyn_count
!= 0)
3266 /* Use both symbol tables. */
3267 memcpy (syms
, static_syms
, static_count
* sizeof (*syms
));
3268 memcpy (syms
+ static_count
, dyn_syms
, (dyn_count
+ 1) * sizeof (*syms
));
3270 else if (!relocatable
&& static_count
== 0)
3271 memcpy (syms
, dyn_syms
, (symcount
+ 1) * sizeof (*syms
));
3273 memcpy (syms
, static_syms
, (symcount
+ 1) * sizeof (*syms
));
3275 synthetic_relocatable
= relocatable
;
3276 synthetic_opd
= opd
;
3277 qsort (syms
, symcount
, sizeof (*syms
), compare_symbols
);
3279 if (!relocatable
&& symcount
> 1)
3282 /* Trim duplicate syms, since we may have merged the normal and
3283 dynamic symbols. Actually, we only care about syms that have
3284 different values, so trim any with the same value. */
3285 for (i
= 1, j
= 1; i
< symcount
; ++i
)
3286 if (syms
[i
- 1]->value
+ syms
[i
- 1]->section
->vma
3287 != syms
[i
]->value
+ syms
[i
]->section
->vma
)
3288 syms
[j
++] = syms
[i
];
3293 /* Note that here and in compare_symbols we can't compare opd and
3294 sym->section directly. With separate debug info files, the
3295 symbols will be extracted from the debug file while abfd passed
3296 to this function is the real binary. */
3297 if (opd
!= NULL
&& strcmp (syms
[i
]->section
->name
, ".opd") == 0)
3301 for (; i
< symcount
; ++i
)
3302 if (((syms
[i
]->section
->flags
& (SEC_CODE
| SEC_ALLOC
| SEC_THREAD_LOCAL
))
3303 != (SEC_CODE
| SEC_ALLOC
))
3304 || (syms
[i
]->flags
& BSF_SECTION_SYM
) == 0)
3308 for (; i
< symcount
; ++i
)
3309 if ((syms
[i
]->flags
& BSF_SECTION_SYM
) == 0)
3314 for (; i
< symcount
; ++i
)
3315 if (strcmp (syms
[i
]->section
->name
, ".opd") != 0)
3319 for (; i
< symcount
; ++i
)
3320 if ((syms
[i
]->section
->flags
& (SEC_CODE
| SEC_ALLOC
| SEC_THREAD_LOCAL
))
3321 != (SEC_CODE
| SEC_ALLOC
))
3329 bfd_boolean (*slurp_relocs
) (bfd
*, asection
*, asymbol
**, bfd_boolean
);
3334 if (opdsymend
== secsymend
)
3337 slurp_relocs
= get_elf_backend_data (abfd
)->s
->slurp_reloc_table
;
3338 relcount
= (opd
->flags
& SEC_RELOC
) ? opd
->reloc_count
: 0;
3342 if (!(*slurp_relocs
) (abfd
, opd
, static_syms
, FALSE
))
3349 for (i
= secsymend
, r
= opd
->relocation
; i
< opdsymend
; ++i
)
3353 while (r
< opd
->relocation
+ relcount
3354 && r
->address
< syms
[i
]->value
+ opd
->vma
)
3357 if (r
== opd
->relocation
+ relcount
)
3360 if (r
->address
!= syms
[i
]->value
+ opd
->vma
)
3363 if (r
->howto
->type
!= R_PPC64_ADDR64
)
3366 sym
= *r
->sym_ptr_ptr
;
3367 if (!sym_exists_at (syms
, opdsymend
, symcount
,
3368 sym
->section
->id
, sym
->value
+ r
->addend
))
3371 size
+= sizeof (asymbol
);
3372 size
+= strlen (syms
[i
]->name
) + 2;
3378 s
= *ret
= bfd_malloc (size
);
3385 names
= (char *) (s
+ count
);
3387 for (i
= secsymend
, r
= opd
->relocation
; i
< opdsymend
; ++i
)
3391 while (r
< opd
->relocation
+ relcount
3392 && r
->address
< syms
[i
]->value
+ opd
->vma
)
3395 if (r
== opd
->relocation
+ relcount
)
3398 if (r
->address
!= syms
[i
]->value
+ opd
->vma
)
3401 if (r
->howto
->type
!= R_PPC64_ADDR64
)
3404 sym
= *r
->sym_ptr_ptr
;
3405 if (!sym_exists_at (syms
, opdsymend
, symcount
,
3406 sym
->section
->id
, sym
->value
+ r
->addend
))
3411 s
->flags
|= BSF_SYNTHETIC
;
3412 s
->section
= sym
->section
;
3413 s
->value
= sym
->value
+ r
->addend
;
3416 len
= strlen (syms
[i
]->name
);
3417 memcpy (names
, syms
[i
]->name
, len
+ 1);
3419 /* Have udata.p point back to the original symbol this
3420 synthetic symbol was derived from. */
3421 s
->udata
.p
= syms
[i
];
3428 bfd_boolean (*slurp_relocs
) (bfd
*, asection
*, asymbol
**, bfd_boolean
);
3429 bfd_byte
*contents
= NULL
;
3432 bfd_vma glink_vma
= 0, resolv_vma
= 0;
3433 asection
*dynamic
, *glink
= NULL
, *relplt
= NULL
;
3436 if (opd
!= NULL
&& !bfd_malloc_and_get_section (abfd
, opd
, &contents
))
3438 free_contents_and_exit_err
:
3440 free_contents_and_exit
:
3447 for (i
= secsymend
; i
< opdsymend
; ++i
)
3451 /* Ignore bogus symbols. */
3452 if (syms
[i
]->value
> opd
->size
- 8)
3455 ent
= bfd_get_64 (abfd
, contents
+ syms
[i
]->value
);
3456 if (!sym_exists_at (syms
, opdsymend
, symcount
, -1, ent
))
3459 size
+= sizeof (asymbol
);
3460 size
+= strlen (syms
[i
]->name
) + 2;
3464 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3466 && (dynamic
= bfd_get_section_by_name (abfd
, ".dynamic")) != NULL
)
3468 bfd_byte
*dynbuf
, *extdyn
, *extdynend
;
3470 void (*swap_dyn_in
) (bfd
*, const void *, Elf_Internal_Dyn
*);
3472 if (!bfd_malloc_and_get_section (abfd
, dynamic
, &dynbuf
))
3473 goto free_contents_and_exit_err
;
3475 extdynsize
= get_elf_backend_data (abfd
)->s
->sizeof_dyn
;
3476 swap_dyn_in
= get_elf_backend_data (abfd
)->s
->swap_dyn_in
;
3479 extdynend
= extdyn
+ dynamic
->size
;
3480 for (; extdyn
< extdynend
; extdyn
+= extdynsize
)
3482 Elf_Internal_Dyn dyn
;
3483 (*swap_dyn_in
) (abfd
, extdyn
, &dyn
);
3485 if (dyn
.d_tag
== DT_NULL
)
3488 if (dyn
.d_tag
== DT_PPC64_GLINK
)
3490 /* The first glink stub starts at offset 32; see
3491 comment in ppc64_elf_finish_dynamic_sections. */
3492 glink_vma
= dyn
.d_un
.d_val
+ GLINK_CALL_STUB_SIZE
- 8 * 4;
3493 /* The .glink section usually does not survive the final
3494 link; search for the section (usually .text) where the
3495 glink stubs now reside. */
3496 glink
= bfd_sections_find_if (abfd
, section_covers_vma
,
3507 /* Determine __glink trampoline by reading the relative branch
3508 from the first glink stub. */
3510 unsigned int off
= 0;
3512 while (bfd_get_section_contents (abfd
, glink
, buf
,
3513 glink_vma
+ off
- glink
->vma
, 4))
3515 unsigned int insn
= bfd_get_32 (abfd
, buf
);
3517 if ((insn
& ~0x3fffffc) == 0)
3519 resolv_vma
= glink_vma
+ off
+ (insn
^ 0x2000000) - 0x2000000;
3528 size
+= sizeof (asymbol
) + sizeof ("__glink_PLTresolve");
3530 relplt
= bfd_get_section_by_name (abfd
, ".rela.plt");
3533 slurp_relocs
= get_elf_backend_data (abfd
)->s
->slurp_reloc_table
;
3534 if (! (*slurp_relocs
) (abfd
, relplt
, dyn_syms
, TRUE
))
3535 goto free_contents_and_exit_err
;
3537 plt_count
= relplt
->size
/ sizeof (Elf64_External_Rela
);
3538 size
+= plt_count
* sizeof (asymbol
);
3540 p
= relplt
->relocation
;
3541 for (i
= 0; i
< plt_count
; i
++, p
++)
3543 size
+= strlen ((*p
->sym_ptr_ptr
)->name
) + sizeof ("@plt");
3545 size
+= sizeof ("+0x") - 1 + 16;
3551 goto free_contents_and_exit
;
3552 s
= *ret
= bfd_malloc (size
);
3554 goto free_contents_and_exit_err
;
3556 names
= (char *) (s
+ count
+ plt_count
+ (resolv_vma
!= 0));
3558 for (i
= secsymend
; i
< opdsymend
; ++i
)
3562 if (syms
[i
]->value
> opd
->size
- 8)
3565 ent
= bfd_get_64 (abfd
, contents
+ syms
[i
]->value
);
3566 if (!sym_exists_at (syms
, opdsymend
, symcount
, -1, ent
))
3570 asection
*sec
= abfd
->sections
;
3577 long mid
= (lo
+ hi
) >> 1;
3578 if (syms
[mid
]->section
->vma
< ent
)
3580 else if (syms
[mid
]->section
->vma
> ent
)
3584 sec
= syms
[mid
]->section
;
3589 if (lo
>= hi
&& lo
> codesecsym
)
3590 sec
= syms
[lo
- 1]->section
;
3592 for (; sec
!= NULL
; sec
= sec
->next
)
3596 /* SEC_LOAD may not be set if SEC is from a separate debug
3598 if ((sec
->flags
& SEC_ALLOC
) == 0)
3600 if ((sec
->flags
& SEC_CODE
) != 0)
3603 s
->flags
|= BSF_SYNTHETIC
;
3604 s
->value
= ent
- s
->section
->vma
;
3607 len
= strlen (syms
[i
]->name
);
3608 memcpy (names
, syms
[i
]->name
, len
+ 1);
3610 /* Have udata.p point back to the original symbol this
3611 synthetic symbol was derived from. */
3612 s
->udata
.p
= syms
[i
];
3618 if (glink
!= NULL
&& relplt
!= NULL
)
3622 /* Add a symbol for the main glink trampoline. */
3623 memset (s
, 0, sizeof *s
);
3625 s
->flags
= BSF_GLOBAL
| BSF_SYNTHETIC
;
3627 s
->value
= resolv_vma
- glink
->vma
;
3629 memcpy (names
, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3630 names
+= sizeof ("__glink_PLTresolve");
3635 /* FIXME: It would be very much nicer to put sym@plt on the
3636 stub rather than on the glink branch table entry. The
3637 objdump disassembler would then use a sensible symbol
3638 name on plt calls. The difficulty in doing so is
3639 a) finding the stubs, and,
3640 b) matching stubs against plt entries, and,
3641 c) there can be multiple stubs for a given plt entry.
3643 Solving (a) could be done by code scanning, but older
3644 ppc64 binaries used different stubs to current code.
3645 (b) is the tricky one since you need to known the toc
3646 pointer for at least one function that uses a pic stub to
3647 be able to calculate the plt address referenced.
3648 (c) means gdb would need to set multiple breakpoints (or
3649 find the glink branch itself) when setting breakpoints
3650 for pending shared library loads. */
3651 p
= relplt
->relocation
;
3652 for (i
= 0; i
< plt_count
; i
++, p
++)
3656 *s
= **p
->sym_ptr_ptr
;
3657 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3658 we are defining a symbol, ensure one of them is set. */
3659 if ((s
->flags
& BSF_LOCAL
) == 0)
3660 s
->flags
|= BSF_GLOBAL
;
3661 s
->flags
|= BSF_SYNTHETIC
;
3663 s
->value
= glink_vma
- glink
->vma
;
3666 len
= strlen ((*p
->sym_ptr_ptr
)->name
);
3667 memcpy (names
, (*p
->sym_ptr_ptr
)->name
, len
);
3671 memcpy (names
, "+0x", sizeof ("+0x") - 1);
3672 names
+= sizeof ("+0x") - 1;
3673 bfd_sprintf_vma (abfd
, names
, p
->addend
);
3674 names
+= strlen (names
);
3676 memcpy (names
, "@plt", sizeof ("@plt"));
3677 names
+= sizeof ("@plt");
3697 /* The following functions are specific to the ELF linker, while
3698 functions above are used generally. Those named ppc64_elf_* are
3699 called by the main ELF linker code. They appear in this file more
3700 or less in the order in which they are called. eg.
3701 ppc64_elf_check_relocs is called early in the link process,
3702 ppc64_elf_finish_dynamic_sections is one of the last functions
3705 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3706 functions have both a function code symbol and a function descriptor
3707 symbol. A call to foo in a relocatable object file looks like:
3714 The function definition in another object file might be:
3718 . .quad .TOC.@tocbase
3724 When the linker resolves the call during a static link, the branch
3725 unsurprisingly just goes to .foo and the .opd information is unused.
3726 If the function definition is in a shared library, things are a little
3727 different: The call goes via a plt call stub, the opd information gets
3728 copied to the plt, and the linker patches the nop.
3736 . std 2,40(1) # in practice, the call stub
3737 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3738 . addi 11,11,Lfoo@toc@l # this is the general idea
3746 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3748 The "reloc ()" notation is supposed to indicate that the linker emits
3749 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3752 What are the difficulties here? Well, firstly, the relocations
3753 examined by the linker in check_relocs are against the function code
3754 sym .foo, while the dynamic relocation in the plt is emitted against
3755 the function descriptor symbol, foo. Somewhere along the line, we need
3756 to carefully copy dynamic link information from one symbol to the other.
3757 Secondly, the generic part of the elf linker will make .foo a dynamic
3758 symbol as is normal for most other backends. We need foo dynamic
3759 instead, at least for an application final link. However, when
3760 creating a shared library containing foo, we need to have both symbols
3761 dynamic so that references to .foo are satisfied during the early
3762 stages of linking. Otherwise the linker might decide to pull in a
3763 definition from some other object, eg. a static library.
3765 Update: As of August 2004, we support a new convention. Function
3766 calls may use the function descriptor symbol, ie. "bl foo". This
3767 behaves exactly as "bl .foo". */
3769 /* Of those relocs that might be copied as dynamic relocs, this function
3770 selects those that must be copied when linking a shared library,
3771 even when the symbol is local. */
3774 must_be_dyn_reloc (struct bfd_link_info
*info
,
3775 enum elf_ppc64_reloc_type r_type
)
3787 case R_PPC64_TPREL16
:
3788 case R_PPC64_TPREL16_LO
:
3789 case R_PPC64_TPREL16_HI
:
3790 case R_PPC64_TPREL16_HA
:
3791 case R_PPC64_TPREL16_DS
:
3792 case R_PPC64_TPREL16_LO_DS
:
3793 case R_PPC64_TPREL16_HIGH
:
3794 case R_PPC64_TPREL16_HIGHA
:
3795 case R_PPC64_TPREL16_HIGHER
:
3796 case R_PPC64_TPREL16_HIGHERA
:
3797 case R_PPC64_TPREL16_HIGHEST
:
3798 case R_PPC64_TPREL16_HIGHESTA
:
3799 case R_PPC64_TPREL64
:
3800 return !bfd_link_executable (info
);
3804 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3805 copying dynamic variables from a shared lib into an app's dynbss
3806 section, and instead use a dynamic relocation to point into the
3807 shared lib. With code that gcc generates, it's vital that this be
3808 enabled; In the PowerPC64 ABI, the address of a function is actually
3809 the address of a function descriptor, which resides in the .opd
3810 section. gcc uses the descriptor directly rather than going via the
3811 GOT as some other ABI's do, which means that initialized function
3812 pointers must reference the descriptor. Thus, a function pointer
3813 initialized to the address of a function in a shared library will
3814 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3815 redefines the function descriptor symbol to point to the copy. This
3816 presents a problem as a plt entry for that function is also
3817 initialized from the function descriptor symbol and the copy reloc
3818 may not be initialized first. */
3819 #define ELIMINATE_COPY_RELOCS 1
3821 /* Section name for stubs is the associated section name plus this
3823 #define STUB_SUFFIX ".stub"
3826 ppc_stub_long_branch:
3827 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3828 destination, but a 24 bit branch in a stub section will reach.
3831 ppc_stub_plt_branch:
3832 Similar to the above, but a 24 bit branch in the stub section won't
3833 reach its destination.
3834 . addis %r11,%r2,xxx@toc@ha
3835 . ld %r12,xxx@toc@l(%r11)
3840 Used to call a function in a shared library. If it so happens that
3841 the plt entry referenced crosses a 64k boundary, then an extra
3842 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3844 . addis %r11,%r2,xxx@toc@ha
3845 . ld %r12,xxx+0@toc@l(%r11)
3847 . ld %r2,xxx+8@toc@l(%r11)
3848 . ld %r11,xxx+16@toc@l(%r11)
3851 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3852 code to adjust the value and save r2 to support multiple toc sections.
3853 A ppc_stub_long_branch with an r2 offset looks like:
3855 . addis %r2,%r2,off@ha
3856 . addi %r2,%r2,off@l
3859 A ppc_stub_plt_branch with an r2 offset looks like:
3861 . addis %r11,%r2,xxx@toc@ha
3862 . ld %r12,xxx@toc@l(%r11)
3863 . addis %r2,%r2,off@ha
3864 . addi %r2,%r2,off@l
3868 In cases where the "addis" instruction would add zero, the "addis" is
3869 omitted and following instructions modified slightly in some cases.
3872 enum ppc_stub_type
{
3874 ppc_stub_long_branch
,
3875 ppc_stub_long_branch_r2off
,
3876 ppc_stub_plt_branch
,
3877 ppc_stub_plt_branch_r2off
,
3879 ppc_stub_plt_call_r2save
,
3880 ppc_stub_global_entry
,
3884 /* Information on stub grouping. */
3887 /* The stub section. */
3889 /* This is the section to which stubs in the group will be attached. */
3892 struct map_stub
*next
;
3893 /* Whether to emit a copy of register save/restore functions in this
3898 struct ppc_stub_hash_entry
{
3900 /* Base hash table entry structure. */
3901 struct bfd_hash_entry root
;
3903 enum ppc_stub_type stub_type
;
3905 /* Group information. */
3906 struct map_stub
*group
;
3908 /* Offset within stub_sec of the beginning of this stub. */
3909 bfd_vma stub_offset
;
3911 /* Given the symbol's value and its section we can determine its final
3912 value when building the stubs (so the stub knows where to jump. */
3913 bfd_vma target_value
;
3914 asection
*target_section
;
3916 /* The symbol table entry, if any, that this was derived from. */
3917 struct ppc_link_hash_entry
*h
;
3918 struct plt_entry
*plt_ent
;
3920 /* Symbol st_other. */
3921 unsigned char other
;
3924 struct ppc_branch_hash_entry
{
3926 /* Base hash table entry structure. */
3927 struct bfd_hash_entry root
;
3929 /* Offset within branch lookup table. */
3930 unsigned int offset
;
3932 /* Generation marker. */
3936 /* Used to track dynamic relocations for local symbols. */
3937 struct ppc_dyn_relocs
3939 struct ppc_dyn_relocs
*next
;
3941 /* The input section of the reloc. */
3944 /* Total number of relocs copied for the input section. */
3945 unsigned int count
: 31;
3947 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3948 unsigned int ifunc
: 1;
3951 struct ppc_link_hash_entry
3953 struct elf_link_hash_entry elf
;
3956 /* A pointer to the most recently used stub hash entry against this
3958 struct ppc_stub_hash_entry
*stub_cache
;
3960 /* A pointer to the next symbol starting with a '.' */
3961 struct ppc_link_hash_entry
*next_dot_sym
;
3964 /* Track dynamic relocs copied for this symbol. */
3965 struct elf_dyn_relocs
*dyn_relocs
;
3967 /* Chain of aliases referring to a weakdef. */
3968 struct ppc_link_hash_entry
*weakref
;
3970 /* Link between function code and descriptor symbols. */
3971 struct ppc_link_hash_entry
*oh
;
3973 /* Flag function code and descriptor symbols. */
3974 unsigned int is_func
:1;
3975 unsigned int is_func_descriptor
:1;
3976 unsigned int fake
:1;
3978 /* Whether global opd/toc sym has been adjusted or not.
3979 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3980 should be set for all globals defined in any opd/toc section. */
3981 unsigned int adjust_done
:1;
3983 /* Set if this is an out-of-line register save/restore function,
3984 with non-standard calling convention. */
3985 unsigned int save_res
:1;
3987 /* Contexts in which symbol is used in the GOT (or TOC).
3988 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3989 corresponding relocs are encountered during check_relocs.
3990 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3991 indicate the corresponding GOT entry type is not needed.
3992 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3993 a TPREL one. We use a separate flag rather than setting TPREL
3994 just for convenience in distinguishing the two cases. */
3995 #define TLS_GD 1 /* GD reloc. */
3996 #define TLS_LD 2 /* LD reloc. */
3997 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
3998 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3999 #define TLS_TLS 16 /* Any TLS reloc. */
4000 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
4001 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
4002 #define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
4003 unsigned char tls_mask
;
4006 /* ppc64 ELF linker hash table. */
4008 struct ppc_link_hash_table
4010 struct elf_link_hash_table elf
;
4012 /* The stub hash table. */
4013 struct bfd_hash_table stub_hash_table
;
4015 /* Another hash table for plt_branch stubs. */
4016 struct bfd_hash_table branch_hash_table
;
4018 /* Hash table for function prologue tocsave. */
4019 htab_t tocsave_htab
;
4021 /* Various options and other info passed from the linker. */
4022 struct ppc64_elf_params
*params
;
4024 /* The size of sec_info below. */
4025 unsigned int sec_info_arr_size
;
4027 /* Per-section array of extra section info. Done this way rather
4028 than as part of ppc64_elf_section_data so we have the info for
4029 non-ppc64 sections. */
4032 /* Along with elf_gp, specifies the TOC pointer used by this section. */
4037 /* The section group that this section belongs to. */
4038 struct map_stub
*group
;
4039 /* A temp section list pointer. */
4044 /* Linked list of groups. */
4045 struct map_stub
*group
;
4047 /* Temp used when calculating TOC pointers. */
4050 asection
*toc_first_sec
;
4052 /* Used when adding symbols. */
4053 struct ppc_link_hash_entry
*dot_syms
;
4055 /* Shortcuts to get to dynamic linker sections. */
4060 asection
*glink_eh_frame
;
4062 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
4063 struct ppc_link_hash_entry
*tls_get_addr
;
4064 struct ppc_link_hash_entry
*tls_get_addr_fd
;
4066 /* The size of reliplt used by got entry relocs. */
4067 bfd_size_type got_reli_size
;
4070 unsigned long stub_count
[ppc_stub_global_entry
];
4072 /* Number of stubs against global syms. */
4073 unsigned long stub_globals
;
4075 /* Set if we're linking code with function descriptors. */
4076 unsigned int opd_abi
:1;
4078 /* Support for multiple toc sections. */
4079 unsigned int do_multi_toc
:1;
4080 unsigned int multi_toc_needed
:1;
4081 unsigned int second_toc_pass
:1;
4082 unsigned int do_toc_opt
:1;
4085 unsigned int stub_error
:1;
4087 /* Whether func_desc_adjust needs to be run over symbols. */
4088 unsigned int need_func_desc_adj
:1;
4090 /* Incremented every time we size stubs. */
4091 unsigned int stub_iteration
;
4093 /* Small local sym cache. */
4094 struct sym_cache sym_cache
;
4097 /* Rename some of the generic section flags to better document how they
4100 /* Nonzero if this section has TLS related relocations. */
4101 #define has_tls_reloc sec_flg0
4103 /* Nonzero if this section has a call to __tls_get_addr. */
4104 #define has_tls_get_addr_call sec_flg1
4106 /* Nonzero if this section has any toc or got relocs. */
4107 #define has_toc_reloc sec_flg2
4109 /* Nonzero if this section has a call to another section that uses
4111 #define makes_toc_func_call sec_flg3
4113 /* Recursion protection when determining above flag. */
4114 #define call_check_in_progress sec_flg4
4115 #define call_check_done sec_flg5
4117 /* Get the ppc64 ELF linker hash table from a link_info structure. */
4119 #define ppc_hash_table(p) \
4120 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4121 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
4123 #define ppc_stub_hash_lookup(table, string, create, copy) \
4124 ((struct ppc_stub_hash_entry *) \
4125 bfd_hash_lookup ((table), (string), (create), (copy)))
4127 #define ppc_branch_hash_lookup(table, string, create, copy) \
4128 ((struct ppc_branch_hash_entry *) \
4129 bfd_hash_lookup ((table), (string), (create), (copy)))
4131 /* Create an entry in the stub hash table. */
4133 static struct bfd_hash_entry
*
4134 stub_hash_newfunc (struct bfd_hash_entry
*entry
,
4135 struct bfd_hash_table
*table
,
4138 /* Allocate the structure if it has not already been allocated by a
4142 entry
= bfd_hash_allocate (table
, sizeof (struct ppc_stub_hash_entry
));
4147 /* Call the allocation method of the superclass. */
4148 entry
= bfd_hash_newfunc (entry
, table
, string
);
4151 struct ppc_stub_hash_entry
*eh
;
4153 /* Initialize the local fields. */
4154 eh
= (struct ppc_stub_hash_entry
*) entry
;
4155 eh
->stub_type
= ppc_stub_none
;
4157 eh
->stub_offset
= 0;
4158 eh
->target_value
= 0;
4159 eh
->target_section
= NULL
;
4168 /* Create an entry in the branch hash table. */
4170 static struct bfd_hash_entry
*
4171 branch_hash_newfunc (struct bfd_hash_entry
*entry
,
4172 struct bfd_hash_table
*table
,
4175 /* Allocate the structure if it has not already been allocated by a
4179 entry
= bfd_hash_allocate (table
, sizeof (struct ppc_branch_hash_entry
));
4184 /* Call the allocation method of the superclass. */
4185 entry
= bfd_hash_newfunc (entry
, table
, string
);
4188 struct ppc_branch_hash_entry
*eh
;
4190 /* Initialize the local fields. */
4191 eh
= (struct ppc_branch_hash_entry
*) entry
;
4199 /* Create an entry in a ppc64 ELF linker hash table. */
4201 static struct bfd_hash_entry
*
4202 link_hash_newfunc (struct bfd_hash_entry
*entry
,
4203 struct bfd_hash_table
*table
,
4206 /* Allocate the structure if it has not already been allocated by a
4210 entry
= bfd_hash_allocate (table
, sizeof (struct ppc_link_hash_entry
));
4215 /* Call the allocation method of the superclass. */
4216 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
4219 struct ppc_link_hash_entry
*eh
= (struct ppc_link_hash_entry
*) entry
;
4221 memset (&eh
->u
.stub_cache
, 0,
4222 (sizeof (struct ppc_link_hash_entry
)
4223 - offsetof (struct ppc_link_hash_entry
, u
.stub_cache
)));
4225 /* When making function calls, old ABI code references function entry
4226 points (dot symbols), while new ABI code references the function
4227 descriptor symbol. We need to make any combination of reference and
4228 definition work together, without breaking archive linking.
4230 For a defined function "foo" and an undefined call to "bar":
4231 An old object defines "foo" and ".foo", references ".bar" (possibly
4233 A new object defines "foo" and references "bar".
4235 A new object thus has no problem with its undefined symbols being
4236 satisfied by definitions in an old object. On the other hand, the
4237 old object won't have ".bar" satisfied by a new object.
4239 Keep a list of newly added dot-symbols. */
4241 if (string
[0] == '.')
4243 struct ppc_link_hash_table
*htab
;
4245 htab
= (struct ppc_link_hash_table
*) table
;
4246 eh
->u
.next_dot_sym
= htab
->dot_syms
;
4247 htab
->dot_syms
= eh
;
4254 struct tocsave_entry
{
4260 tocsave_htab_hash (const void *p
)
4262 const struct tocsave_entry
*e
= (const struct tocsave_entry
*) p
;
4263 return ((bfd_vma
)(intptr_t) e
->sec
^ e
->offset
) >> 3;
4267 tocsave_htab_eq (const void *p1
, const void *p2
)
4269 const struct tocsave_entry
*e1
= (const struct tocsave_entry
*) p1
;
4270 const struct tocsave_entry
*e2
= (const struct tocsave_entry
*) p2
;
4271 return e1
->sec
== e2
->sec
&& e1
->offset
== e2
->offset
;
4274 /* Destroy a ppc64 ELF linker hash table. */
4277 ppc64_elf_link_hash_table_free (bfd
*obfd
)
4279 struct ppc_link_hash_table
*htab
;
4281 htab
= (struct ppc_link_hash_table
*) obfd
->link
.hash
;
4282 if (htab
->tocsave_htab
)
4283 htab_delete (htab
->tocsave_htab
);
4284 bfd_hash_table_free (&htab
->branch_hash_table
);
4285 bfd_hash_table_free (&htab
->stub_hash_table
);
4286 _bfd_elf_link_hash_table_free (obfd
);
4289 /* Create a ppc64 ELF linker hash table. */
4291 static struct bfd_link_hash_table
*
4292 ppc64_elf_link_hash_table_create (bfd
*abfd
)
4294 struct ppc_link_hash_table
*htab
;
4295 bfd_size_type amt
= sizeof (struct ppc_link_hash_table
);
4297 htab
= bfd_zmalloc (amt
);
4301 if (!_bfd_elf_link_hash_table_init (&htab
->elf
, abfd
, link_hash_newfunc
,
4302 sizeof (struct ppc_link_hash_entry
),
4309 /* Init the stub hash table too. */
4310 if (!bfd_hash_table_init (&htab
->stub_hash_table
, stub_hash_newfunc
,
4311 sizeof (struct ppc_stub_hash_entry
)))
4313 _bfd_elf_link_hash_table_free (abfd
);
4317 /* And the branch hash table. */
4318 if (!bfd_hash_table_init (&htab
->branch_hash_table
, branch_hash_newfunc
,
4319 sizeof (struct ppc_branch_hash_entry
)))
4321 bfd_hash_table_free (&htab
->stub_hash_table
);
4322 _bfd_elf_link_hash_table_free (abfd
);
4326 htab
->tocsave_htab
= htab_try_create (1024,
4330 if (htab
->tocsave_htab
== NULL
)
4332 ppc64_elf_link_hash_table_free (abfd
);
4335 htab
->elf
.root
.hash_table_free
= ppc64_elf_link_hash_table_free
;
4337 /* Initializing two fields of the union is just cosmetic. We really
4338 only care about glist, but when compiled on a 32-bit host the
4339 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4340 debugger inspection of these fields look nicer. */
4341 htab
->elf
.init_got_refcount
.refcount
= 0;
4342 htab
->elf
.init_got_refcount
.glist
= NULL
;
4343 htab
->elf
.init_plt_refcount
.refcount
= 0;
4344 htab
->elf
.init_plt_refcount
.glist
= NULL
;
4345 htab
->elf
.init_got_offset
.offset
= 0;
4346 htab
->elf
.init_got_offset
.glist
= NULL
;
4347 htab
->elf
.init_plt_offset
.offset
= 0;
4348 htab
->elf
.init_plt_offset
.glist
= NULL
;
4350 return &htab
->elf
.root
;
4353 /* Create sections for linker generated code. */
4356 create_linkage_sections (bfd
*dynobj
, struct bfd_link_info
*info
)
4358 struct ppc_link_hash_table
*htab
;
4361 htab
= ppc_hash_table (info
);
4363 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
4364 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
4365 if (htab
->params
->save_restore_funcs
)
4367 /* Create .sfpr for code to save and restore fp regs. */
4368 htab
->sfpr
= bfd_make_section_anyway_with_flags (dynobj
, ".sfpr",
4370 if (htab
->sfpr
== NULL
4371 || ! bfd_set_section_alignment (dynobj
, htab
->sfpr
, 2))
4375 if (bfd_link_relocatable (info
))
4378 /* Create .glink for lazy dynamic linking support. */
4379 htab
->glink
= bfd_make_section_anyway_with_flags (dynobj
, ".glink",
4381 if (htab
->glink
== NULL
4382 || ! bfd_set_section_alignment (dynobj
, htab
->glink
, 3))
4385 if (!info
->no_ld_generated_unwind_info
)
4387 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_HAS_CONTENTS
4388 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
4389 htab
->glink_eh_frame
= bfd_make_section_anyway_with_flags (dynobj
,
4392 if (htab
->glink_eh_frame
== NULL
4393 || !bfd_set_section_alignment (dynobj
, htab
->glink_eh_frame
, 2))
4397 flags
= SEC_ALLOC
| SEC_LINKER_CREATED
;
4398 htab
->elf
.iplt
= bfd_make_section_anyway_with_flags (dynobj
, ".iplt", flags
);
4399 if (htab
->elf
.iplt
== NULL
4400 || ! bfd_set_section_alignment (dynobj
, htab
->elf
.iplt
, 3))
4403 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
4404 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
4406 = bfd_make_section_anyway_with_flags (dynobj
, ".rela.iplt", flags
);
4407 if (htab
->elf
.irelplt
== NULL
4408 || ! bfd_set_section_alignment (dynobj
, htab
->elf
.irelplt
, 3))
4411 /* Create branch lookup table for plt_branch stubs. */
4412 flags
= (SEC_ALLOC
| SEC_LOAD
4413 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
4414 htab
->brlt
= bfd_make_section_anyway_with_flags (dynobj
, ".branch_lt",
4416 if (htab
->brlt
== NULL
4417 || ! bfd_set_section_alignment (dynobj
, htab
->brlt
, 3))
4420 if (!bfd_link_pic (info
))
4423 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
4424 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
4425 htab
->relbrlt
= bfd_make_section_anyway_with_flags (dynobj
,
4428 if (htab
->relbrlt
== NULL
4429 || ! bfd_set_section_alignment (dynobj
, htab
->relbrlt
, 3))
4435 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4438 ppc64_elf_init_stub_bfd (struct bfd_link_info
*info
,
4439 struct ppc64_elf_params
*params
)
4441 struct ppc_link_hash_table
*htab
;
4443 elf_elfheader (params
->stub_bfd
)->e_ident
[EI_CLASS
] = ELFCLASS64
;
4445 /* Always hook our dynamic sections into the first bfd, which is the
4446 linker created stub bfd. This ensures that the GOT header is at
4447 the start of the output TOC section. */
4448 htab
= ppc_hash_table (info
);
4449 htab
->elf
.dynobj
= params
->stub_bfd
;
4450 htab
->params
= params
;
4452 return create_linkage_sections (htab
->elf
.dynobj
, info
);
4455 /* Build a name for an entry in the stub hash table. */
4458 ppc_stub_name (const asection
*input_section
,
4459 const asection
*sym_sec
,
4460 const struct ppc_link_hash_entry
*h
,
4461 const Elf_Internal_Rela
*rel
)
4466 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4467 offsets from a sym as a branch target? In fact, we could
4468 probably assume the addend is always zero. */
4469 BFD_ASSERT (((int) rel
->r_addend
& 0xffffffff) == rel
->r_addend
);
4473 len
= 8 + 1 + strlen (h
->elf
.root
.root
.string
) + 1 + 8 + 1;
4474 stub_name
= bfd_malloc (len
);
4475 if (stub_name
== NULL
)
4478 len
= sprintf (stub_name
, "%08x.%s+%x",
4479 input_section
->id
& 0xffffffff,
4480 h
->elf
.root
.root
.string
,
4481 (int) rel
->r_addend
& 0xffffffff);
4485 len
= 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4486 stub_name
= bfd_malloc (len
);
4487 if (stub_name
== NULL
)
4490 len
= sprintf (stub_name
, "%08x.%x:%x+%x",
4491 input_section
->id
& 0xffffffff,
4492 sym_sec
->id
& 0xffffffff,
4493 (int) ELF64_R_SYM (rel
->r_info
) & 0xffffffff,
4494 (int) rel
->r_addend
& 0xffffffff);
4496 if (len
> 2 && stub_name
[len
- 2] == '+' && stub_name
[len
- 1] == '0')
4497 stub_name
[len
- 2] = 0;
4501 /* Look up an entry in the stub hash. Stub entries are cached because
4502 creating the stub name takes a bit of time. */
4504 static struct ppc_stub_hash_entry
*
4505 ppc_get_stub_entry (const asection
*input_section
,
4506 const asection
*sym_sec
,
4507 struct ppc_link_hash_entry
*h
,
4508 const Elf_Internal_Rela
*rel
,
4509 struct ppc_link_hash_table
*htab
)
4511 struct ppc_stub_hash_entry
*stub_entry
;
4512 struct map_stub
*group
;
4514 /* If this input section is part of a group of sections sharing one
4515 stub section, then use the id of the first section in the group.
4516 Stub names need to include a section id, as there may well be
4517 more than one stub used to reach say, printf, and we need to
4518 distinguish between them. */
4519 group
= htab
->sec_info
[input_section
->id
].u
.group
;
4523 if (h
!= NULL
&& h
->u
.stub_cache
!= NULL
4524 && h
->u
.stub_cache
->h
== h
4525 && h
->u
.stub_cache
->group
== group
)
4527 stub_entry
= h
->u
.stub_cache
;
4533 stub_name
= ppc_stub_name (group
->link_sec
, sym_sec
, h
, rel
);
4534 if (stub_name
== NULL
)
4537 stub_entry
= ppc_stub_hash_lookup (&htab
->stub_hash_table
,
4538 stub_name
, FALSE
, FALSE
);
4540 h
->u
.stub_cache
= stub_entry
;
4548 /* Add a new stub entry to the stub hash. Not all fields of the new
4549 stub entry are initialised. */
4551 static struct ppc_stub_hash_entry
*
4552 ppc_add_stub (const char *stub_name
,
4554 struct bfd_link_info
*info
)
4556 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
4557 struct map_stub
*group
;
4560 struct ppc_stub_hash_entry
*stub_entry
;
4562 group
= htab
->sec_info
[section
->id
].u
.group
;
4563 link_sec
= group
->link_sec
;
4564 stub_sec
= group
->stub_sec
;
4565 if (stub_sec
== NULL
)
4571 namelen
= strlen (link_sec
->name
);
4572 len
= namelen
+ sizeof (STUB_SUFFIX
);
4573 s_name
= bfd_alloc (htab
->params
->stub_bfd
, len
);
4577 memcpy (s_name
, link_sec
->name
, namelen
);
4578 memcpy (s_name
+ namelen
, STUB_SUFFIX
, sizeof (STUB_SUFFIX
));
4579 stub_sec
= (*htab
->params
->add_stub_section
) (s_name
, link_sec
);
4580 if (stub_sec
== NULL
)
4582 group
->stub_sec
= stub_sec
;
4585 /* Enter this entry into the linker stub hash table. */
4586 stub_entry
= ppc_stub_hash_lookup (&htab
->stub_hash_table
, stub_name
,
4588 if (stub_entry
== NULL
)
4590 /* xgettext:c-format */
4591 info
->callbacks
->einfo (_("%P: %B: cannot create stub entry %s\n"),
4592 section
->owner
, stub_name
);
4596 stub_entry
->group
= group
;
4597 stub_entry
->stub_offset
= 0;
4601 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4602 not already done. */
4605 create_got_section (bfd
*abfd
, struct bfd_link_info
*info
)
4607 asection
*got
, *relgot
;
4609 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
4611 if (!is_ppc64_elf (abfd
))
4617 && !_bfd_elf_create_got_section (htab
->elf
.dynobj
, info
))
4620 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
4621 | SEC_LINKER_CREATED
);
4623 got
= bfd_make_section_anyway_with_flags (abfd
, ".got", flags
);
4625 || !bfd_set_section_alignment (abfd
, got
, 3))
4628 relgot
= bfd_make_section_anyway_with_flags (abfd
, ".rela.got",
4629 flags
| SEC_READONLY
);
4631 || ! bfd_set_section_alignment (abfd
, relgot
, 3))
4634 ppc64_elf_tdata (abfd
)->got
= got
;
4635 ppc64_elf_tdata (abfd
)->relgot
= relgot
;
4639 /* Follow indirect and warning symbol links. */
4641 static inline struct bfd_link_hash_entry
*
4642 follow_link (struct bfd_link_hash_entry
*h
)
4644 while (h
->type
== bfd_link_hash_indirect
4645 || h
->type
== bfd_link_hash_warning
)
4650 static inline struct elf_link_hash_entry
*
4651 elf_follow_link (struct elf_link_hash_entry
*h
)
4653 return (struct elf_link_hash_entry
*) follow_link (&h
->root
);
4656 static inline struct ppc_link_hash_entry
*
4657 ppc_follow_link (struct ppc_link_hash_entry
*h
)
4659 return (struct ppc_link_hash_entry
*) follow_link (&h
->elf
.root
);
4662 /* Merge PLT info on FROM with that on TO. */
4665 move_plt_plist (struct ppc_link_hash_entry
*from
,
4666 struct ppc_link_hash_entry
*to
)
4668 if (from
->elf
.plt
.plist
!= NULL
)
4670 if (to
->elf
.plt
.plist
!= NULL
)
4672 struct plt_entry
**entp
;
4673 struct plt_entry
*ent
;
4675 for (entp
= &from
->elf
.plt
.plist
; (ent
= *entp
) != NULL
; )
4677 struct plt_entry
*dent
;
4679 for (dent
= to
->elf
.plt
.plist
; dent
!= NULL
; dent
= dent
->next
)
4680 if (dent
->addend
== ent
->addend
)
4682 dent
->plt
.refcount
+= ent
->plt
.refcount
;
4689 *entp
= to
->elf
.plt
.plist
;
4692 to
->elf
.plt
.plist
= from
->elf
.plt
.plist
;
4693 from
->elf
.plt
.plist
= NULL
;
4697 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4700 ppc64_elf_copy_indirect_symbol (struct bfd_link_info
*info
,
4701 struct elf_link_hash_entry
*dir
,
4702 struct elf_link_hash_entry
*ind
)
4704 struct ppc_link_hash_entry
*edir
, *eind
;
4706 edir
= (struct ppc_link_hash_entry
*) dir
;
4707 eind
= (struct ppc_link_hash_entry
*) ind
;
4709 edir
->is_func
|= eind
->is_func
;
4710 edir
->is_func_descriptor
|= eind
->is_func_descriptor
;
4711 edir
->tls_mask
|= eind
->tls_mask
;
4712 if (eind
->oh
!= NULL
)
4713 edir
->oh
= ppc_follow_link (eind
->oh
);
4715 if (edir
->elf
.versioned
!= versioned_hidden
)
4717 /* If called to transfer flags for a weakdef during processing
4718 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4719 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4720 if (!(ELIMINATE_COPY_RELOCS
4721 && eind
->elf
.root
.type
!= bfd_link_hash_indirect
4722 && edir
->elf
.dynamic_adjusted
))
4723 edir
->elf
.non_got_ref
|= eind
->elf
.non_got_ref
;
4725 edir
->elf
.ref_dynamic
|= eind
->elf
.ref_dynamic
;
4726 edir
->elf
.ref_regular
|= eind
->elf
.ref_regular
;
4727 edir
->elf
.ref_regular_nonweak
|= eind
->elf
.ref_regular_nonweak
;
4728 edir
->elf
.needs_plt
|= eind
->elf
.needs_plt
;
4729 edir
->elf
.pointer_equality_needed
|= eind
->elf
.pointer_equality_needed
;
4732 /* If we were called to copy over info for a weak sym, don't copy
4733 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4734 in order to simplify readonly_dynrelocs and save a field in the
4735 symbol hash entry, but that means dyn_relocs can't be used in any
4736 tests about a specific symbol, or affect other symbol flags which
4738 Chain weakdefs so we can get from the weakdef back to an alias.
4739 The list is circular so that we don't need to use u.weakdef as
4740 well as this list to look at all aliases. */
4741 if (eind
->elf
.root
.type
!= bfd_link_hash_indirect
)
4743 struct ppc_link_hash_entry
*cur
, *add
, *next
;
4748 cur
= edir
->weakref
;
4753 /* We can be called twice for the same symbols.
4754 Don't make multiple loops. */
4758 } while (cur
!= edir
);
4760 next
= add
->weakref
;
4763 add
->weakref
= edir
->weakref
!= NULL
? edir
->weakref
: edir
;
4764 edir
->weakref
= add
;
4767 } while (add
!= NULL
&& add
!= eind
);
4771 /* Copy over any dynamic relocs we may have on the indirect sym. */
4772 if (eind
->dyn_relocs
!= NULL
)
4774 if (edir
->dyn_relocs
!= NULL
)
4776 struct elf_dyn_relocs
**pp
;
4777 struct elf_dyn_relocs
*p
;
4779 /* Add reloc counts against the indirect sym to the direct sym
4780 list. Merge any entries against the same section. */
4781 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
4783 struct elf_dyn_relocs
*q
;
4785 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
4786 if (q
->sec
== p
->sec
)
4788 q
->pc_count
+= p
->pc_count
;
4789 q
->count
+= p
->count
;
4796 *pp
= edir
->dyn_relocs
;
4799 edir
->dyn_relocs
= eind
->dyn_relocs
;
4800 eind
->dyn_relocs
= NULL
;
4803 /* Copy over got entries that we may have already seen to the
4804 symbol which just became indirect. */
4805 if (eind
->elf
.got
.glist
!= NULL
)
4807 if (edir
->elf
.got
.glist
!= NULL
)
4809 struct got_entry
**entp
;
4810 struct got_entry
*ent
;
4812 for (entp
= &eind
->elf
.got
.glist
; (ent
= *entp
) != NULL
; )
4814 struct got_entry
*dent
;
4816 for (dent
= edir
->elf
.got
.glist
; dent
!= NULL
; dent
= dent
->next
)
4817 if (dent
->addend
== ent
->addend
4818 && dent
->owner
== ent
->owner
4819 && dent
->tls_type
== ent
->tls_type
)
4821 dent
->got
.refcount
+= ent
->got
.refcount
;
4828 *entp
= edir
->elf
.got
.glist
;
4831 edir
->elf
.got
.glist
= eind
->elf
.got
.glist
;
4832 eind
->elf
.got
.glist
= NULL
;
4835 /* And plt entries. */
4836 move_plt_plist (eind
, edir
);
4838 if (eind
->elf
.dynindx
!= -1)
4840 if (edir
->elf
.dynindx
!= -1)
4841 _bfd_elf_strtab_delref (elf_hash_table (info
)->dynstr
,
4842 edir
->elf
.dynstr_index
);
4843 edir
->elf
.dynindx
= eind
->elf
.dynindx
;
4844 edir
->elf
.dynstr_index
= eind
->elf
.dynstr_index
;
4845 eind
->elf
.dynindx
= -1;
4846 eind
->elf
.dynstr_index
= 0;
4850 /* Find the function descriptor hash entry from the given function code
4851 hash entry FH. Link the entries via their OH fields. */
4853 static struct ppc_link_hash_entry
*
4854 lookup_fdh (struct ppc_link_hash_entry
*fh
, struct ppc_link_hash_table
*htab
)
4856 struct ppc_link_hash_entry
*fdh
= fh
->oh
;
4860 const char *fd_name
= fh
->elf
.root
.root
.string
+ 1;
4862 fdh
= (struct ppc_link_hash_entry
*)
4863 elf_link_hash_lookup (&htab
->elf
, fd_name
, FALSE
, FALSE
, FALSE
);
4867 fdh
->is_func_descriptor
= 1;
4873 fdh
= ppc_follow_link (fdh
);
4874 fdh
->is_func_descriptor
= 1;
4879 /* Make a fake function descriptor sym for the undefined code sym FH. */
4881 static struct ppc_link_hash_entry
*
4882 make_fdh (struct bfd_link_info
*info
,
4883 struct ppc_link_hash_entry
*fh
)
4885 bfd
*abfd
= fh
->elf
.root
.u
.undef
.abfd
;
4886 struct bfd_link_hash_entry
*bh
= NULL
;
4887 struct ppc_link_hash_entry
*fdh
;
4888 flagword flags
= (fh
->elf
.root
.type
== bfd_link_hash_undefweak
4892 if (!_bfd_generic_link_add_one_symbol (info
, abfd
,
4893 fh
->elf
.root
.root
.string
+ 1,
4894 flags
, bfd_und_section_ptr
, 0,
4895 NULL
, FALSE
, FALSE
, &bh
))
4898 fdh
= (struct ppc_link_hash_entry
*) bh
;
4899 fdh
->elf
.non_elf
= 0;
4901 fdh
->is_func_descriptor
= 1;
4908 /* Fix function descriptor symbols defined in .opd sections to be
4912 ppc64_elf_add_symbol_hook (bfd
*ibfd
,
4913 struct bfd_link_info
*info
,
4914 Elf_Internal_Sym
*isym
,
4916 flagword
*flags ATTRIBUTE_UNUSED
,
4920 if (ELF_ST_TYPE (isym
->st_info
) == STT_GNU_IFUNC
4921 && (ibfd
->flags
& DYNAMIC
) == 0
4922 && bfd_get_flavour (info
->output_bfd
) == bfd_target_elf_flavour
)
4923 elf_tdata (info
->output_bfd
)->has_gnu_symbols
|= elf_gnu_symbol_ifunc
;
4926 && strcmp ((*sec
)->name
, ".opd") == 0)
4930 if (!(ELF_ST_TYPE (isym
->st_info
) == STT_GNU_IFUNC
4931 || ELF_ST_TYPE (isym
->st_info
) == STT_FUNC
))
4932 isym
->st_info
= ELF_ST_INFO (ELF_ST_BIND (isym
->st_info
), STT_FUNC
);
4934 /* If the symbol is a function defined in .opd, and the function
4935 code is in a discarded group, let it appear to be undefined. */
4936 if (!bfd_link_relocatable (info
)
4937 && (*sec
)->reloc_count
!= 0
4938 && opd_entry_value (*sec
, *value
, &code_sec
, NULL
,
4939 FALSE
) != (bfd_vma
) -1
4940 && discarded_section (code_sec
))
4942 *sec
= bfd_und_section_ptr
;
4943 isym
->st_shndx
= SHN_UNDEF
;
4946 else if (*sec
!= NULL
4947 && strcmp ((*sec
)->name
, ".toc") == 0
4948 && ELF_ST_TYPE (isym
->st_info
) == STT_OBJECT
)
4950 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
4952 htab
->params
->object_in_toc
= 1;
4955 if ((STO_PPC64_LOCAL_MASK
& isym
->st_other
) != 0)
4957 if (abiversion (ibfd
) == 0)
4958 set_abiversion (ibfd
, 2);
4959 else if (abiversion (ibfd
) == 1)
4961 info
->callbacks
->einfo (_("%P: symbol '%s' has invalid st_other"
4962 " for ABI version 1\n"), name
);
4963 bfd_set_error (bfd_error_bad_value
);
4971 /* Merge non-visibility st_other attributes: local entry point. */
4974 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry
*h
,
4975 const Elf_Internal_Sym
*isym
,
4976 bfd_boolean definition
,
4977 bfd_boolean dynamic
)
4979 if (definition
&& !dynamic
)
4980 h
->other
= ((isym
->st_other
& ~ELF_ST_VISIBILITY (-1))
4981 | ELF_ST_VISIBILITY (h
->other
));
4984 /* Hook called on merging a symbol. We use this to clear "fake" since
4985 we now have a real symbol. */
4988 ppc64_elf_merge_symbol (struct elf_link_hash_entry
*h
,
4989 const Elf_Internal_Sym
*isym ATTRIBUTE_UNUSED
,
4990 asection
**psec ATTRIBUTE_UNUSED
,
4991 bfd_boolean newdef ATTRIBUTE_UNUSED
,
4992 bfd_boolean olddef ATTRIBUTE_UNUSED
,
4993 bfd
*oldbfd ATTRIBUTE_UNUSED
,
4994 const asection
*oldsec ATTRIBUTE_UNUSED
)
4996 ((struct ppc_link_hash_entry
*) h
)->fake
= 0;
5000 /* This function makes an old ABI object reference to ".bar" cause the
5001 inclusion of a new ABI object archive that defines "bar".
5002 NAME is a symbol defined in an archive. Return a symbol in the hash
5003 table that might be satisfied by the archive symbols. */
5005 static struct elf_link_hash_entry
*
5006 ppc64_elf_archive_symbol_lookup (bfd
*abfd
,
5007 struct bfd_link_info
*info
,
5010 struct elf_link_hash_entry
*h
;
5014 h
= _bfd_elf_archive_symbol_lookup (abfd
, info
, name
);
5016 /* Don't return this sym if it is a fake function descriptor
5017 created by add_symbol_adjust. */
5018 && !((struct ppc_link_hash_entry
*) h
)->fake
)
5024 len
= strlen (name
);
5025 dot_name
= bfd_alloc (abfd
, len
+ 2);
5026 if (dot_name
== NULL
)
5027 return (struct elf_link_hash_entry
*) 0 - 1;
5029 memcpy (dot_name
+ 1, name
, len
+ 1);
5030 h
= _bfd_elf_archive_symbol_lookup (abfd
, info
, dot_name
);
5031 bfd_release (abfd
, dot_name
);
5035 /* This function satisfies all old ABI object references to ".bar" if a
5036 new ABI object defines "bar". Well, at least, undefined dot symbols
5037 are made weak. This stops later archive searches from including an
5038 object if we already have a function descriptor definition. It also
5039 prevents the linker complaining about undefined symbols.
5040 We also check and correct mismatched symbol visibility here. The
5041 most restrictive visibility of the function descriptor and the
5042 function entry symbol is used. */
5045 add_symbol_adjust (struct ppc_link_hash_entry
*eh
, struct bfd_link_info
*info
)
5047 struct ppc_link_hash_table
*htab
;
5048 struct ppc_link_hash_entry
*fdh
;
5050 if (eh
->elf
.root
.type
== bfd_link_hash_warning
)
5051 eh
= (struct ppc_link_hash_entry
*) eh
->elf
.root
.u
.i
.link
;
5053 if (eh
->elf
.root
.type
== bfd_link_hash_indirect
)
5056 if (eh
->elf
.root
.root
.string
[0] != '.')
5059 htab
= ppc_hash_table (info
);
5063 fdh
= lookup_fdh (eh
, htab
);
5065 && !bfd_link_relocatable (info
)
5066 && (eh
->elf
.root
.type
== bfd_link_hash_undefined
5067 || eh
->elf
.root
.type
== bfd_link_hash_undefweak
)
5068 && eh
->elf
.ref_regular
)
5070 /* Make an undefined function descriptor sym, in order to
5071 pull in an --as-needed shared lib. Archives are handled
5073 fdh
= make_fdh (info
, eh
);
5080 unsigned entry_vis
= ELF_ST_VISIBILITY (eh
->elf
.other
) - 1;
5081 unsigned descr_vis
= ELF_ST_VISIBILITY (fdh
->elf
.other
) - 1;
5083 /* Make both descriptor and entry symbol have the most
5084 constraining visibility of either symbol. */
5085 if (entry_vis
< descr_vis
)
5086 fdh
->elf
.other
+= entry_vis
- descr_vis
;
5087 else if (entry_vis
> descr_vis
)
5088 eh
->elf
.other
+= descr_vis
- entry_vis
;
5090 /* Propagate reference flags from entry symbol to function
5091 descriptor symbol. */
5092 fdh
->elf
.root
.non_ir_ref
|= eh
->elf
.root
.non_ir_ref
;
5093 fdh
->elf
.ref_regular
|= eh
->elf
.ref_regular
;
5094 fdh
->elf
.ref_regular_nonweak
|= eh
->elf
.ref_regular_nonweak
;
5096 if (!fdh
->elf
.forced_local
5097 && fdh
->elf
.dynindx
== -1
5098 && fdh
->elf
.versioned
!= versioned_hidden
5099 && (bfd_link_dll (info
)
5100 || fdh
->elf
.def_dynamic
5101 || fdh
->elf
.ref_dynamic
)
5102 && (eh
->elf
.ref_regular
5103 || eh
->elf
.def_regular
))
5105 if (! bfd_elf_link_record_dynamic_symbol (info
, &fdh
->elf
))
5113 /* Set up opd section info and abiversion for IBFD, and process list
5114 of dot-symbols we made in link_hash_newfunc. */
5117 ppc64_elf_before_check_relocs (bfd
*ibfd
, struct bfd_link_info
*info
)
5119 struct ppc_link_hash_table
*htab
;
5120 struct ppc_link_hash_entry
**p
, *eh
;
5121 asection
*opd
= bfd_get_section_by_name (ibfd
, ".opd");
5123 if (opd
!= NULL
&& opd
->size
!= 0)
5125 if (abiversion (ibfd
) == 0)
5126 set_abiversion (ibfd
, 1);
5127 else if (abiversion (ibfd
) >= 2)
5129 /* xgettext:c-format */
5130 info
->callbacks
->einfo (_("%P: %B .opd not allowed in ABI"
5132 ibfd
, abiversion (ibfd
));
5133 bfd_set_error (bfd_error_bad_value
);
5137 if ((ibfd
->flags
& DYNAMIC
) == 0
5138 && (opd
->flags
& SEC_RELOC
) != 0
5139 && opd
->reloc_count
!= 0
5140 && !bfd_is_abs_section (opd
->output_section
))
5142 /* Garbage collection needs some extra help with .opd sections.
5143 We don't want to necessarily keep everything referenced by
5144 relocs in .opd, as that would keep all functions. Instead,
5145 if we reference an .opd symbol (a function descriptor), we
5146 want to keep the function code symbol's section. This is
5147 easy for global symbols, but for local syms we need to keep
5148 information about the associated function section. */
5150 asection
**opd_sym_map
;
5152 amt
= OPD_NDX (opd
->size
) * sizeof (*opd_sym_map
);
5153 opd_sym_map
= bfd_zalloc (ibfd
, amt
);
5154 if (opd_sym_map
== NULL
)
5156 ppc64_elf_section_data (opd
)->u
.opd
.func_sec
= opd_sym_map
;
5157 BFD_ASSERT (ppc64_elf_section_data (opd
)->sec_type
== sec_normal
);
5158 ppc64_elf_section_data (opd
)->sec_type
= sec_opd
;
5162 if (!is_ppc64_elf (info
->output_bfd
))
5164 htab
= ppc_hash_table (info
);
5168 /* For input files without an explicit abiversion in e_flags
5169 we should have flagged any with symbol st_other bits set
5170 as ELFv1 and above flagged those with .opd as ELFv2.
5171 Set the output abiversion if not yet set, and for any input
5172 still ambiguous, take its abiversion from the output.
5173 Differences in ABI are reported later. */
5174 if (abiversion (info
->output_bfd
) == 0)
5175 set_abiversion (info
->output_bfd
, abiversion (ibfd
));
5176 else if (abiversion (ibfd
) == 0)
5177 set_abiversion (ibfd
, abiversion (info
->output_bfd
));
5179 p
= &htab
->dot_syms
;
5180 while ((eh
= *p
) != NULL
)
5183 if (&eh
->elf
== htab
->elf
.hgot
)
5185 else if (htab
->elf
.hgot
== NULL
5186 && strcmp (eh
->elf
.root
.root
.string
, ".TOC.") == 0)
5187 htab
->elf
.hgot
= &eh
->elf
;
5188 else if (abiversion (ibfd
) <= 1)
5190 htab
->need_func_desc_adj
= 1;
5191 if (!add_symbol_adjust (eh
, info
))
5194 p
= &eh
->u
.next_dot_sym
;
5199 /* Undo hash table changes when an --as-needed input file is determined
5200 not to be needed. */
5203 ppc64_elf_notice_as_needed (bfd
*ibfd
,
5204 struct bfd_link_info
*info
,
5205 enum notice_asneeded_action act
)
5207 if (act
== notice_not_needed
)
5209 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
5214 htab
->dot_syms
= NULL
;
5216 return _bfd_elf_notice_as_needed (ibfd
, info
, act
);
5219 /* If --just-symbols against a final linked binary, then assume we need
5220 toc adjusting stubs when calling functions defined there. */
5223 ppc64_elf_link_just_syms (asection
*sec
, struct bfd_link_info
*info
)
5225 if ((sec
->flags
& SEC_CODE
) != 0
5226 && (sec
->owner
->flags
& (EXEC_P
| DYNAMIC
)) != 0
5227 && is_ppc64_elf (sec
->owner
))
5229 if (abiversion (sec
->owner
) >= 2
5230 || bfd_get_section_by_name (sec
->owner
, ".opd") != NULL
)
5231 sec
->has_toc_reloc
= 1;
5233 _bfd_elf_link_just_syms (sec
, info
);
5236 static struct plt_entry
**
5237 update_local_sym_info (bfd
*abfd
, Elf_Internal_Shdr
*symtab_hdr
,
5238 unsigned long r_symndx
, bfd_vma r_addend
, int tls_type
)
5240 struct got_entry
**local_got_ents
= elf_local_got_ents (abfd
);
5241 struct plt_entry
**local_plt
;
5242 unsigned char *local_got_tls_masks
;
5244 if (local_got_ents
== NULL
)
5246 bfd_size_type size
= symtab_hdr
->sh_info
;
5248 size
*= (sizeof (*local_got_ents
)
5249 + sizeof (*local_plt
)
5250 + sizeof (*local_got_tls_masks
));
5251 local_got_ents
= bfd_zalloc (abfd
, size
);
5252 if (local_got_ents
== NULL
)
5254 elf_local_got_ents (abfd
) = local_got_ents
;
5257 if ((tls_type
& (PLT_IFUNC
| TLS_EXPLICIT
)) == 0)
5259 struct got_entry
*ent
;
5261 for (ent
= local_got_ents
[r_symndx
]; ent
!= NULL
; ent
= ent
->next
)
5262 if (ent
->addend
== r_addend
5263 && ent
->owner
== abfd
5264 && ent
->tls_type
== tls_type
)
5268 bfd_size_type amt
= sizeof (*ent
);
5269 ent
= bfd_alloc (abfd
, amt
);
5272 ent
->next
= local_got_ents
[r_symndx
];
5273 ent
->addend
= r_addend
;
5275 ent
->tls_type
= tls_type
;
5276 ent
->is_indirect
= FALSE
;
5277 ent
->got
.refcount
= 0;
5278 local_got_ents
[r_symndx
] = ent
;
5280 ent
->got
.refcount
+= 1;
5283 local_plt
= (struct plt_entry
**) (local_got_ents
+ symtab_hdr
->sh_info
);
5284 local_got_tls_masks
= (unsigned char *) (local_plt
+ symtab_hdr
->sh_info
);
5285 local_got_tls_masks
[r_symndx
] |= tls_type
;
5287 return local_plt
+ r_symndx
;
5291 update_plt_info (bfd
*abfd
, struct plt_entry
**plist
, bfd_vma addend
)
5293 struct plt_entry
*ent
;
5295 for (ent
= *plist
; ent
!= NULL
; ent
= ent
->next
)
5296 if (ent
->addend
== addend
)
5300 bfd_size_type amt
= sizeof (*ent
);
5301 ent
= bfd_alloc (abfd
, amt
);
5305 ent
->addend
= addend
;
5306 ent
->plt
.refcount
= 0;
5309 ent
->plt
.refcount
+= 1;
5314 is_branch_reloc (enum elf_ppc64_reloc_type r_type
)
5316 return (r_type
== R_PPC64_REL24
5317 || r_type
== R_PPC64_REL14
5318 || r_type
== R_PPC64_REL14_BRTAKEN
5319 || r_type
== R_PPC64_REL14_BRNTAKEN
5320 || r_type
== R_PPC64_ADDR24
5321 || r_type
== R_PPC64_ADDR14
5322 || r_type
== R_PPC64_ADDR14_BRTAKEN
5323 || r_type
== R_PPC64_ADDR14_BRNTAKEN
);
5326 /* Look through the relocs for a section during the first phase, and
5327 calculate needed space in the global offset table, procedure
5328 linkage table, and dynamic reloc sections. */
5331 ppc64_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
5332 asection
*sec
, const Elf_Internal_Rela
*relocs
)
5334 struct ppc_link_hash_table
*htab
;
5335 Elf_Internal_Shdr
*symtab_hdr
;
5336 struct elf_link_hash_entry
**sym_hashes
;
5337 const Elf_Internal_Rela
*rel
;
5338 const Elf_Internal_Rela
*rel_end
;
5340 asection
**opd_sym_map
;
5341 struct elf_link_hash_entry
*tga
, *dottga
;
5343 if (bfd_link_relocatable (info
))
5346 /* Don't do anything special with non-loaded, non-alloced sections.
5347 In particular, any relocs in such sections should not affect GOT
5348 and PLT reference counting (ie. we don't allow them to create GOT
5349 or PLT entries), there's no possibility or desire to optimize TLS
5350 relocs, and there's not much point in propagating relocs to shared
5351 libs that the dynamic linker won't relocate. */
5352 if ((sec
->flags
& SEC_ALLOC
) == 0)
5355 BFD_ASSERT (is_ppc64_elf (abfd
));
5357 htab
= ppc_hash_table (info
);
5361 tga
= elf_link_hash_lookup (&htab
->elf
, "__tls_get_addr",
5362 FALSE
, FALSE
, TRUE
);
5363 dottga
= elf_link_hash_lookup (&htab
->elf
, ".__tls_get_addr",
5364 FALSE
, FALSE
, TRUE
);
5365 symtab_hdr
= &elf_symtab_hdr (abfd
);
5366 sym_hashes
= elf_sym_hashes (abfd
);
5369 if (ppc64_elf_section_data (sec
) != NULL
5370 && ppc64_elf_section_data (sec
)->sec_type
== sec_opd
)
5371 opd_sym_map
= ppc64_elf_section_data (sec
)->u
.opd
.func_sec
;
5373 rel_end
= relocs
+ sec
->reloc_count
;
5374 for (rel
= relocs
; rel
< rel_end
; rel
++)
5376 unsigned long r_symndx
;
5377 struct elf_link_hash_entry
*h
;
5378 enum elf_ppc64_reloc_type r_type
;
5380 struct _ppc64_elf_section_data
*ppc64_sec
;
5381 struct plt_entry
**ifunc
, **plt_list
;
5383 r_symndx
= ELF64_R_SYM (rel
->r_info
);
5384 if (r_symndx
< symtab_hdr
->sh_info
)
5388 struct ppc_link_hash_entry
*eh
;
5390 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
5391 h
= elf_follow_link (h
);
5392 eh
= (struct ppc_link_hash_entry
*) h
;
5394 /* PR15323, ref flags aren't set for references in the same
5396 h
->root
.non_ir_ref
= 1;
5397 if (eh
->is_func
&& eh
->oh
!= NULL
)
5398 eh
->oh
->elf
.root
.non_ir_ref
= 1;
5400 if (h
== htab
->elf
.hgot
)
5401 sec
->has_toc_reloc
= 1;
5408 if (h
->type
== STT_GNU_IFUNC
)
5411 ifunc
= &h
->plt
.plist
;
5416 Elf_Internal_Sym
*isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
5421 if (ELF_ST_TYPE (isym
->st_info
) == STT_GNU_IFUNC
)
5423 ifunc
= update_local_sym_info (abfd
, symtab_hdr
, r_symndx
,
5424 rel
->r_addend
, PLT_IFUNC
);
5430 r_type
= ELF64_R_TYPE (rel
->r_info
);
5435 /* These special tls relocs tie a call to __tls_get_addr with
5436 its parameter symbol. */
5439 case R_PPC64_GOT_TLSLD16
:
5440 case R_PPC64_GOT_TLSLD16_LO
:
5441 case R_PPC64_GOT_TLSLD16_HI
:
5442 case R_PPC64_GOT_TLSLD16_HA
:
5443 tls_type
= TLS_TLS
| TLS_LD
;
5446 case R_PPC64_GOT_TLSGD16
:
5447 case R_PPC64_GOT_TLSGD16_LO
:
5448 case R_PPC64_GOT_TLSGD16_HI
:
5449 case R_PPC64_GOT_TLSGD16_HA
:
5450 tls_type
= TLS_TLS
| TLS_GD
;
5453 case R_PPC64_GOT_TPREL16_DS
:
5454 case R_PPC64_GOT_TPREL16_LO_DS
:
5455 case R_PPC64_GOT_TPREL16_HI
:
5456 case R_PPC64_GOT_TPREL16_HA
:
5457 if (bfd_link_pic (info
))
5458 info
->flags
|= DF_STATIC_TLS
;
5459 tls_type
= TLS_TLS
| TLS_TPREL
;
5462 case R_PPC64_GOT_DTPREL16_DS
:
5463 case R_PPC64_GOT_DTPREL16_LO_DS
:
5464 case R_PPC64_GOT_DTPREL16_HI
:
5465 case R_PPC64_GOT_DTPREL16_HA
:
5466 tls_type
= TLS_TLS
| TLS_DTPREL
;
5468 sec
->has_tls_reloc
= 1;
5472 case R_PPC64_GOT16_DS
:
5473 case R_PPC64_GOT16_HA
:
5474 case R_PPC64_GOT16_HI
:
5475 case R_PPC64_GOT16_LO
:
5476 case R_PPC64_GOT16_LO_DS
:
5477 /* This symbol requires a global offset table entry. */
5478 sec
->has_toc_reloc
= 1;
5479 if (r_type
== R_PPC64_GOT_TLSLD16
5480 || r_type
== R_PPC64_GOT_TLSGD16
5481 || r_type
== R_PPC64_GOT_TPREL16_DS
5482 || r_type
== R_PPC64_GOT_DTPREL16_DS
5483 || r_type
== R_PPC64_GOT16
5484 || r_type
== R_PPC64_GOT16_DS
)
5486 htab
->do_multi_toc
= 1;
5487 ppc64_elf_tdata (abfd
)->has_small_toc_reloc
= 1;
5490 if (ppc64_elf_tdata (abfd
)->got
== NULL
5491 && !create_got_section (abfd
, info
))
5496 struct ppc_link_hash_entry
*eh
;
5497 struct got_entry
*ent
;
5499 eh
= (struct ppc_link_hash_entry
*) h
;
5500 for (ent
= eh
->elf
.got
.glist
; ent
!= NULL
; ent
= ent
->next
)
5501 if (ent
->addend
== rel
->r_addend
5502 && ent
->owner
== abfd
5503 && ent
->tls_type
== tls_type
)
5507 bfd_size_type amt
= sizeof (*ent
);
5508 ent
= bfd_alloc (abfd
, amt
);
5511 ent
->next
= eh
->elf
.got
.glist
;
5512 ent
->addend
= rel
->r_addend
;
5514 ent
->tls_type
= tls_type
;
5515 ent
->is_indirect
= FALSE
;
5516 ent
->got
.refcount
= 0;
5517 eh
->elf
.got
.glist
= ent
;
5519 ent
->got
.refcount
+= 1;
5520 eh
->tls_mask
|= tls_type
;
5523 /* This is a global offset table entry for a local symbol. */
5524 if (!update_local_sym_info (abfd
, symtab_hdr
, r_symndx
,
5525 rel
->r_addend
, tls_type
))
5528 /* We may also need a plt entry if the symbol turns out to be
5530 if (h
!= NULL
&& !bfd_link_pic (info
) && abiversion (abfd
) != 1)
5532 if (!update_plt_info (abfd
, &h
->plt
.plist
, rel
->r_addend
))
5537 case R_PPC64_PLT16_HA
:
5538 case R_PPC64_PLT16_HI
:
5539 case R_PPC64_PLT16_LO
:
5542 /* This symbol requires a procedure linkage table entry. */
5547 if (h
->root
.root
.string
[0] == '.'
5548 && h
->root
.root
.string
[1] != '\0')
5549 ((struct ppc_link_hash_entry
*) h
)->is_func
= 1;
5550 plt_list
= &h
->plt
.plist
;
5552 if (plt_list
== NULL
)
5554 /* It does not make sense to have a procedure linkage
5555 table entry for a non-ifunc local symbol. */
5556 info
->callbacks
->einfo
5557 /* xgettext:c-format */
5558 (_("%P: %H: %s reloc against local symbol\n"),
5559 abfd
, sec
, rel
->r_offset
,
5560 ppc64_elf_howto_table
[r_type
]->name
);
5561 bfd_set_error (bfd_error_bad_value
);
5564 if (!update_plt_info (abfd
, plt_list
, rel
->r_addend
))
5568 /* The following relocations don't need to propagate the
5569 relocation if linking a shared object since they are
5570 section relative. */
5571 case R_PPC64_SECTOFF
:
5572 case R_PPC64_SECTOFF_LO
:
5573 case R_PPC64_SECTOFF_HI
:
5574 case R_PPC64_SECTOFF_HA
:
5575 case R_PPC64_SECTOFF_DS
:
5576 case R_PPC64_SECTOFF_LO_DS
:
5577 case R_PPC64_DTPREL16
:
5578 case R_PPC64_DTPREL16_LO
:
5579 case R_PPC64_DTPREL16_HI
:
5580 case R_PPC64_DTPREL16_HA
:
5581 case R_PPC64_DTPREL16_DS
:
5582 case R_PPC64_DTPREL16_LO_DS
:
5583 case R_PPC64_DTPREL16_HIGH
:
5584 case R_PPC64_DTPREL16_HIGHA
:
5585 case R_PPC64_DTPREL16_HIGHER
:
5586 case R_PPC64_DTPREL16_HIGHERA
:
5587 case R_PPC64_DTPREL16_HIGHEST
:
5588 case R_PPC64_DTPREL16_HIGHESTA
:
5593 case R_PPC64_REL16_LO
:
5594 case R_PPC64_REL16_HI
:
5595 case R_PPC64_REL16_HA
:
5596 case R_PPC64_REL16DX_HA
:
5599 /* Not supported as a dynamic relocation. */
5600 case R_PPC64_ADDR64_LOCAL
:
5601 if (bfd_link_pic (info
))
5603 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
5605 /* xgettext:c-format */
5606 info
->callbacks
->einfo (_("%P: %H: %s reloc unsupported "
5607 "in shared libraries and PIEs.\n"),
5608 abfd
, sec
, rel
->r_offset
,
5609 ppc64_elf_howto_table
[r_type
]->name
);
5610 bfd_set_error (bfd_error_bad_value
);
5616 case R_PPC64_TOC16_DS
:
5617 htab
->do_multi_toc
= 1;
5618 ppc64_elf_tdata (abfd
)->has_small_toc_reloc
= 1;
5620 case R_PPC64_TOC16_LO
:
5621 case R_PPC64_TOC16_HI
:
5622 case R_PPC64_TOC16_HA
:
5623 case R_PPC64_TOC16_LO_DS
:
5624 sec
->has_toc_reloc
= 1;
5631 /* This relocation describes the C++ object vtable hierarchy.
5632 Reconstruct it for later use during GC. */
5633 case R_PPC64_GNU_VTINHERIT
:
5634 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
5638 /* This relocation describes which C++ vtable entries are actually
5639 used. Record for later use during GC. */
5640 case R_PPC64_GNU_VTENTRY
:
5641 BFD_ASSERT (h
!= NULL
);
5643 && !bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
5648 case R_PPC64_REL14_BRTAKEN
:
5649 case R_PPC64_REL14_BRNTAKEN
:
5651 asection
*dest
= NULL
;
5653 /* Heuristic: If jumping outside our section, chances are
5654 we are going to need a stub. */
5657 /* If the sym is weak it may be overridden later, so
5658 don't assume we know where a weak sym lives. */
5659 if (h
->root
.type
== bfd_link_hash_defined
)
5660 dest
= h
->root
.u
.def
.section
;
5664 Elf_Internal_Sym
*isym
;
5666 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
5671 dest
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
5675 ppc64_elf_section_data (sec
)->has_14bit_branch
= 1;
5684 if (h
->root
.root
.string
[0] == '.'
5685 && h
->root
.root
.string
[1] != '\0')
5686 ((struct ppc_link_hash_entry
*) h
)->is_func
= 1;
5688 if (h
== tga
|| h
== dottga
)
5690 sec
->has_tls_reloc
= 1;
5692 && (ELF64_R_TYPE (rel
[-1].r_info
) == R_PPC64_TLSGD
5693 || ELF64_R_TYPE (rel
[-1].r_info
) == R_PPC64_TLSLD
))
5694 /* We have a new-style __tls_get_addr call with
5698 /* Mark this section as having an old-style call. */
5699 sec
->has_tls_get_addr_call
= 1;
5701 plt_list
= &h
->plt
.plist
;
5704 /* We may need a .plt entry if the function this reloc
5705 refers to is in a shared lib. */
5707 && !update_plt_info (abfd
, plt_list
, rel
->r_addend
))
5711 case R_PPC64_ADDR14
:
5712 case R_PPC64_ADDR14_BRNTAKEN
:
5713 case R_PPC64_ADDR14_BRTAKEN
:
5714 case R_PPC64_ADDR24
:
5717 case R_PPC64_TPREL64
:
5718 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_TPREL
;
5719 if (bfd_link_pic (info
))
5720 info
->flags
|= DF_STATIC_TLS
;
5723 case R_PPC64_DTPMOD64
:
5724 if (rel
+ 1 < rel_end
5725 && rel
[1].r_info
== ELF64_R_INFO (r_symndx
, R_PPC64_DTPREL64
)
5726 && rel
[1].r_offset
== rel
->r_offset
+ 8)
5727 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_GD
;
5729 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_LD
;
5732 case R_PPC64_DTPREL64
:
5733 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_DTPREL
;
5735 && rel
[-1].r_info
== ELF64_R_INFO (r_symndx
, R_PPC64_DTPMOD64
)
5736 && rel
[-1].r_offset
== rel
->r_offset
- 8)
5737 /* This is the second reloc of a dtpmod, dtprel pair.
5738 Don't mark with TLS_DTPREL. */
5742 sec
->has_tls_reloc
= 1;
5745 struct ppc_link_hash_entry
*eh
;
5746 eh
= (struct ppc_link_hash_entry
*) h
;
5747 eh
->tls_mask
|= tls_type
;
5750 if (!update_local_sym_info (abfd
, symtab_hdr
, r_symndx
,
5751 rel
->r_addend
, tls_type
))
5754 ppc64_sec
= ppc64_elf_section_data (sec
);
5755 if (ppc64_sec
->sec_type
!= sec_toc
)
5759 /* One extra to simplify get_tls_mask. */
5760 amt
= sec
->size
* sizeof (unsigned) / 8 + sizeof (unsigned);
5761 ppc64_sec
->u
.toc
.symndx
= bfd_zalloc (abfd
, amt
);
5762 if (ppc64_sec
->u
.toc
.symndx
== NULL
)
5764 amt
= sec
->size
* sizeof (bfd_vma
) / 8;
5765 ppc64_sec
->u
.toc
.add
= bfd_zalloc (abfd
, amt
);
5766 if (ppc64_sec
->u
.toc
.add
== NULL
)
5768 BFD_ASSERT (ppc64_sec
->sec_type
== sec_normal
);
5769 ppc64_sec
->sec_type
= sec_toc
;
5771 BFD_ASSERT (rel
->r_offset
% 8 == 0);
5772 ppc64_sec
->u
.toc
.symndx
[rel
->r_offset
/ 8] = r_symndx
;
5773 ppc64_sec
->u
.toc
.add
[rel
->r_offset
/ 8] = rel
->r_addend
;
5775 /* Mark the second slot of a GD or LD entry.
5776 -1 to indicate GD and -2 to indicate LD. */
5777 if (tls_type
== (TLS_EXPLICIT
| TLS_TLS
| TLS_GD
))
5778 ppc64_sec
->u
.toc
.symndx
[rel
->r_offset
/ 8 + 1] = -1;
5779 else if (tls_type
== (TLS_EXPLICIT
| TLS_TLS
| TLS_LD
))
5780 ppc64_sec
->u
.toc
.symndx
[rel
->r_offset
/ 8 + 1] = -2;
5783 case R_PPC64_TPREL16
:
5784 case R_PPC64_TPREL16_LO
:
5785 case R_PPC64_TPREL16_HI
:
5786 case R_PPC64_TPREL16_HA
:
5787 case R_PPC64_TPREL16_DS
:
5788 case R_PPC64_TPREL16_LO_DS
:
5789 case R_PPC64_TPREL16_HIGH
:
5790 case R_PPC64_TPREL16_HIGHA
:
5791 case R_PPC64_TPREL16_HIGHER
:
5792 case R_PPC64_TPREL16_HIGHERA
:
5793 case R_PPC64_TPREL16_HIGHEST
:
5794 case R_PPC64_TPREL16_HIGHESTA
:
5795 if (bfd_link_pic (info
))
5797 info
->flags
|= DF_STATIC_TLS
;
5802 case R_PPC64_ADDR64
:
5803 if (opd_sym_map
!= NULL
5804 && rel
+ 1 < rel_end
5805 && ELF64_R_TYPE ((rel
+ 1)->r_info
) == R_PPC64_TOC
)
5808 ((struct ppc_link_hash_entry
*) h
)->is_func
= 1;
5812 Elf_Internal_Sym
*isym
;
5814 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
5819 s
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
5820 if (s
!= NULL
&& s
!= sec
)
5821 opd_sym_map
[OPD_NDX (rel
->r_offset
)] = s
;
5826 case R_PPC64_ADDR16
:
5827 case R_PPC64_ADDR16_DS
:
5828 case R_PPC64_ADDR16_HA
:
5829 case R_PPC64_ADDR16_HI
:
5830 case R_PPC64_ADDR16_HIGH
:
5831 case R_PPC64_ADDR16_HIGHA
:
5832 case R_PPC64_ADDR16_HIGHER
:
5833 case R_PPC64_ADDR16_HIGHERA
:
5834 case R_PPC64_ADDR16_HIGHEST
:
5835 case R_PPC64_ADDR16_HIGHESTA
:
5836 case R_PPC64_ADDR16_LO
:
5837 case R_PPC64_ADDR16_LO_DS
:
5838 if (h
!= NULL
&& !bfd_link_pic (info
) && abiversion (abfd
) != 1
5839 && rel
->r_addend
== 0)
5841 /* We may need a .plt entry if this reloc refers to a
5842 function in a shared lib. */
5843 if (!update_plt_info (abfd
, &h
->plt
.plist
, rel
->r_addend
))
5845 h
->pointer_equality_needed
= 1;
5852 case R_PPC64_ADDR32
:
5853 case R_PPC64_UADDR16
:
5854 case R_PPC64_UADDR32
:
5855 case R_PPC64_UADDR64
:
5857 if (h
!= NULL
&& !bfd_link_pic (info
))
5858 /* We may need a copy reloc. */
5861 /* Don't propagate .opd relocs. */
5862 if (NO_OPD_RELOCS
&& opd_sym_map
!= NULL
)
5865 /* If we are creating a shared library, and this is a reloc
5866 against a global symbol, or a non PC relative reloc
5867 against a local symbol, then we need to copy the reloc
5868 into the shared library. However, if we are linking with
5869 -Bsymbolic, we do not need to copy a reloc against a
5870 global symbol which is defined in an object we are
5871 including in the link (i.e., DEF_REGULAR is set). At
5872 this point we have not seen all the input files, so it is
5873 possible that DEF_REGULAR is not set now but will be set
5874 later (it is never cleared). In case of a weak definition,
5875 DEF_REGULAR may be cleared later by a strong definition in
5876 a shared library. We account for that possibility below by
5877 storing information in the dyn_relocs field of the hash
5878 table entry. A similar situation occurs when creating
5879 shared libraries and symbol visibility changes render the
5882 If on the other hand, we are creating an executable, we
5883 may need to keep relocations for symbols satisfied by a
5884 dynamic library if we manage to avoid copy relocs for the
5887 if ((bfd_link_pic (info
)
5888 && (must_be_dyn_reloc (info
, r_type
)
5890 && (!SYMBOLIC_BIND (info
, h
)
5891 || h
->root
.type
== bfd_link_hash_defweak
5892 || !h
->def_regular
))))
5893 || (ELIMINATE_COPY_RELOCS
5894 && !bfd_link_pic (info
)
5896 && (h
->root
.type
== bfd_link_hash_defweak
5897 || !h
->def_regular
))
5898 || (!bfd_link_pic (info
)
5901 /* We must copy these reloc types into the output file.
5902 Create a reloc section in dynobj and make room for
5906 sreloc
= _bfd_elf_make_dynamic_reloc_section
5907 (sec
, htab
->elf
.dynobj
, 3, abfd
, /*rela?*/ TRUE
);
5913 /* If this is a global symbol, we count the number of
5914 relocations we need for this symbol. */
5917 struct elf_dyn_relocs
*p
;
5918 struct elf_dyn_relocs
**head
;
5920 head
= &((struct ppc_link_hash_entry
*) h
)->dyn_relocs
;
5922 if (p
== NULL
|| p
->sec
!= sec
)
5924 p
= bfd_alloc (htab
->elf
.dynobj
, sizeof *p
);
5934 if (!must_be_dyn_reloc (info
, r_type
))
5939 /* Track dynamic relocs needed for local syms too.
5940 We really need local syms available to do this
5942 struct ppc_dyn_relocs
*p
;
5943 struct ppc_dyn_relocs
**head
;
5944 bfd_boolean is_ifunc
;
5947 Elf_Internal_Sym
*isym
;
5949 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
5954 s
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
5958 vpp
= &elf_section_data (s
)->local_dynrel
;
5959 head
= (struct ppc_dyn_relocs
**) vpp
;
5960 is_ifunc
= ELF_ST_TYPE (isym
->st_info
) == STT_GNU_IFUNC
;
5962 if (p
!= NULL
&& p
->sec
== sec
&& p
->ifunc
!= is_ifunc
)
5964 if (p
== NULL
|| p
->sec
!= sec
|| p
->ifunc
!= is_ifunc
)
5966 p
= bfd_alloc (htab
->elf
.dynobj
, sizeof *p
);
5972 p
->ifunc
= is_ifunc
;
5988 /* Merge backend specific data from an object file to the output
5989 object file when linking. */
5992 ppc64_elf_merge_private_bfd_data (bfd
*ibfd
, struct bfd_link_info
*info
)
5994 bfd
*obfd
= info
->output_bfd
;
5995 unsigned long iflags
, oflags
;
5997 if ((ibfd
->flags
& BFD_LINKER_CREATED
) != 0)
6000 if (!is_ppc64_elf (ibfd
) || !is_ppc64_elf (obfd
))
6003 if (!_bfd_generic_verify_endian_match (ibfd
, info
))
6006 iflags
= elf_elfheader (ibfd
)->e_flags
;
6007 oflags
= elf_elfheader (obfd
)->e_flags
;
6009 if (iflags
& ~EF_PPC64_ABI
)
6012 /* xgettext:c-format */
6013 (_("%B uses unknown e_flags 0x%lx"), ibfd
, iflags
);
6014 bfd_set_error (bfd_error_bad_value
);
6017 else if (iflags
!= oflags
&& iflags
!= 0)
6020 /* xgettext:c-format */
6021 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
6022 ibfd
, iflags
, oflags
);
6023 bfd_set_error (bfd_error_bad_value
);
6027 _bfd_elf_ppc_merge_fp_attributes (ibfd
, info
);
6029 /* Merge Tag_compatibility attributes and any common GNU ones. */
6030 _bfd_elf_merge_object_attributes (ibfd
, info
);
6036 ppc64_elf_print_private_bfd_data (bfd
*abfd
, void *ptr
)
6038 /* Print normal ELF private data. */
6039 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
6041 if (elf_elfheader (abfd
)->e_flags
!= 0)
6045 fprintf (file
, _("private flags = 0x%lx:"),
6046 elf_elfheader (abfd
)->e_flags
);
6048 if ((elf_elfheader (abfd
)->e_flags
& EF_PPC64_ABI
) != 0)
6049 fprintf (file
, _(" [abiv%ld]"),
6050 elf_elfheader (abfd
)->e_flags
& EF_PPC64_ABI
);
6057 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
6058 of the code entry point, and its section, which must be in the same
6059 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
6062 opd_entry_value (asection
*opd_sec
,
6064 asection
**code_sec
,
6066 bfd_boolean in_code_sec
)
6068 bfd
*opd_bfd
= opd_sec
->owner
;
6069 Elf_Internal_Rela
*relocs
;
6070 Elf_Internal_Rela
*lo
, *hi
, *look
;
6073 /* No relocs implies we are linking a --just-symbols object, or looking
6074 at a final linked executable with addr2line or somesuch. */
6075 if (opd_sec
->reloc_count
== 0)
6077 bfd_byte
*contents
= ppc64_elf_tdata (opd_bfd
)->opd
.contents
;
6079 if (contents
== NULL
)
6081 if (!bfd_malloc_and_get_section (opd_bfd
, opd_sec
, &contents
))
6082 return (bfd_vma
) -1;
6083 ppc64_elf_tdata (opd_bfd
)->opd
.contents
= contents
;
6086 /* PR 17512: file: 64b9dfbb. */
6087 if (offset
+ 7 >= opd_sec
->size
|| offset
+ 7 < offset
)
6088 return (bfd_vma
) -1;
6090 val
= bfd_get_64 (opd_bfd
, contents
+ offset
);
6091 if (code_sec
!= NULL
)
6093 asection
*sec
, *likely
= NULL
;
6099 && val
< sec
->vma
+ sec
->size
)
6105 for (sec
= opd_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
6107 && (sec
->flags
& SEC_LOAD
) != 0
6108 && (sec
->flags
& SEC_ALLOC
) != 0)
6113 if (code_off
!= NULL
)
6114 *code_off
= val
- likely
->vma
;
6120 BFD_ASSERT (is_ppc64_elf (opd_bfd
));
6122 relocs
= ppc64_elf_tdata (opd_bfd
)->opd
.relocs
;
6124 relocs
= _bfd_elf_link_read_relocs (opd_bfd
, opd_sec
, NULL
, NULL
, TRUE
);
6125 /* PR 17512: file: df8e1fd6. */
6127 return (bfd_vma
) -1;
6129 /* Go find the opd reloc at the sym address. */
6131 hi
= lo
+ opd_sec
->reloc_count
- 1; /* ignore last reloc */
6135 look
= lo
+ (hi
- lo
) / 2;
6136 if (look
->r_offset
< offset
)
6138 else if (look
->r_offset
> offset
)
6142 Elf_Internal_Shdr
*symtab_hdr
= &elf_symtab_hdr (opd_bfd
);
6144 if (ELF64_R_TYPE (look
->r_info
) == R_PPC64_ADDR64
6145 && ELF64_R_TYPE ((look
+ 1)->r_info
) == R_PPC64_TOC
)
6147 unsigned long symndx
= ELF64_R_SYM (look
->r_info
);
6148 asection
*sec
= NULL
;
6150 if (symndx
>= symtab_hdr
->sh_info
6151 && elf_sym_hashes (opd_bfd
) != NULL
)
6153 struct elf_link_hash_entry
**sym_hashes
;
6154 struct elf_link_hash_entry
*rh
;
6156 sym_hashes
= elf_sym_hashes (opd_bfd
);
6157 rh
= sym_hashes
[symndx
- symtab_hdr
->sh_info
];
6160 rh
= elf_follow_link (rh
);
6161 if (rh
->root
.type
!= bfd_link_hash_defined
6162 && rh
->root
.type
!= bfd_link_hash_defweak
)
6164 if (rh
->root
.u
.def
.section
->owner
== opd_bfd
)
6166 val
= rh
->root
.u
.def
.value
;
6167 sec
= rh
->root
.u
.def
.section
;
6174 Elf_Internal_Sym
*sym
;
6176 if (symndx
< symtab_hdr
->sh_info
)
6178 sym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
6181 size_t symcnt
= symtab_hdr
->sh_info
;
6182 sym
= bfd_elf_get_elf_syms (opd_bfd
, symtab_hdr
,
6187 symtab_hdr
->contents
= (bfd_byte
*) sym
;
6193 sym
= bfd_elf_get_elf_syms (opd_bfd
, symtab_hdr
,
6199 sec
= bfd_section_from_elf_index (opd_bfd
, sym
->st_shndx
);
6202 BFD_ASSERT ((sec
->flags
& SEC_MERGE
) == 0);
6203 val
= sym
->st_value
;
6206 val
+= look
->r_addend
;
6207 if (code_off
!= NULL
)
6209 if (code_sec
!= NULL
)
6211 if (in_code_sec
&& *code_sec
!= sec
)
6216 if (sec
->output_section
!= NULL
)
6217 val
+= sec
->output_section
->vma
+ sec
->output_offset
;
6226 /* If the ELF symbol SYM might be a function in SEC, return the
6227 function size and set *CODE_OFF to the function's entry point,
6228 otherwise return zero. */
6230 static bfd_size_type
6231 ppc64_elf_maybe_function_sym (const asymbol
*sym
, asection
*sec
,
6236 if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_FILE
| BSF_OBJECT
6237 | BSF_THREAD_LOCAL
| BSF_RELC
| BSF_SRELC
)) != 0)
6241 if (!(sym
->flags
& BSF_SYNTHETIC
))
6242 size
= ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
6244 if (strcmp (sym
->section
->name
, ".opd") == 0)
6246 struct _opd_sec_data
*opd
= get_opd_info (sym
->section
);
6247 bfd_vma symval
= sym
->value
;
6250 && opd
->adjust
!= NULL
6251 && elf_section_data (sym
->section
)->relocs
!= NULL
)
6253 /* opd_entry_value will use cached relocs that have been
6254 adjusted, but with raw symbols. That means both local
6255 and global symbols need adjusting. */
6256 long adjust
= opd
->adjust
[OPD_NDX (symval
)];
6262 if (opd_entry_value (sym
->section
, symval
,
6263 &sec
, code_off
, TRUE
) == (bfd_vma
) -1)
6265 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6266 symbol. This size has nothing to do with the code size of the
6267 function, which is what we're supposed to return, but the
6268 code size isn't available without looking up the dot-sym.
6269 However, doing that would be a waste of time particularly
6270 since elf_find_function will look at the dot-sym anyway.
6271 Now, elf_find_function will keep the largest size of any
6272 function sym found at the code address of interest, so return
6273 1 here to avoid it incorrectly caching a larger function size
6274 for a small function. This does mean we return the wrong
6275 size for a new-ABI function of size 24, but all that does is
6276 disable caching for such functions. */
6282 if (sym
->section
!= sec
)
6284 *code_off
= sym
->value
;
6291 /* Return true if symbol is defined in a regular object file. */
6294 is_static_defined (struct elf_link_hash_entry
*h
)
6296 return ((h
->root
.type
== bfd_link_hash_defined
6297 || h
->root
.type
== bfd_link_hash_defweak
)
6298 && h
->root
.u
.def
.section
!= NULL
6299 && h
->root
.u
.def
.section
->output_section
!= NULL
);
6302 /* If FDH is a function descriptor symbol, return the associated code
6303 entry symbol if it is defined. Return NULL otherwise. */
6305 static struct ppc_link_hash_entry
*
6306 defined_code_entry (struct ppc_link_hash_entry
*fdh
)
6308 if (fdh
->is_func_descriptor
)
6310 struct ppc_link_hash_entry
*fh
= ppc_follow_link (fdh
->oh
);
6311 if (fh
->elf
.root
.type
== bfd_link_hash_defined
6312 || fh
->elf
.root
.type
== bfd_link_hash_defweak
)
6318 /* If FH is a function code entry symbol, return the associated
6319 function descriptor symbol if it is defined. Return NULL otherwise. */
6321 static struct ppc_link_hash_entry
*
6322 defined_func_desc (struct ppc_link_hash_entry
*fh
)
6325 && fh
->oh
->is_func_descriptor
)
6327 struct ppc_link_hash_entry
*fdh
= ppc_follow_link (fh
->oh
);
6328 if (fdh
->elf
.root
.type
== bfd_link_hash_defined
6329 || fdh
->elf
.root
.type
== bfd_link_hash_defweak
)
6335 static bfd_boolean
func_desc_adjust (struct elf_link_hash_entry
*, void *);
6337 /* Garbage collect sections, after first dealing with dot-symbols. */
6340 ppc64_elf_gc_sections (bfd
*abfd
, struct bfd_link_info
*info
)
6342 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6344 if (htab
!= NULL
&& htab
->need_func_desc_adj
)
6346 elf_link_hash_traverse (&htab
->elf
, func_desc_adjust
, info
);
6347 htab
->need_func_desc_adj
= 0;
6349 return bfd_elf_gc_sections (abfd
, info
);
6352 /* Mark all our entry sym sections, both opd and code section. */
6355 ppc64_elf_gc_keep (struct bfd_link_info
*info
)
6357 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6358 struct bfd_sym_chain
*sym
;
6363 for (sym
= info
->gc_sym_list
; sym
!= NULL
; sym
= sym
->next
)
6365 struct ppc_link_hash_entry
*eh
, *fh
;
6368 eh
= (struct ppc_link_hash_entry
*)
6369 elf_link_hash_lookup (&htab
->elf
, sym
->name
, FALSE
, FALSE
, TRUE
);
6372 if (eh
->elf
.root
.type
!= bfd_link_hash_defined
6373 && eh
->elf
.root
.type
!= bfd_link_hash_defweak
)
6376 fh
= defined_code_entry (eh
);
6379 sec
= fh
->elf
.root
.u
.def
.section
;
6380 sec
->flags
|= SEC_KEEP
;
6382 else if (get_opd_info (eh
->elf
.root
.u
.def
.section
) != NULL
6383 && opd_entry_value (eh
->elf
.root
.u
.def
.section
,
6384 eh
->elf
.root
.u
.def
.value
,
6385 &sec
, NULL
, FALSE
) != (bfd_vma
) -1)
6386 sec
->flags
|= SEC_KEEP
;
6388 sec
= eh
->elf
.root
.u
.def
.section
;
6389 sec
->flags
|= SEC_KEEP
;
6393 /* Mark sections containing dynamically referenced symbols. When
6394 building shared libraries, we must assume that any visible symbol is
6398 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry
*h
, void *inf
)
6400 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
6401 struct ppc_link_hash_entry
*eh
= (struct ppc_link_hash_entry
*) h
;
6402 struct ppc_link_hash_entry
*fdh
;
6403 struct bfd_elf_dynamic_list
*d
= info
->dynamic_list
;
6405 /* Dynamic linking info is on the func descriptor sym. */
6406 fdh
= defined_func_desc (eh
);
6410 if ((eh
->elf
.root
.type
== bfd_link_hash_defined
6411 || eh
->elf
.root
.type
== bfd_link_hash_defweak
)
6412 && (eh
->elf
.ref_dynamic
6413 || ((eh
->elf
.def_regular
|| ELF_COMMON_DEF_P (&eh
->elf
))
6414 && ELF_ST_VISIBILITY (eh
->elf
.other
) != STV_INTERNAL
6415 && ELF_ST_VISIBILITY (eh
->elf
.other
) != STV_HIDDEN
6416 && (!bfd_link_executable (info
)
6417 || info
->export_dynamic
6420 && (*d
->match
) (&d
->head
, NULL
, eh
->elf
.root
.root
.string
)))
6421 && (strchr (eh
->elf
.root
.root
.string
, ELF_VER_CHR
) != NULL
6422 || !bfd_hide_sym_by_version (info
->version_info
,
6423 eh
->elf
.root
.root
.string
)))))
6426 struct ppc_link_hash_entry
*fh
;
6428 eh
->elf
.root
.u
.def
.section
->flags
|= SEC_KEEP
;
6430 /* Function descriptor syms cause the associated
6431 function code sym section to be marked. */
6432 fh
= defined_code_entry (eh
);
6435 code_sec
= fh
->elf
.root
.u
.def
.section
;
6436 code_sec
->flags
|= SEC_KEEP
;
6438 else if (get_opd_info (eh
->elf
.root
.u
.def
.section
) != NULL
6439 && opd_entry_value (eh
->elf
.root
.u
.def
.section
,
6440 eh
->elf
.root
.u
.def
.value
,
6441 &code_sec
, NULL
, FALSE
) != (bfd_vma
) -1)
6442 code_sec
->flags
|= SEC_KEEP
;
6448 /* Return the section that should be marked against GC for a given
6452 ppc64_elf_gc_mark_hook (asection
*sec
,
6453 struct bfd_link_info
*info
,
6454 Elf_Internal_Rela
*rel
,
6455 struct elf_link_hash_entry
*h
,
6456 Elf_Internal_Sym
*sym
)
6460 /* Syms return NULL if we're marking .opd, so we avoid marking all
6461 function sections, as all functions are referenced in .opd. */
6463 if (get_opd_info (sec
) != NULL
)
6468 enum elf_ppc64_reloc_type r_type
;
6469 struct ppc_link_hash_entry
*eh
, *fh
, *fdh
;
6471 r_type
= ELF64_R_TYPE (rel
->r_info
);
6474 case R_PPC64_GNU_VTINHERIT
:
6475 case R_PPC64_GNU_VTENTRY
:
6479 switch (h
->root
.type
)
6481 case bfd_link_hash_defined
:
6482 case bfd_link_hash_defweak
:
6483 eh
= (struct ppc_link_hash_entry
*) h
;
6484 fdh
= defined_func_desc (eh
);
6487 /* -mcall-aixdesc code references the dot-symbol on
6488 a call reloc. Mark the function descriptor too
6489 against garbage collection. */
6491 if (fdh
->elf
.u
.weakdef
!= NULL
)
6492 fdh
->elf
.u
.weakdef
->mark
= 1;
6496 /* Function descriptor syms cause the associated
6497 function code sym section to be marked. */
6498 fh
= defined_code_entry (eh
);
6501 /* They also mark their opd section. */
6502 eh
->elf
.root
.u
.def
.section
->gc_mark
= 1;
6504 rsec
= fh
->elf
.root
.u
.def
.section
;
6506 else if (get_opd_info (eh
->elf
.root
.u
.def
.section
) != NULL
6507 && opd_entry_value (eh
->elf
.root
.u
.def
.section
,
6508 eh
->elf
.root
.u
.def
.value
,
6509 &rsec
, NULL
, FALSE
) != (bfd_vma
) -1)
6510 eh
->elf
.root
.u
.def
.section
->gc_mark
= 1;
6512 rsec
= h
->root
.u
.def
.section
;
6515 case bfd_link_hash_common
:
6516 rsec
= h
->root
.u
.c
.p
->section
;
6520 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
6526 struct _opd_sec_data
*opd
;
6528 rsec
= bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
6529 opd
= get_opd_info (rsec
);
6530 if (opd
!= NULL
&& opd
->func_sec
!= NULL
)
6534 rsec
= opd
->func_sec
[OPD_NDX (sym
->st_value
+ rel
->r_addend
)];
6541 /* Update the .got, .plt. and dynamic reloc reference counts for the
6542 section being removed. */
6545 ppc64_elf_gc_sweep_hook (bfd
*abfd
, struct bfd_link_info
*info
,
6546 asection
*sec
, const Elf_Internal_Rela
*relocs
)
6548 struct ppc_link_hash_table
*htab
;
6549 Elf_Internal_Shdr
*symtab_hdr
;
6550 struct elf_link_hash_entry
**sym_hashes
;
6551 struct got_entry
**local_got_ents
;
6552 const Elf_Internal_Rela
*rel
, *relend
;
6554 if (bfd_link_relocatable (info
))
6557 if ((sec
->flags
& SEC_ALLOC
) == 0)
6560 elf_section_data (sec
)->local_dynrel
= NULL
;
6562 htab
= ppc_hash_table (info
);
6566 symtab_hdr
= &elf_symtab_hdr (abfd
);
6567 sym_hashes
= elf_sym_hashes (abfd
);
6568 local_got_ents
= elf_local_got_ents (abfd
);
6570 relend
= relocs
+ sec
->reloc_count
;
6571 for (rel
= relocs
; rel
< relend
; rel
++)
6573 unsigned long r_symndx
;
6574 enum elf_ppc64_reloc_type r_type
;
6575 struct elf_link_hash_entry
*h
= NULL
;
6576 struct plt_entry
**plt_list
;
6577 unsigned char tls_type
= 0;
6579 r_symndx
= ELF64_R_SYM (rel
->r_info
);
6580 r_type
= ELF64_R_TYPE (rel
->r_info
);
6581 if (r_symndx
>= symtab_hdr
->sh_info
)
6583 struct ppc_link_hash_entry
*eh
;
6584 struct elf_dyn_relocs
**pp
;
6585 struct elf_dyn_relocs
*p
;
6587 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6588 h
= elf_follow_link (h
);
6589 eh
= (struct ppc_link_hash_entry
*) h
;
6591 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
6594 /* Everything must go for SEC. */
6602 case R_PPC64_GOT_TLSLD16
:
6603 case R_PPC64_GOT_TLSLD16_LO
:
6604 case R_PPC64_GOT_TLSLD16_HI
:
6605 case R_PPC64_GOT_TLSLD16_HA
:
6606 tls_type
= TLS_TLS
| TLS_LD
;
6609 case R_PPC64_GOT_TLSGD16
:
6610 case R_PPC64_GOT_TLSGD16_LO
:
6611 case R_PPC64_GOT_TLSGD16_HI
:
6612 case R_PPC64_GOT_TLSGD16_HA
:
6613 tls_type
= TLS_TLS
| TLS_GD
;
6616 case R_PPC64_GOT_TPREL16_DS
:
6617 case R_PPC64_GOT_TPREL16_LO_DS
:
6618 case R_PPC64_GOT_TPREL16_HI
:
6619 case R_PPC64_GOT_TPREL16_HA
:
6620 tls_type
= TLS_TLS
| TLS_TPREL
;
6623 case R_PPC64_GOT_DTPREL16_DS
:
6624 case R_PPC64_GOT_DTPREL16_LO_DS
:
6625 case R_PPC64_GOT_DTPREL16_HI
:
6626 case R_PPC64_GOT_DTPREL16_HA
:
6627 tls_type
= TLS_TLS
| TLS_DTPREL
;
6631 case R_PPC64_GOT16_DS
:
6632 case R_PPC64_GOT16_HA
:
6633 case R_PPC64_GOT16_HI
:
6634 case R_PPC64_GOT16_LO
:
6635 case R_PPC64_GOT16_LO_DS
:
6638 struct got_entry
*ent
;
6643 ent
= local_got_ents
[r_symndx
];
6645 for (; ent
!= NULL
; ent
= ent
->next
)
6646 if (ent
->addend
== rel
->r_addend
6647 && ent
->owner
== abfd
6648 && ent
->tls_type
== tls_type
)
6652 if (ent
->got
.refcount
> 0)
6653 ent
->got
.refcount
-= 1;
6657 case R_PPC64_PLT16_HA
:
6658 case R_PPC64_PLT16_HI
:
6659 case R_PPC64_PLT16_LO
:
6663 case R_PPC64_REL14_BRNTAKEN
:
6664 case R_PPC64_REL14_BRTAKEN
:
6668 plt_list
= &h
->plt
.plist
;
6669 else if (local_got_ents
!= NULL
)
6671 struct plt_entry
**local_plt
= (struct plt_entry
**)
6672 (local_got_ents
+ symtab_hdr
->sh_info
);
6673 unsigned char *local_got_tls_masks
= (unsigned char *)
6674 (local_plt
+ symtab_hdr
->sh_info
);
6675 if ((local_got_tls_masks
[r_symndx
] & PLT_IFUNC
) != 0)
6676 plt_list
= local_plt
+ r_symndx
;
6680 struct plt_entry
*ent
;
6682 for (ent
= *plt_list
; ent
!= NULL
; ent
= ent
->next
)
6683 if (ent
->addend
== rel
->r_addend
)
6685 if (ent
!= NULL
&& ent
->plt
.refcount
> 0)
6686 ent
->plt
.refcount
-= 1;
6697 /* The maximum size of .sfpr. */
6698 #define SFPR_MAX (218*4)
6700 struct sfpr_def_parms
6702 const char name
[12];
6703 unsigned char lo
, hi
;
6704 bfd_byte
* (*write_ent
) (bfd
*, bfd_byte
*, int);
6705 bfd_byte
* (*write_tail
) (bfd
*, bfd_byte
*, int);
6708 /* Auto-generate _save*, _rest* functions in .sfpr.
6709 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6713 sfpr_define (struct bfd_link_info
*info
,
6714 const struct sfpr_def_parms
*parm
,
6717 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6719 size_t len
= strlen (parm
->name
);
6720 bfd_boolean writing
= FALSE
;
6726 memcpy (sym
, parm
->name
, len
);
6729 for (i
= parm
->lo
; i
<= parm
->hi
; i
++)
6731 struct ppc_link_hash_entry
*h
;
6733 sym
[len
+ 0] = i
/ 10 + '0';
6734 sym
[len
+ 1] = i
% 10 + '0';
6735 h
= (struct ppc_link_hash_entry
*)
6736 elf_link_hash_lookup (&htab
->elf
, sym
, writing
, TRUE
, TRUE
);
6737 if (stub_sec
!= NULL
)
6740 && h
->elf
.root
.type
== bfd_link_hash_defined
6741 && h
->elf
.root
.u
.def
.section
== htab
->sfpr
)
6743 struct elf_link_hash_entry
*s
;
6745 sprintf (buf
, "%08x.%s", stub_sec
->id
& 0xffffffff, sym
);
6746 s
= elf_link_hash_lookup (&htab
->elf
, buf
, TRUE
, TRUE
, FALSE
);
6749 if (s
->root
.type
== bfd_link_hash_new
6750 || (s
->root
.type
= bfd_link_hash_defined
6751 && s
->root
.u
.def
.section
== stub_sec
))
6753 s
->root
.type
= bfd_link_hash_defined
;
6754 s
->root
.u
.def
.section
= stub_sec
;
6755 s
->root
.u
.def
.value
= (stub_sec
->size
6756 + h
->elf
.root
.u
.def
.value
);
6759 s
->ref_regular_nonweak
= 1;
6760 s
->forced_local
= 1;
6762 s
->root
.linker_def
= 1;
6770 if (!h
->elf
.def_regular
)
6772 h
->elf
.root
.type
= bfd_link_hash_defined
;
6773 h
->elf
.root
.u
.def
.section
= htab
->sfpr
;
6774 h
->elf
.root
.u
.def
.value
= htab
->sfpr
->size
;
6775 h
->elf
.type
= STT_FUNC
;
6776 h
->elf
.def_regular
= 1;
6778 _bfd_elf_link_hash_hide_symbol (info
, &h
->elf
, TRUE
);
6780 if (htab
->sfpr
->contents
== NULL
)
6782 htab
->sfpr
->contents
= bfd_alloc (htab
->elf
.dynobj
, SFPR_MAX
);
6783 if (htab
->sfpr
->contents
== NULL
)
6790 bfd_byte
*p
= htab
->sfpr
->contents
+ htab
->sfpr
->size
;
6792 p
= (*parm
->write_ent
) (htab
->elf
.dynobj
, p
, i
);
6794 p
= (*parm
->write_tail
) (htab
->elf
.dynobj
, p
, i
);
6795 htab
->sfpr
->size
= p
- htab
->sfpr
->contents
;
6803 savegpr0 (bfd
*abfd
, bfd_byte
*p
, int r
)
6805 bfd_put_32 (abfd
, STD_R0_0R1
+ (r
<< 21) + (1 << 16) - (32 - r
) * 8, p
);
6810 savegpr0_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6812 p
= savegpr0 (abfd
, p
, r
);
6813 bfd_put_32 (abfd
, STD_R0_0R1
+ STK_LR
, p
);
6815 bfd_put_32 (abfd
, BLR
, p
);
6820 restgpr0 (bfd
*abfd
, bfd_byte
*p
, int r
)
6822 bfd_put_32 (abfd
, LD_R0_0R1
+ (r
<< 21) + (1 << 16) - (32 - r
) * 8, p
);
6827 restgpr0_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6829 bfd_put_32 (abfd
, LD_R0_0R1
+ STK_LR
, p
);
6831 p
= restgpr0 (abfd
, p
, r
);
6832 bfd_put_32 (abfd
, MTLR_R0
, p
);
6836 p
= restgpr0 (abfd
, p
, 30);
6837 p
= restgpr0 (abfd
, p
, 31);
6839 bfd_put_32 (abfd
, BLR
, p
);
6844 savegpr1 (bfd
*abfd
, bfd_byte
*p
, int r
)
6846 bfd_put_32 (abfd
, STD_R0_0R12
+ (r
<< 21) + (1 << 16) - (32 - r
) * 8, p
);
6851 savegpr1_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6853 p
= savegpr1 (abfd
, p
, r
);
6854 bfd_put_32 (abfd
, BLR
, p
);
6859 restgpr1 (bfd
*abfd
, bfd_byte
*p
, int r
)
6861 bfd_put_32 (abfd
, LD_R0_0R12
+ (r
<< 21) + (1 << 16) - (32 - r
) * 8, p
);
6866 restgpr1_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6868 p
= restgpr1 (abfd
, p
, r
);
6869 bfd_put_32 (abfd
, BLR
, p
);
6874 savefpr (bfd
*abfd
, bfd_byte
*p
, int r
)
6876 bfd_put_32 (abfd
, STFD_FR0_0R1
+ (r
<< 21) + (1 << 16) - (32 - r
) * 8, p
);
6881 savefpr0_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6883 p
= savefpr (abfd
, p
, r
);
6884 bfd_put_32 (abfd
, STD_R0_0R1
+ STK_LR
, p
);
6886 bfd_put_32 (abfd
, BLR
, p
);
6891 restfpr (bfd
*abfd
, bfd_byte
*p
, int r
)
6893 bfd_put_32 (abfd
, LFD_FR0_0R1
+ (r
<< 21) + (1 << 16) - (32 - r
) * 8, p
);
6898 restfpr0_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6900 bfd_put_32 (abfd
, LD_R0_0R1
+ STK_LR
, p
);
6902 p
= restfpr (abfd
, p
, r
);
6903 bfd_put_32 (abfd
, MTLR_R0
, p
);
6907 p
= restfpr (abfd
, p
, 30);
6908 p
= restfpr (abfd
, p
, 31);
6910 bfd_put_32 (abfd
, BLR
, p
);
6915 savefpr1_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6917 p
= savefpr (abfd
, p
, r
);
6918 bfd_put_32 (abfd
, BLR
, p
);
6923 restfpr1_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6925 p
= restfpr (abfd
, p
, r
);
6926 bfd_put_32 (abfd
, BLR
, p
);
6931 savevr (bfd
*abfd
, bfd_byte
*p
, int r
)
6933 bfd_put_32 (abfd
, LI_R12_0
+ (1 << 16) - (32 - r
) * 16, p
);
6935 bfd_put_32 (abfd
, STVX_VR0_R12_R0
+ (r
<< 21), p
);
6940 savevr_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6942 p
= savevr (abfd
, p
, r
);
6943 bfd_put_32 (abfd
, BLR
, p
);
6948 restvr (bfd
*abfd
, bfd_byte
*p
, int r
)
6950 bfd_put_32 (abfd
, LI_R12_0
+ (1 << 16) - (32 - r
) * 16, p
);
6952 bfd_put_32 (abfd
, LVX_VR0_R12_R0
+ (r
<< 21), p
);
6957 restvr_tail (bfd
*abfd
, bfd_byte
*p
, int r
)
6959 p
= restvr (abfd
, p
, r
);
6960 bfd_put_32 (abfd
, BLR
, p
);
6964 /* Called via elf_link_hash_traverse to transfer dynamic linking
6965 information on function code symbol entries to their corresponding
6966 function descriptor symbol entries. */
6969 func_desc_adjust (struct elf_link_hash_entry
*h
, void *inf
)
6971 struct bfd_link_info
*info
;
6972 struct ppc_link_hash_table
*htab
;
6973 struct ppc_link_hash_entry
*fh
;
6974 struct ppc_link_hash_entry
*fdh
;
6975 bfd_boolean force_local
;
6977 fh
= (struct ppc_link_hash_entry
*) h
;
6978 if (fh
->elf
.root
.type
== bfd_link_hash_indirect
)
6984 if (fh
->elf
.root
.root
.string
[0] != '.'
6985 || fh
->elf
.root
.root
.string
[1] == '\0')
6989 htab
= ppc_hash_table (info
);
6993 /* Find the corresponding function descriptor symbol. */
6994 fdh
= lookup_fdh (fh
, htab
);
6996 /* Resolve undefined references to dot-symbols as the value
6997 in the function descriptor, if we have one in a regular object.
6998 This is to satisfy cases like ".quad .foo". Calls to functions
6999 in dynamic objects are handled elsewhere. */
7000 if ((fh
->elf
.root
.type
== bfd_link_hash_undefined
7001 || fh
->elf
.root
.type
== bfd_link_hash_undefweak
)
7002 && (fdh
->elf
.root
.type
== bfd_link_hash_defined
7003 || fdh
->elf
.root
.type
== bfd_link_hash_defweak
)
7004 && get_opd_info (fdh
->elf
.root
.u
.def
.section
) != NULL
7005 && opd_entry_value (fdh
->elf
.root
.u
.def
.section
,
7006 fdh
->elf
.root
.u
.def
.value
,
7007 &fh
->elf
.root
.u
.def
.section
,
7008 &fh
->elf
.root
.u
.def
.value
, FALSE
) != (bfd_vma
) -1)
7010 fh
->elf
.root
.type
= fdh
->elf
.root
.type
;
7011 fh
->elf
.forced_local
= 1;
7012 fh
->elf
.def_regular
= fdh
->elf
.def_regular
;
7013 fh
->elf
.def_dynamic
= fdh
->elf
.def_dynamic
;
7016 if (!fh
->elf
.dynamic
)
7018 struct plt_entry
*ent
;
7020 for (ent
= fh
->elf
.plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
7021 if (ent
->plt
.refcount
> 0)
7027 /* Create a descriptor as undefined if necessary. */
7029 && !bfd_link_executable (info
)
7030 && (fh
->elf
.root
.type
== bfd_link_hash_undefined
7031 || fh
->elf
.root
.type
== bfd_link_hash_undefweak
))
7033 fdh
= make_fdh (info
, fh
);
7038 /* We can't support overriding of symbols on a fake descriptor. */
7041 && (fh
->elf
.root
.type
== bfd_link_hash_defined
7042 || fh
->elf
.root
.type
== bfd_link_hash_defweak
))
7043 _bfd_elf_link_hash_hide_symbol (info
, &fdh
->elf
, TRUE
);
7045 /* Transfer dynamic linking information to the function descriptor. */
7048 fdh
->elf
.ref_regular
|= fh
->elf
.ref_regular
;
7049 fdh
->elf
.ref_dynamic
|= fh
->elf
.ref_dynamic
;
7050 fdh
->elf
.ref_regular_nonweak
|= fh
->elf
.ref_regular_nonweak
;
7051 fdh
->elf
.non_got_ref
|= fh
->elf
.non_got_ref
;
7052 fdh
->elf
.dynamic
|= fh
->elf
.dynamic
;
7053 fdh
->elf
.needs_plt
|= (fh
->elf
.needs_plt
7054 || fh
->elf
.type
== STT_FUNC
7055 || fh
->elf
.type
== STT_GNU_IFUNC
);
7056 move_plt_plist (fh
, fdh
);
7058 if (!fdh
->elf
.forced_local
7059 && fh
->elf
.dynindx
!= -1)
7060 if (!bfd_elf_link_record_dynamic_symbol (info
, &fdh
->elf
))
7064 /* Now that the info is on the function descriptor, clear the
7065 function code sym info. Any function code syms for which we
7066 don't have a definition in a regular file, we force local.
7067 This prevents a shared library from exporting syms that have
7068 been imported from another library. Function code syms that
7069 are really in the library we must leave global to prevent the
7070 linker dragging in a definition from a static library. */
7071 force_local
= (!fh
->elf
.def_regular
7073 || !fdh
->elf
.def_regular
7074 || fdh
->elf
.forced_local
);
7075 _bfd_elf_link_hash_hide_symbol (info
, &fh
->elf
, force_local
);
7080 static const struct sfpr_def_parms save_res_funcs
[] =
7082 { "_savegpr0_", 14, 31, savegpr0
, savegpr0_tail
},
7083 { "_restgpr0_", 14, 29, restgpr0
, restgpr0_tail
},
7084 { "_restgpr0_", 30, 31, restgpr0
, restgpr0_tail
},
7085 { "_savegpr1_", 14, 31, savegpr1
, savegpr1_tail
},
7086 { "_restgpr1_", 14, 31, restgpr1
, restgpr1_tail
},
7087 { "_savefpr_", 14, 31, savefpr
, savefpr0_tail
},
7088 { "_restfpr_", 14, 29, restfpr
, restfpr0_tail
},
7089 { "_restfpr_", 30, 31, restfpr
, restfpr0_tail
},
7090 { "._savef", 14, 31, savefpr
, savefpr1_tail
},
7091 { "._restf", 14, 31, restfpr
, restfpr1_tail
},
7092 { "_savevr_", 20, 31, savevr
, savevr_tail
},
7093 { "_restvr_", 20, 31, restvr
, restvr_tail
}
7096 /* Called near the start of bfd_elf_size_dynamic_sections. We use
7097 this hook to a) provide some gcc support functions, and b) transfer
7098 dynamic linking information gathered so far on function code symbol
7099 entries, to their corresponding function descriptor symbol entries. */
7102 ppc64_elf_func_desc_adjust (bfd
*obfd ATTRIBUTE_UNUSED
,
7103 struct bfd_link_info
*info
)
7105 struct ppc_link_hash_table
*htab
;
7107 htab
= ppc_hash_table (info
);
7111 /* Provide any missing _save* and _rest* functions. */
7112 if (htab
->sfpr
!= NULL
)
7116 htab
->sfpr
->size
= 0;
7117 for (i
= 0; i
< ARRAY_SIZE (save_res_funcs
); i
++)
7118 if (!sfpr_define (info
, &save_res_funcs
[i
], NULL
))
7120 if (htab
->sfpr
->size
== 0)
7121 htab
->sfpr
->flags
|= SEC_EXCLUDE
;
7124 if (bfd_link_relocatable (info
))
7127 if (htab
->elf
.hgot
!= NULL
)
7129 _bfd_elf_link_hash_hide_symbol (info
, htab
->elf
.hgot
, TRUE
);
7130 /* Make .TOC. defined so as to prevent it being made dynamic.
7131 The wrong value here is fixed later in ppc64_elf_set_toc. */
7132 if (!htab
->elf
.hgot
->def_regular
7133 || htab
->elf
.hgot
->root
.type
!= bfd_link_hash_defined
)
7135 htab
->elf
.hgot
->root
.type
= bfd_link_hash_defined
;
7136 htab
->elf
.hgot
->root
.u
.def
.value
= 0;
7137 htab
->elf
.hgot
->root
.u
.def
.section
= bfd_abs_section_ptr
;
7138 htab
->elf
.hgot
->def_regular
= 1;
7139 htab
->elf
.hgot
->root
.linker_def
= 1;
7141 htab
->elf
.hgot
->type
= STT_OBJECT
;
7142 htab
->elf
.hgot
->other
= ((htab
->elf
.hgot
->other
& ~ELF_ST_VISIBILITY (-1))
7146 if (htab
->need_func_desc_adj
)
7148 elf_link_hash_traverse (&htab
->elf
, func_desc_adjust
, info
);
7149 htab
->need_func_desc_adj
= 0;
7155 /* Return true if we have dynamic relocs against H that apply to
7156 read-only sections. */
7159 readonly_dynrelocs (struct elf_link_hash_entry
*h
)
7161 struct ppc_link_hash_entry
*eh
;
7162 struct elf_dyn_relocs
*p
;
7164 eh
= (struct ppc_link_hash_entry
*) h
;
7165 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
7167 asection
*s
= p
->sec
->output_section
;
7169 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
7175 /* Return true if we have dynamic relocs against H or any of its weak
7176 aliases, that apply to read-only sections. */
7179 alias_readonly_dynrelocs (struct elf_link_hash_entry
*h
)
7181 struct ppc_link_hash_entry
*eh
;
7183 eh
= (struct ppc_link_hash_entry
*) h
;
7186 if (readonly_dynrelocs (&eh
->elf
))
7189 } while (eh
!= NULL
&& &eh
->elf
!= h
);
7194 /* Return whether EH has pc-relative dynamic relocs. */
7197 pc_dynrelocs (struct ppc_link_hash_entry
*eh
)
7199 struct elf_dyn_relocs
*p
;
7201 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
7202 if (p
->pc_count
!= 0)
7207 /* Return true if a global entry stub will be created for H. Valid
7208 for ELFv2 before plt entries have been allocated. */
7211 global_entry_stub (struct elf_link_hash_entry
*h
)
7213 struct plt_entry
*pent
;
7215 if (!h
->pointer_equality_needed
7219 for (pent
= h
->plt
.plist
; pent
!= NULL
; pent
= pent
->next
)
7220 if (pent
->plt
.refcount
> 0
7221 && pent
->addend
== 0)
7227 /* Adjust a symbol defined by a dynamic object and referenced by a
7228 regular object. The current definition is in some section of the
7229 dynamic object, but we're not including those sections. We have to
7230 change the definition to something the rest of the link can
7234 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
7235 struct elf_link_hash_entry
*h
)
7237 struct ppc_link_hash_table
*htab
;
7240 htab
= ppc_hash_table (info
);
7244 /* Deal with function syms. */
7245 if (h
->type
== STT_FUNC
7246 || h
->type
== STT_GNU_IFUNC
7249 /* Clear procedure linkage table information for any symbol that
7250 won't need a .plt entry. */
7251 struct plt_entry
*ent
;
7252 for (ent
= h
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
7253 if (ent
->plt
.refcount
> 0)
7256 || (h
->type
!= STT_GNU_IFUNC
7257 && (SYMBOL_CALLS_LOCAL (info
, h
)
7258 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
7259 && h
->root
.type
== bfd_link_hash_undefweak
)))
7260 || ((struct ppc_link_hash_entry
*) h
)->save_res
)
7262 h
->plt
.plist
= NULL
;
7264 h
->pointer_equality_needed
= 0;
7266 else if (abiversion (info
->output_bfd
) >= 2)
7268 /* Taking a function's address in a read/write section
7269 doesn't require us to define the function symbol in the
7270 executable on a global entry stub. A dynamic reloc can
7271 be used instead. The reason we prefer a few more dynamic
7272 relocs is that calling via a global entry stub costs a
7273 few more instructions, and pointer_equality_needed causes
7274 extra work in ld.so when resolving these symbols. */
7275 if (global_entry_stub (h
)
7276 && !alias_readonly_dynrelocs (h
))
7278 h
->pointer_equality_needed
= 0;
7279 /* After adjust_dynamic_symbol, non_got_ref set in
7280 the non-pic case means that dyn_relocs for this
7281 symbol should be discarded. */
7285 /* If making a plt entry, then we don't need copy relocs. */
7290 h
->plt
.plist
= NULL
;
7292 /* If this is a weak symbol, and there is a real definition, the
7293 processor independent code will have arranged for us to see the
7294 real definition first, and we can just use the same value. */
7295 if (h
->u
.weakdef
!= NULL
)
7297 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
7298 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
7299 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
7300 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
7301 if (ELIMINATE_COPY_RELOCS
)
7302 h
->non_got_ref
= h
->u
.weakdef
->non_got_ref
;
7306 /* If we are creating a shared library, we must presume that the
7307 only references to the symbol are via the global offset table.
7308 For such cases we need not do anything here; the relocations will
7309 be handled correctly by relocate_section. */
7310 if (bfd_link_pic (info
))
7313 /* If there are no references to this symbol that do not use the
7314 GOT, we don't need to generate a copy reloc. */
7315 if (!h
->non_got_ref
)
7318 /* Don't generate a copy reloc for symbols defined in the executable. */
7319 if (!h
->def_dynamic
|| !h
->ref_regular
|| h
->def_regular
7321 /* If -z nocopyreloc was given, don't generate them either. */
7322 || info
->nocopyreloc
7324 /* If we didn't find any dynamic relocs in read-only sections, then
7325 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7326 || (ELIMINATE_COPY_RELOCS
&& !alias_readonly_dynrelocs (h
))
7328 /* Protected variables do not work with .dynbss. The copy in
7329 .dynbss won't be used by the shared library with the protected
7330 definition for the variable. Text relocations are preferable
7331 to an incorrect program. */
7332 || h
->protected_def
)
7338 if (h
->plt
.plist
!= NULL
)
7340 /* We should never get here, but unfortunately there are versions
7341 of gcc out there that improperly (for this ABI) put initialized
7342 function pointers, vtable refs and suchlike in read-only
7343 sections. Allow them to proceed, but warn that this might
7344 break at runtime. */
7345 info
->callbacks
->einfo
7346 (_("%P: copy reloc against `%T' requires lazy plt linking; "
7347 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7348 h
->root
.root
.string
);
7351 /* This is a reference to a symbol defined by a dynamic object which
7352 is not a function. */
7354 /* We must allocate the symbol in our .dynbss section, which will
7355 become part of the .bss section of the executable. There will be
7356 an entry for this symbol in the .dynsym section. The dynamic
7357 object will contain position independent code, so all references
7358 from the dynamic object to this symbol will go through the global
7359 offset table. The dynamic linker will use the .dynsym entry to
7360 determine the address it must put in the global offset table, so
7361 both the dynamic object and the regular object will refer to the
7362 same memory location for the variable. */
7364 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7365 to copy the initial value out of the dynamic object and into the
7366 runtime process image. We need to remember the offset into the
7367 .rela.bss section we are going to use. */
7368 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0 && h
->size
!= 0)
7370 htab
->elf
.srelbss
->size
+= sizeof (Elf64_External_Rela
);
7374 s
= htab
->elf
.sdynbss
;
7376 return _bfd_elf_adjust_dynamic_copy (info
, h
, s
);
7379 /* If given a function descriptor symbol, hide both the function code
7380 sym and the descriptor. */
7382 ppc64_elf_hide_symbol (struct bfd_link_info
*info
,
7383 struct elf_link_hash_entry
*h
,
7384 bfd_boolean force_local
)
7386 struct ppc_link_hash_entry
*eh
;
7387 _bfd_elf_link_hash_hide_symbol (info
, h
, force_local
);
7389 eh
= (struct ppc_link_hash_entry
*) h
;
7390 if (eh
->is_func_descriptor
)
7392 struct ppc_link_hash_entry
*fh
= eh
->oh
;
7397 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
7400 /* We aren't supposed to use alloca in BFD because on
7401 systems which do not have alloca the version in libiberty
7402 calls xmalloc, which might cause the program to crash
7403 when it runs out of memory. This function doesn't have a
7404 return status, so there's no way to gracefully return an
7405 error. So cheat. We know that string[-1] can be safely
7406 accessed; It's either a string in an ELF string table,
7407 or allocated in an objalloc structure. */
7409 p
= eh
->elf
.root
.root
.string
- 1;
7412 fh
= (struct ppc_link_hash_entry
*)
7413 elf_link_hash_lookup (htab
, p
, FALSE
, FALSE
, FALSE
);
7416 /* Unfortunately, if it so happens that the string we were
7417 looking for was allocated immediately before this string,
7418 then we overwrote the string terminator. That's the only
7419 reason the lookup should fail. */
7422 q
= eh
->elf
.root
.root
.string
+ strlen (eh
->elf
.root
.root
.string
);
7423 while (q
>= eh
->elf
.root
.root
.string
&& *q
== *p
)
7425 if (q
< eh
->elf
.root
.root
.string
&& *p
== '.')
7426 fh
= (struct ppc_link_hash_entry
*)
7427 elf_link_hash_lookup (htab
, p
, FALSE
, FALSE
, FALSE
);
7436 _bfd_elf_link_hash_hide_symbol (info
, &fh
->elf
, force_local
);
7441 get_sym_h (struct elf_link_hash_entry
**hp
,
7442 Elf_Internal_Sym
**symp
,
7444 unsigned char **tls_maskp
,
7445 Elf_Internal_Sym
**locsymsp
,
7446 unsigned long r_symndx
,
7449 Elf_Internal_Shdr
*symtab_hdr
= &elf_symtab_hdr (ibfd
);
7451 if (r_symndx
>= symtab_hdr
->sh_info
)
7453 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (ibfd
);
7454 struct elf_link_hash_entry
*h
;
7456 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
7457 h
= elf_follow_link (h
);
7465 if (symsecp
!= NULL
)
7467 asection
*symsec
= NULL
;
7468 if (h
->root
.type
== bfd_link_hash_defined
7469 || h
->root
.type
== bfd_link_hash_defweak
)
7470 symsec
= h
->root
.u
.def
.section
;
7474 if (tls_maskp
!= NULL
)
7476 struct ppc_link_hash_entry
*eh
;
7478 eh
= (struct ppc_link_hash_entry
*) h
;
7479 *tls_maskp
= &eh
->tls_mask
;
7484 Elf_Internal_Sym
*sym
;
7485 Elf_Internal_Sym
*locsyms
= *locsymsp
;
7487 if (locsyms
== NULL
)
7489 locsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
7490 if (locsyms
== NULL
)
7491 locsyms
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
,
7492 symtab_hdr
->sh_info
,
7493 0, NULL
, NULL
, NULL
);
7494 if (locsyms
== NULL
)
7496 *locsymsp
= locsyms
;
7498 sym
= locsyms
+ r_symndx
;
7506 if (symsecp
!= NULL
)
7507 *symsecp
= bfd_section_from_elf_index (ibfd
, sym
->st_shndx
);
7509 if (tls_maskp
!= NULL
)
7511 struct got_entry
**lgot_ents
;
7512 unsigned char *tls_mask
;
7515 lgot_ents
= elf_local_got_ents (ibfd
);
7516 if (lgot_ents
!= NULL
)
7518 struct plt_entry
**local_plt
= (struct plt_entry
**)
7519 (lgot_ents
+ symtab_hdr
->sh_info
);
7520 unsigned char *lgot_masks
= (unsigned char *)
7521 (local_plt
+ symtab_hdr
->sh_info
);
7522 tls_mask
= &lgot_masks
[r_symndx
];
7524 *tls_maskp
= tls_mask
;
7530 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7531 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7532 type suitable for optimization, and 1 otherwise. */
7535 get_tls_mask (unsigned char **tls_maskp
,
7536 unsigned long *toc_symndx
,
7537 bfd_vma
*toc_addend
,
7538 Elf_Internal_Sym
**locsymsp
,
7539 const Elf_Internal_Rela
*rel
,
7542 unsigned long r_symndx
;
7544 struct elf_link_hash_entry
*h
;
7545 Elf_Internal_Sym
*sym
;
7549 r_symndx
= ELF64_R_SYM (rel
->r_info
);
7550 if (!get_sym_h (&h
, &sym
, &sec
, tls_maskp
, locsymsp
, r_symndx
, ibfd
))
7553 if ((*tls_maskp
!= NULL
&& **tls_maskp
!= 0)
7555 || ppc64_elf_section_data (sec
) == NULL
7556 || ppc64_elf_section_data (sec
)->sec_type
!= sec_toc
)
7559 /* Look inside a TOC section too. */
7562 BFD_ASSERT (h
->root
.type
== bfd_link_hash_defined
);
7563 off
= h
->root
.u
.def
.value
;
7566 off
= sym
->st_value
;
7567 off
+= rel
->r_addend
;
7568 BFD_ASSERT (off
% 8 == 0);
7569 r_symndx
= ppc64_elf_section_data (sec
)->u
.toc
.symndx
[off
/ 8];
7570 next_r
= ppc64_elf_section_data (sec
)->u
.toc
.symndx
[off
/ 8 + 1];
7571 if (toc_symndx
!= NULL
)
7572 *toc_symndx
= r_symndx
;
7573 if (toc_addend
!= NULL
)
7574 *toc_addend
= ppc64_elf_section_data (sec
)->u
.toc
.add
[off
/ 8];
7575 if (!get_sym_h (&h
, &sym
, &sec
, tls_maskp
, locsymsp
, r_symndx
, ibfd
))
7577 if ((h
== NULL
|| is_static_defined (h
))
7578 && (next_r
== -1 || next_r
== -2))
7583 /* Find (or create) an entry in the tocsave hash table. */
7585 static struct tocsave_entry
*
7586 tocsave_find (struct ppc_link_hash_table
*htab
,
7587 enum insert_option insert
,
7588 Elf_Internal_Sym
**local_syms
,
7589 const Elf_Internal_Rela
*irela
,
7592 unsigned long r_indx
;
7593 struct elf_link_hash_entry
*h
;
7594 Elf_Internal_Sym
*sym
;
7595 struct tocsave_entry ent
, *p
;
7597 struct tocsave_entry
**slot
;
7599 r_indx
= ELF64_R_SYM (irela
->r_info
);
7600 if (!get_sym_h (&h
, &sym
, &ent
.sec
, NULL
, local_syms
, r_indx
, ibfd
))
7602 if (ent
.sec
== NULL
|| ent
.sec
->output_section
== NULL
)
7605 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7610 ent
.offset
= h
->root
.u
.def
.value
;
7612 ent
.offset
= sym
->st_value
;
7613 ent
.offset
+= irela
->r_addend
;
7615 hash
= tocsave_htab_hash (&ent
);
7616 slot
= ((struct tocsave_entry
**)
7617 htab_find_slot_with_hash (htab
->tocsave_htab
, &ent
, hash
, insert
));
7623 p
= (struct tocsave_entry
*) bfd_alloc (ibfd
, sizeof (*p
));
7632 /* Adjust all global syms defined in opd sections. In gcc generated
7633 code for the old ABI, these will already have been done. */
7636 adjust_opd_syms (struct elf_link_hash_entry
*h
, void *inf ATTRIBUTE_UNUSED
)
7638 struct ppc_link_hash_entry
*eh
;
7640 struct _opd_sec_data
*opd
;
7642 if (h
->root
.type
== bfd_link_hash_indirect
)
7645 if (h
->root
.type
!= bfd_link_hash_defined
7646 && h
->root
.type
!= bfd_link_hash_defweak
)
7649 eh
= (struct ppc_link_hash_entry
*) h
;
7650 if (eh
->adjust_done
)
7653 sym_sec
= eh
->elf
.root
.u
.def
.section
;
7654 opd
= get_opd_info (sym_sec
);
7655 if (opd
!= NULL
&& opd
->adjust
!= NULL
)
7657 long adjust
= opd
->adjust
[OPD_NDX (eh
->elf
.root
.u
.def
.value
)];
7660 /* This entry has been deleted. */
7661 asection
*dsec
= ppc64_elf_tdata (sym_sec
->owner
)->deleted_section
;
7664 for (dsec
= sym_sec
->owner
->sections
; dsec
; dsec
= dsec
->next
)
7665 if (discarded_section (dsec
))
7667 ppc64_elf_tdata (sym_sec
->owner
)->deleted_section
= dsec
;
7671 eh
->elf
.root
.u
.def
.value
= 0;
7672 eh
->elf
.root
.u
.def
.section
= dsec
;
7675 eh
->elf
.root
.u
.def
.value
+= adjust
;
7676 eh
->adjust_done
= 1;
7681 /* Handles decrementing dynamic reloc counts for the reloc specified by
7682 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7683 have already been determined. */
7686 dec_dynrel_count (bfd_vma r_info
,
7688 struct bfd_link_info
*info
,
7689 Elf_Internal_Sym
**local_syms
,
7690 struct elf_link_hash_entry
*h
,
7691 Elf_Internal_Sym
*sym
)
7693 enum elf_ppc64_reloc_type r_type
;
7694 asection
*sym_sec
= NULL
;
7696 /* Can this reloc be dynamic? This switch, and later tests here
7697 should be kept in sync with the code in check_relocs. */
7698 r_type
= ELF64_R_TYPE (r_info
);
7704 case R_PPC64_TPREL16
:
7705 case R_PPC64_TPREL16_LO
:
7706 case R_PPC64_TPREL16_HI
:
7707 case R_PPC64_TPREL16_HA
:
7708 case R_PPC64_TPREL16_DS
:
7709 case R_PPC64_TPREL16_LO_DS
:
7710 case R_PPC64_TPREL16_HIGH
:
7711 case R_PPC64_TPREL16_HIGHA
:
7712 case R_PPC64_TPREL16_HIGHER
:
7713 case R_PPC64_TPREL16_HIGHERA
:
7714 case R_PPC64_TPREL16_HIGHEST
:
7715 case R_PPC64_TPREL16_HIGHESTA
:
7716 if (!bfd_link_pic (info
))
7719 case R_PPC64_TPREL64
:
7720 case R_PPC64_DTPMOD64
:
7721 case R_PPC64_DTPREL64
:
7722 case R_PPC64_ADDR64
:
7726 case R_PPC64_ADDR14
:
7727 case R_PPC64_ADDR14_BRNTAKEN
:
7728 case R_PPC64_ADDR14_BRTAKEN
:
7729 case R_PPC64_ADDR16
:
7730 case R_PPC64_ADDR16_DS
:
7731 case R_PPC64_ADDR16_HA
:
7732 case R_PPC64_ADDR16_HI
:
7733 case R_PPC64_ADDR16_HIGH
:
7734 case R_PPC64_ADDR16_HIGHA
:
7735 case R_PPC64_ADDR16_HIGHER
:
7736 case R_PPC64_ADDR16_HIGHERA
:
7737 case R_PPC64_ADDR16_HIGHEST
:
7738 case R_PPC64_ADDR16_HIGHESTA
:
7739 case R_PPC64_ADDR16_LO
:
7740 case R_PPC64_ADDR16_LO_DS
:
7741 case R_PPC64_ADDR24
:
7742 case R_PPC64_ADDR32
:
7743 case R_PPC64_UADDR16
:
7744 case R_PPC64_UADDR32
:
7745 case R_PPC64_UADDR64
:
7750 if (local_syms
!= NULL
)
7752 unsigned long r_symndx
;
7753 bfd
*ibfd
= sec
->owner
;
7755 r_symndx
= ELF64_R_SYM (r_info
);
7756 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, local_syms
, r_symndx
, ibfd
))
7760 if ((bfd_link_pic (info
)
7761 && (must_be_dyn_reloc (info
, r_type
)
7763 && (!SYMBOLIC_BIND (info
, h
)
7764 || h
->root
.type
== bfd_link_hash_defweak
7765 || !h
->def_regular
))))
7766 || (ELIMINATE_COPY_RELOCS
7767 && !bfd_link_pic (info
)
7769 && (h
->root
.type
== bfd_link_hash_defweak
7770 || !h
->def_regular
)))
7777 struct elf_dyn_relocs
*p
;
7778 struct elf_dyn_relocs
**pp
;
7779 pp
= &((struct ppc_link_hash_entry
*) h
)->dyn_relocs
;
7781 /* elf_gc_sweep may have already removed all dyn relocs associated
7782 with local syms for a given section. Also, symbol flags are
7783 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7784 report a dynreloc miscount. */
7785 if (*pp
== NULL
&& info
->gc_sections
)
7788 while ((p
= *pp
) != NULL
)
7792 if (!must_be_dyn_reloc (info
, r_type
))
7804 struct ppc_dyn_relocs
*p
;
7805 struct ppc_dyn_relocs
**pp
;
7807 bfd_boolean is_ifunc
;
7809 if (local_syms
== NULL
)
7810 sym_sec
= bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
7811 if (sym_sec
== NULL
)
7814 vpp
= &elf_section_data (sym_sec
)->local_dynrel
;
7815 pp
= (struct ppc_dyn_relocs
**) vpp
;
7817 if (*pp
== NULL
&& info
->gc_sections
)
7820 is_ifunc
= ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
;
7821 while ((p
= *pp
) != NULL
)
7823 if (p
->sec
== sec
&& p
->ifunc
== is_ifunc
)
7834 /* xgettext:c-format */
7835 info
->callbacks
->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7837 bfd_set_error (bfd_error_bad_value
);
7841 /* Remove unused Official Procedure Descriptor entries. Currently we
7842 only remove those associated with functions in discarded link-once
7843 sections, or weakly defined functions that have been overridden. It
7844 would be possible to remove many more entries for statically linked
7848 ppc64_elf_edit_opd (struct bfd_link_info
*info
)
7851 bfd_boolean some_edited
= FALSE
;
7852 asection
*need_pad
= NULL
;
7853 struct ppc_link_hash_table
*htab
;
7855 htab
= ppc_hash_table (info
);
7859 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
7862 Elf_Internal_Rela
*relstart
, *rel
, *relend
;
7863 Elf_Internal_Shdr
*symtab_hdr
;
7864 Elf_Internal_Sym
*local_syms
;
7865 struct _opd_sec_data
*opd
;
7866 bfd_boolean need_edit
, add_aux_fields
, broken
;
7867 bfd_size_type cnt_16b
= 0;
7869 if (!is_ppc64_elf (ibfd
))
7872 sec
= bfd_get_section_by_name (ibfd
, ".opd");
7873 if (sec
== NULL
|| sec
->size
== 0)
7876 if (sec
->sec_info_type
== SEC_INFO_TYPE_JUST_SYMS
)
7879 if (sec
->output_section
== bfd_abs_section_ptr
)
7882 /* Look through the section relocs. */
7883 if ((sec
->flags
& SEC_RELOC
) == 0 || sec
->reloc_count
== 0)
7887 symtab_hdr
= &elf_symtab_hdr (ibfd
);
7889 /* Read the relocations. */
7890 relstart
= _bfd_elf_link_read_relocs (ibfd
, sec
, NULL
, NULL
,
7892 if (relstart
== NULL
)
7895 /* First run through the relocs to check they are sane, and to
7896 determine whether we need to edit this opd section. */
7900 relend
= relstart
+ sec
->reloc_count
;
7901 for (rel
= relstart
; rel
< relend
; )
7903 enum elf_ppc64_reloc_type r_type
;
7904 unsigned long r_symndx
;
7906 struct elf_link_hash_entry
*h
;
7907 Elf_Internal_Sym
*sym
;
7910 /* .opd contains an array of 16 or 24 byte entries. We're
7911 only interested in the reloc pointing to a function entry
7913 offset
= rel
->r_offset
;
7914 if (rel
+ 1 == relend
7915 || rel
[1].r_offset
!= offset
+ 8)
7917 /* If someone messes with .opd alignment then after a
7918 "ld -r" we might have padding in the middle of .opd.
7919 Also, there's nothing to prevent someone putting
7920 something silly in .opd with the assembler. No .opd
7921 optimization for them! */
7924 (_("%B: .opd is not a regular array of opd entries"), ibfd
);
7929 if ((r_type
= ELF64_R_TYPE (rel
->r_info
)) != R_PPC64_ADDR64
7930 || (r_type
= ELF64_R_TYPE ((rel
+ 1)->r_info
)) != R_PPC64_TOC
)
7933 /* xgettext:c-format */
7934 (_("%B: unexpected reloc type %u in .opd section"),
7940 r_symndx
= ELF64_R_SYM (rel
->r_info
);
7941 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
7945 if (sym_sec
== NULL
|| sym_sec
->owner
== NULL
)
7947 const char *sym_name
;
7949 sym_name
= h
->root
.root
.string
;
7951 sym_name
= bfd_elf_sym_name (ibfd
, symtab_hdr
, sym
,
7955 /* xgettext:c-format */
7956 (_("%B: undefined sym `%s' in .opd section"),
7962 /* opd entries are always for functions defined in the
7963 current input bfd. If the symbol isn't defined in the
7964 input bfd, then we won't be using the function in this
7965 bfd; It must be defined in a linkonce section in another
7966 bfd, or is weak. It's also possible that we are
7967 discarding the function due to a linker script /DISCARD/,
7968 which we test for via the output_section. */
7969 if (sym_sec
->owner
!= ibfd
7970 || sym_sec
->output_section
== bfd_abs_section_ptr
)
7974 if (rel
+ 1 == relend
7975 || (rel
+ 2 < relend
7976 && ELF64_R_TYPE (rel
[2].r_info
) == R_PPC64_TOC
))
7981 if (sec
->size
== offset
+ 24)
7986 if (sec
->size
== offset
+ 16)
7993 else if (rel
+ 1 < relend
7994 && ELF64_R_TYPE (rel
[0].r_info
) == R_PPC64_ADDR64
7995 && ELF64_R_TYPE (rel
[1].r_info
) == R_PPC64_TOC
)
7997 if (rel
[0].r_offset
== offset
+ 16)
7999 else if (rel
[0].r_offset
!= offset
+ 24)
8006 add_aux_fields
= htab
->params
->non_overlapping_opd
&& cnt_16b
> 0;
8008 if (!broken
&& (need_edit
|| add_aux_fields
))
8010 Elf_Internal_Rela
*write_rel
;
8011 Elf_Internal_Shdr
*rel_hdr
;
8012 bfd_byte
*rptr
, *wptr
;
8013 bfd_byte
*new_contents
;
8016 new_contents
= NULL
;
8017 amt
= OPD_NDX (sec
->size
) * sizeof (long);
8018 opd
= &ppc64_elf_section_data (sec
)->u
.opd
;
8019 opd
->adjust
= bfd_zalloc (sec
->owner
, amt
);
8020 if (opd
->adjust
== NULL
)
8022 ppc64_elf_section_data (sec
)->sec_type
= sec_opd
;
8024 /* This seems a waste of time as input .opd sections are all
8025 zeros as generated by gcc, but I suppose there's no reason
8026 this will always be so. We might start putting something in
8027 the third word of .opd entries. */
8028 if ((sec
->flags
& SEC_IN_MEMORY
) == 0)
8031 if (!bfd_malloc_and_get_section (ibfd
, sec
, &loc
))
8036 if (local_syms
!= NULL
8037 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
8039 if (elf_section_data (sec
)->relocs
!= relstart
)
8043 sec
->contents
= loc
;
8044 sec
->flags
|= (SEC_IN_MEMORY
| SEC_HAS_CONTENTS
);
8047 elf_section_data (sec
)->relocs
= relstart
;
8049 new_contents
= sec
->contents
;
8052 new_contents
= bfd_malloc (sec
->size
+ cnt_16b
* 8);
8053 if (new_contents
== NULL
)
8057 wptr
= new_contents
;
8058 rptr
= sec
->contents
;
8059 write_rel
= relstart
;
8060 for (rel
= relstart
; rel
< relend
; )
8062 unsigned long r_symndx
;
8064 struct elf_link_hash_entry
*h
;
8065 struct ppc_link_hash_entry
*fdh
= NULL
;
8066 Elf_Internal_Sym
*sym
;
8068 Elf_Internal_Rela
*next_rel
;
8071 r_symndx
= ELF64_R_SYM (rel
->r_info
);
8072 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
8077 if (next_rel
+ 1 == relend
8078 || (next_rel
+ 2 < relend
8079 && ELF64_R_TYPE (next_rel
[2].r_info
) == R_PPC64_TOC
))
8082 /* See if the .opd entry is full 24 byte or
8083 16 byte (with fd_aux entry overlapped with next
8086 if (next_rel
== relend
)
8088 if (sec
->size
== rel
->r_offset
+ 16)
8091 else if (next_rel
->r_offset
== rel
->r_offset
+ 16)
8095 && h
->root
.root
.string
[0] == '.')
8097 fdh
= ((struct ppc_link_hash_entry
*) h
)->oh
;
8100 fdh
= ppc_follow_link (fdh
);
8101 if (fdh
->elf
.root
.type
!= bfd_link_hash_defined
8102 && fdh
->elf
.root
.type
!= bfd_link_hash_defweak
)
8107 skip
= (sym_sec
->owner
!= ibfd
8108 || sym_sec
->output_section
== bfd_abs_section_ptr
);
8111 if (fdh
!= NULL
&& sym_sec
->owner
== ibfd
)
8113 /* Arrange for the function descriptor sym
8115 fdh
->elf
.root
.u
.def
.value
= 0;
8116 fdh
->elf
.root
.u
.def
.section
= sym_sec
;
8118 opd
->adjust
[OPD_NDX (rel
->r_offset
)] = -1;
8120 if (NO_OPD_RELOCS
|| bfd_link_relocatable (info
))
8125 if (!dec_dynrel_count (rel
->r_info
, sec
, info
,
8129 if (++rel
== next_rel
)
8132 r_symndx
= ELF64_R_SYM (rel
->r_info
);
8133 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
8140 /* We'll be keeping this opd entry. */
8145 /* Redefine the function descriptor symbol to
8146 this location in the opd section. It is
8147 necessary to update the value here rather
8148 than using an array of adjustments as we do
8149 for local symbols, because various places
8150 in the generic ELF code use the value
8151 stored in u.def.value. */
8152 fdh
->elf
.root
.u
.def
.value
= wptr
- new_contents
;
8153 fdh
->adjust_done
= 1;
8156 /* Local syms are a bit tricky. We could
8157 tweak them as they can be cached, but
8158 we'd need to look through the local syms
8159 for the function descriptor sym which we
8160 don't have at the moment. So keep an
8161 array of adjustments. */
8162 adjust
= (wptr
- new_contents
) - (rptr
- sec
->contents
);
8163 opd
->adjust
[OPD_NDX (rel
->r_offset
)] = adjust
;
8166 memcpy (wptr
, rptr
, opd_ent_size
);
8167 wptr
+= opd_ent_size
;
8168 if (add_aux_fields
&& opd_ent_size
== 16)
8170 memset (wptr
, '\0', 8);
8174 /* We need to adjust any reloc offsets to point to the
8176 for ( ; rel
!= next_rel
; ++rel
)
8178 rel
->r_offset
+= adjust
;
8179 if (write_rel
!= rel
)
8180 memcpy (write_rel
, rel
, sizeof (*rel
));
8185 rptr
+= opd_ent_size
;
8188 sec
->size
= wptr
- new_contents
;
8189 sec
->reloc_count
= write_rel
- relstart
;
8192 free (sec
->contents
);
8193 sec
->contents
= new_contents
;
8196 /* Fudge the header size too, as this is used later in
8197 elf_bfd_final_link if we are emitting relocs. */
8198 rel_hdr
= _bfd_elf_single_rel_hdr (sec
);
8199 rel_hdr
->sh_size
= sec
->reloc_count
* rel_hdr
->sh_entsize
;
8202 else if (elf_section_data (sec
)->relocs
!= relstart
)
8205 if (local_syms
!= NULL
8206 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
8208 if (!info
->keep_memory
)
8211 symtab_hdr
->contents
= (unsigned char *) local_syms
;
8216 elf_link_hash_traverse (elf_hash_table (info
), adjust_opd_syms
, NULL
);
8218 /* If we are doing a final link and the last .opd entry is just 16 byte
8219 long, add a 8 byte padding after it. */
8220 if (need_pad
!= NULL
&& !bfd_link_relocatable (info
))
8224 if ((need_pad
->flags
& SEC_IN_MEMORY
) == 0)
8226 BFD_ASSERT (need_pad
->size
> 0);
8228 p
= bfd_malloc (need_pad
->size
+ 8);
8232 if (! bfd_get_section_contents (need_pad
->owner
, need_pad
,
8233 p
, 0, need_pad
->size
))
8236 need_pad
->contents
= p
;
8237 need_pad
->flags
|= (SEC_IN_MEMORY
| SEC_HAS_CONTENTS
);
8241 p
= bfd_realloc (need_pad
->contents
, need_pad
->size
+ 8);
8245 need_pad
->contents
= p
;
8248 memset (need_pad
->contents
+ need_pad
->size
, 0, 8);
8249 need_pad
->size
+= 8;
8255 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
8258 ppc64_elf_tls_setup (struct bfd_link_info
*info
)
8260 struct ppc_link_hash_table
*htab
;
8262 htab
= ppc_hash_table (info
);
8266 if (abiversion (info
->output_bfd
) == 1)
8269 if (htab
->params
->no_multi_toc
)
8270 htab
->do_multi_toc
= 0;
8271 else if (!htab
->do_multi_toc
)
8272 htab
->params
->no_multi_toc
= 1;
8274 htab
->tls_get_addr
= ((struct ppc_link_hash_entry
*)
8275 elf_link_hash_lookup (&htab
->elf
, ".__tls_get_addr",
8276 FALSE
, FALSE
, TRUE
));
8277 /* Move dynamic linking info to the function descriptor sym. */
8278 if (htab
->tls_get_addr
!= NULL
)
8279 func_desc_adjust (&htab
->tls_get_addr
->elf
, info
);
8280 htab
->tls_get_addr_fd
= ((struct ppc_link_hash_entry
*)
8281 elf_link_hash_lookup (&htab
->elf
, "__tls_get_addr",
8282 FALSE
, FALSE
, TRUE
));
8283 if (htab
->params
->tls_get_addr_opt
)
8285 struct elf_link_hash_entry
*opt
, *opt_fd
, *tga
, *tga_fd
;
8287 opt
= elf_link_hash_lookup (&htab
->elf
, ".__tls_get_addr_opt",
8288 FALSE
, FALSE
, TRUE
);
8290 func_desc_adjust (opt
, info
);
8291 opt_fd
= elf_link_hash_lookup (&htab
->elf
, "__tls_get_addr_opt",
8292 FALSE
, FALSE
, TRUE
);
8294 && (opt_fd
->root
.type
== bfd_link_hash_defined
8295 || opt_fd
->root
.type
== bfd_link_hash_defweak
))
8297 /* If glibc supports an optimized __tls_get_addr call stub,
8298 signalled by the presence of __tls_get_addr_opt, and we'll
8299 be calling __tls_get_addr via a plt call stub, then
8300 make __tls_get_addr point to __tls_get_addr_opt. */
8301 tga_fd
= &htab
->tls_get_addr_fd
->elf
;
8302 if (htab
->elf
.dynamic_sections_created
8304 && (tga_fd
->type
== STT_FUNC
8305 || tga_fd
->needs_plt
)
8306 && !(SYMBOL_CALLS_LOCAL (info
, tga_fd
)
8307 || (ELF_ST_VISIBILITY (tga_fd
->other
) != STV_DEFAULT
8308 && tga_fd
->root
.type
== bfd_link_hash_undefweak
)))
8310 struct plt_entry
*ent
;
8312 for (ent
= tga_fd
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
8313 if (ent
->plt
.refcount
> 0)
8317 tga_fd
->root
.type
= bfd_link_hash_indirect
;
8318 tga_fd
->root
.u
.i
.link
= &opt_fd
->root
;
8319 ppc64_elf_copy_indirect_symbol (info
, opt_fd
, tga_fd
);
8320 opt_fd
->forced_local
= 0;
8321 if (opt_fd
->dynindx
!= -1)
8323 /* Use __tls_get_addr_opt in dynamic relocations. */
8324 opt_fd
->dynindx
= -1;
8325 _bfd_elf_strtab_delref (elf_hash_table (info
)->dynstr
,
8326 opt_fd
->dynstr_index
);
8327 if (!bfd_elf_link_record_dynamic_symbol (info
, opt_fd
))
8330 htab
->tls_get_addr_fd
= (struct ppc_link_hash_entry
*) opt_fd
;
8331 tga
= &htab
->tls_get_addr
->elf
;
8332 if (opt
!= NULL
&& tga
!= NULL
)
8334 tga
->root
.type
= bfd_link_hash_indirect
;
8335 tga
->root
.u
.i
.link
= &opt
->root
;
8336 ppc64_elf_copy_indirect_symbol (info
, opt
, tga
);
8337 opt
->forced_local
= 0;
8338 _bfd_elf_link_hash_hide_symbol (info
, opt
,
8340 htab
->tls_get_addr
= (struct ppc_link_hash_entry
*) opt
;
8342 htab
->tls_get_addr_fd
->oh
= htab
->tls_get_addr
;
8343 htab
->tls_get_addr_fd
->is_func_descriptor
= 1;
8344 if (htab
->tls_get_addr
!= NULL
)
8346 htab
->tls_get_addr
->oh
= htab
->tls_get_addr_fd
;
8347 htab
->tls_get_addr
->is_func
= 1;
8352 else if (htab
->params
->tls_get_addr_opt
< 0)
8353 htab
->params
->tls_get_addr_opt
= 0;
8355 return _bfd_elf_tls_setup (info
->output_bfd
, info
);
8358 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8362 branch_reloc_hash_match (const bfd
*ibfd
,
8363 const Elf_Internal_Rela
*rel
,
8364 const struct ppc_link_hash_entry
*hash1
,
8365 const struct ppc_link_hash_entry
*hash2
)
8367 Elf_Internal_Shdr
*symtab_hdr
= &elf_symtab_hdr (ibfd
);
8368 enum elf_ppc64_reloc_type r_type
= ELF64_R_TYPE (rel
->r_info
);
8369 unsigned int r_symndx
= ELF64_R_SYM (rel
->r_info
);
8371 if (r_symndx
>= symtab_hdr
->sh_info
&& is_branch_reloc (r_type
))
8373 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (ibfd
);
8374 struct elf_link_hash_entry
*h
;
8376 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
8377 h
= elf_follow_link (h
);
8378 if (h
== &hash1
->elf
|| h
== &hash2
->elf
)
8384 /* Run through all the TLS relocs looking for optimization
8385 opportunities. The linker has been hacked (see ppc64elf.em) to do
8386 a preliminary section layout so that we know the TLS segment
8387 offsets. We can't optimize earlier because some optimizations need
8388 to know the tp offset, and we need to optimize before allocating
8389 dynamic relocations. */
8392 ppc64_elf_tls_optimize (struct bfd_link_info
*info
)
8396 struct ppc_link_hash_table
*htab
;
8397 unsigned char *toc_ref
;
8400 if (!bfd_link_executable (info
))
8403 htab
= ppc_hash_table (info
);
8407 /* Make two passes over the relocs. On the first pass, mark toc
8408 entries involved with tls relocs, and check that tls relocs
8409 involved in setting up a tls_get_addr call are indeed followed by
8410 such a call. If they are not, we can't do any tls optimization.
8411 On the second pass twiddle tls_mask flags to notify
8412 relocate_section that optimization can be done, and adjust got
8413 and plt refcounts. */
8415 for (pass
= 0; pass
< 2; ++pass
)
8416 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
8418 Elf_Internal_Sym
*locsyms
= NULL
;
8419 asection
*toc
= bfd_get_section_by_name (ibfd
, ".toc");
8421 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8422 if (sec
->has_tls_reloc
&& !bfd_is_abs_section (sec
->output_section
))
8424 Elf_Internal_Rela
*relstart
, *rel
, *relend
;
8425 bfd_boolean found_tls_get_addr_arg
= 0;
8427 /* Read the relocations. */
8428 relstart
= _bfd_elf_link_read_relocs (ibfd
, sec
, NULL
, NULL
,
8430 if (relstart
== NULL
)
8436 relend
= relstart
+ sec
->reloc_count
;
8437 for (rel
= relstart
; rel
< relend
; rel
++)
8439 enum elf_ppc64_reloc_type r_type
;
8440 unsigned long r_symndx
;
8441 struct elf_link_hash_entry
*h
;
8442 Elf_Internal_Sym
*sym
;
8444 unsigned char *tls_mask
;
8445 unsigned char tls_set
, tls_clear
, tls_type
= 0;
8447 bfd_boolean ok_tprel
, is_local
;
8448 long toc_ref_index
= 0;
8449 int expecting_tls_get_addr
= 0;
8450 bfd_boolean ret
= FALSE
;
8452 r_symndx
= ELF64_R_SYM (rel
->r_info
);
8453 if (!get_sym_h (&h
, &sym
, &sym_sec
, &tls_mask
, &locsyms
,
8457 if (elf_section_data (sec
)->relocs
!= relstart
)
8459 if (toc_ref
!= NULL
)
8462 && (elf_symtab_hdr (ibfd
).contents
8463 != (unsigned char *) locsyms
))
8470 if (h
->root
.type
== bfd_link_hash_defined
8471 || h
->root
.type
== bfd_link_hash_defweak
)
8472 value
= h
->root
.u
.def
.value
;
8473 else if (h
->root
.type
== bfd_link_hash_undefweak
)
8477 found_tls_get_addr_arg
= 0;
8482 /* Symbols referenced by TLS relocs must be of type
8483 STT_TLS. So no need for .opd local sym adjust. */
8484 value
= sym
->st_value
;
8493 && h
->root
.type
== bfd_link_hash_undefweak
)
8495 else if (sym_sec
!= NULL
8496 && sym_sec
->output_section
!= NULL
)
8498 value
+= sym_sec
->output_offset
;
8499 value
+= sym_sec
->output_section
->vma
;
8500 value
-= htab
->elf
.tls_sec
->vma
;
8501 ok_tprel
= (value
+ TP_OFFSET
+ ((bfd_vma
) 1 << 31)
8502 < (bfd_vma
) 1 << 32);
8506 r_type
= ELF64_R_TYPE (rel
->r_info
);
8507 /* If this section has old-style __tls_get_addr calls
8508 without marker relocs, then check that each
8509 __tls_get_addr call reloc is preceded by a reloc
8510 that conceivably belongs to the __tls_get_addr arg
8511 setup insn. If we don't find matching arg setup
8512 relocs, don't do any tls optimization. */
8514 && sec
->has_tls_get_addr_call
8516 && (h
== &htab
->tls_get_addr
->elf
8517 || h
== &htab
->tls_get_addr_fd
->elf
)
8518 && !found_tls_get_addr_arg
8519 && is_branch_reloc (r_type
))
8521 info
->callbacks
->minfo (_("%H __tls_get_addr lost arg, "
8522 "TLS optimization disabled\n"),
8523 ibfd
, sec
, rel
->r_offset
);
8528 found_tls_get_addr_arg
= 0;
8531 case R_PPC64_GOT_TLSLD16
:
8532 case R_PPC64_GOT_TLSLD16_LO
:
8533 expecting_tls_get_addr
= 1;
8534 found_tls_get_addr_arg
= 1;
8537 case R_PPC64_GOT_TLSLD16_HI
:
8538 case R_PPC64_GOT_TLSLD16_HA
:
8539 /* These relocs should never be against a symbol
8540 defined in a shared lib. Leave them alone if
8541 that turns out to be the case. */
8548 tls_type
= TLS_TLS
| TLS_LD
;
8551 case R_PPC64_GOT_TLSGD16
:
8552 case R_PPC64_GOT_TLSGD16_LO
:
8553 expecting_tls_get_addr
= 1;
8554 found_tls_get_addr_arg
= 1;
8557 case R_PPC64_GOT_TLSGD16_HI
:
8558 case R_PPC64_GOT_TLSGD16_HA
:
8564 tls_set
= TLS_TLS
| TLS_TPRELGD
;
8566 tls_type
= TLS_TLS
| TLS_GD
;
8569 case R_PPC64_GOT_TPREL16_DS
:
8570 case R_PPC64_GOT_TPREL16_LO_DS
:
8571 case R_PPC64_GOT_TPREL16_HI
:
8572 case R_PPC64_GOT_TPREL16_HA
:
8577 tls_clear
= TLS_TPREL
;
8578 tls_type
= TLS_TLS
| TLS_TPREL
;
8585 found_tls_get_addr_arg
= 1;
8590 case R_PPC64_TOC16_LO
:
8591 if (sym_sec
== NULL
|| sym_sec
!= toc
)
8594 /* Mark this toc entry as referenced by a TLS
8595 code sequence. We can do that now in the
8596 case of R_PPC64_TLS, and after checking for
8597 tls_get_addr for the TOC16 relocs. */
8598 if (toc_ref
== NULL
)
8599 toc_ref
= bfd_zmalloc (toc
->output_section
->rawsize
/ 8);
8600 if (toc_ref
== NULL
)
8604 value
= h
->root
.u
.def
.value
;
8606 value
= sym
->st_value
;
8607 value
+= rel
->r_addend
;
8610 BFD_ASSERT (value
< toc
->size
8611 && toc
->output_offset
% 8 == 0);
8612 toc_ref_index
= (value
+ toc
->output_offset
) / 8;
8613 if (r_type
== R_PPC64_TLS
8614 || r_type
== R_PPC64_TLSGD
8615 || r_type
== R_PPC64_TLSLD
)
8617 toc_ref
[toc_ref_index
] = 1;
8621 if (pass
!= 0 && toc_ref
[toc_ref_index
] == 0)
8626 expecting_tls_get_addr
= 2;
8629 case R_PPC64_TPREL64
:
8633 || !toc_ref
[(rel
->r_offset
+ toc
->output_offset
) / 8])
8638 tls_set
= TLS_EXPLICIT
;
8639 tls_clear
= TLS_TPREL
;
8644 case R_PPC64_DTPMOD64
:
8648 || !toc_ref
[(rel
->r_offset
+ toc
->output_offset
) / 8])
8650 if (rel
+ 1 < relend
8652 == ELF64_R_INFO (r_symndx
, R_PPC64_DTPREL64
))
8653 && rel
[1].r_offset
== rel
->r_offset
+ 8)
8657 tls_set
= TLS_EXPLICIT
| TLS_GD
;
8660 tls_set
= TLS_EXPLICIT
| TLS_GD
| TLS_TPRELGD
;
8669 tls_set
= TLS_EXPLICIT
;
8680 if (!expecting_tls_get_addr
8681 || !sec
->has_tls_get_addr_call
)
8684 if (rel
+ 1 < relend
8685 && branch_reloc_hash_match (ibfd
, rel
+ 1,
8687 htab
->tls_get_addr_fd
))
8689 if (expecting_tls_get_addr
== 2)
8691 /* Check for toc tls entries. */
8692 unsigned char *toc_tls
;
8695 retval
= get_tls_mask (&toc_tls
, NULL
, NULL
,
8700 if (toc_tls
!= NULL
)
8702 if ((*toc_tls
& (TLS_GD
| TLS_LD
)) != 0)
8703 found_tls_get_addr_arg
= 1;
8705 toc_ref
[toc_ref_index
] = 1;
8711 if (expecting_tls_get_addr
!= 1)
8714 /* Uh oh, we didn't find the expected call. We
8715 could just mark this symbol to exclude it
8716 from tls optimization but it's safer to skip
8717 the entire optimization. */
8718 /* xgettext:c-format */
8719 info
->callbacks
->minfo (_("%H arg lost __tls_get_addr, "
8720 "TLS optimization disabled\n"),
8721 ibfd
, sec
, rel
->r_offset
);
8726 if (expecting_tls_get_addr
&& htab
->tls_get_addr
!= NULL
)
8728 struct plt_entry
*ent
;
8729 for (ent
= htab
->tls_get_addr
->elf
.plt
.plist
;
8732 if (ent
->addend
== 0)
8734 if (ent
->plt
.refcount
> 0)
8736 ent
->plt
.refcount
-= 1;
8737 expecting_tls_get_addr
= 0;
8743 if (expecting_tls_get_addr
&& htab
->tls_get_addr_fd
!= NULL
)
8745 struct plt_entry
*ent
;
8746 for (ent
= htab
->tls_get_addr_fd
->elf
.plt
.plist
;
8749 if (ent
->addend
== 0)
8751 if (ent
->plt
.refcount
> 0)
8752 ent
->plt
.refcount
-= 1;
8760 if ((tls_set
& TLS_EXPLICIT
) == 0)
8762 struct got_entry
*ent
;
8764 /* Adjust got entry for this reloc. */
8768 ent
= elf_local_got_ents (ibfd
)[r_symndx
];
8770 for (; ent
!= NULL
; ent
= ent
->next
)
8771 if (ent
->addend
== rel
->r_addend
8772 && ent
->owner
== ibfd
8773 && ent
->tls_type
== tls_type
)
8780 /* We managed to get rid of a got entry. */
8781 if (ent
->got
.refcount
> 0)
8782 ent
->got
.refcount
-= 1;
8787 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8788 we'll lose one or two dyn relocs. */
8789 if (!dec_dynrel_count (rel
->r_info
, sec
, info
,
8793 if (tls_set
== (TLS_EXPLICIT
| TLS_GD
))
8795 if (!dec_dynrel_count ((rel
+ 1)->r_info
, sec
, info
,
8801 *tls_mask
|= tls_set
;
8802 *tls_mask
&= ~tls_clear
;
8805 if (elf_section_data (sec
)->relocs
!= relstart
)
8810 && (elf_symtab_hdr (ibfd
).contents
!= (unsigned char *) locsyms
))
8812 if (!info
->keep_memory
)
8815 elf_symtab_hdr (ibfd
).contents
= (unsigned char *) locsyms
;
8819 if (toc_ref
!= NULL
)
8824 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8825 the values of any global symbols in a toc section that has been
8826 edited. Globals in toc sections should be a rarity, so this function
8827 sets a flag if any are found in toc sections other than the one just
8828 edited, so that futher hash table traversals can be avoided. */
8830 struct adjust_toc_info
8833 unsigned long *skip
;
8834 bfd_boolean global_toc_syms
;
8837 enum toc_skip_enum
{ ref_from_discarded
= 1, can_optimize
= 2 };
8840 adjust_toc_syms (struct elf_link_hash_entry
*h
, void *inf
)
8842 struct ppc_link_hash_entry
*eh
;
8843 struct adjust_toc_info
*toc_inf
= (struct adjust_toc_info
*) inf
;
8846 if (h
->root
.type
!= bfd_link_hash_defined
8847 && h
->root
.type
!= bfd_link_hash_defweak
)
8850 eh
= (struct ppc_link_hash_entry
*) h
;
8851 if (eh
->adjust_done
)
8854 if (eh
->elf
.root
.u
.def
.section
== toc_inf
->toc
)
8856 if (eh
->elf
.root
.u
.def
.value
> toc_inf
->toc
->rawsize
)
8857 i
= toc_inf
->toc
->rawsize
>> 3;
8859 i
= eh
->elf
.root
.u
.def
.value
>> 3;
8861 if ((toc_inf
->skip
[i
] & (ref_from_discarded
| can_optimize
)) != 0)
8864 (_("%s defined on removed toc entry"), eh
->elf
.root
.root
.string
);
8867 while ((toc_inf
->skip
[i
] & (ref_from_discarded
| can_optimize
)) != 0);
8868 eh
->elf
.root
.u
.def
.value
= (bfd_vma
) i
<< 3;
8871 eh
->elf
.root
.u
.def
.value
-= toc_inf
->skip
[i
];
8872 eh
->adjust_done
= 1;
8874 else if (strcmp (eh
->elf
.root
.u
.def
.section
->name
, ".toc") == 0)
8875 toc_inf
->global_toc_syms
= TRUE
;
8880 /* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8881 on a _LO variety toc/got reloc. */
8884 ok_lo_toc_insn (unsigned int insn
, enum elf_ppc64_reloc_type r_type
)
8886 return ((insn
& (0x3f << 26)) == 12u << 26 /* addic */
8887 || (insn
& (0x3f << 26)) == 14u << 26 /* addi */
8888 || (insn
& (0x3f << 26)) == 32u << 26 /* lwz */
8889 || (insn
& (0x3f << 26)) == 34u << 26 /* lbz */
8890 || (insn
& (0x3f << 26)) == 36u << 26 /* stw */
8891 || (insn
& (0x3f << 26)) == 38u << 26 /* stb */
8892 || (insn
& (0x3f << 26)) == 40u << 26 /* lhz */
8893 || (insn
& (0x3f << 26)) == 42u << 26 /* lha */
8894 || (insn
& (0x3f << 26)) == 44u << 26 /* sth */
8895 || (insn
& (0x3f << 26)) == 46u << 26 /* lmw */
8896 || (insn
& (0x3f << 26)) == 47u << 26 /* stmw */
8897 || (insn
& (0x3f << 26)) == 48u << 26 /* lfs */
8898 || (insn
& (0x3f << 26)) == 50u << 26 /* lfd */
8899 || (insn
& (0x3f << 26)) == 52u << 26 /* stfs */
8900 || (insn
& (0x3f << 26)) == 54u << 26 /* stfd */
8901 || (insn
& (0x3f << 26)) == 56u << 26 /* lq,lfq */
8902 || ((insn
& (0x3f << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
8903 /* Exclude lfqu by testing reloc. If relocs are ever
8904 defined for the reduced D field in psq_lu then those
8905 will need testing too. */
8906 && r_type
!= R_PPC64_TOC16_LO
&& r_type
!= R_PPC64_GOT16_LO
)
8907 || ((insn
& (0x3f << 26)) == 58u << 26 /* ld,lwa */
8909 || (insn
& (0x3f << 26)) == 60u << 26 /* stfq */
8910 || ((insn
& (0x3f << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
8911 /* Exclude stfqu. psq_stu as above for psq_lu. */
8912 && r_type
!= R_PPC64_TOC16_LO
&& r_type
!= R_PPC64_GOT16_LO
)
8913 || ((insn
& (0x3f << 26)) == 62u << 26 /* std,stq */
8914 && (insn
& 1) == 0));
8917 /* Examine all relocs referencing .toc sections in order to remove
8918 unused .toc entries. */
8921 ppc64_elf_edit_toc (struct bfd_link_info
*info
)
8924 struct adjust_toc_info toc_inf
;
8925 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
8927 htab
->do_toc_opt
= 1;
8928 toc_inf
.global_toc_syms
= TRUE
;
8929 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
8931 asection
*toc
, *sec
;
8932 Elf_Internal_Shdr
*symtab_hdr
;
8933 Elf_Internal_Sym
*local_syms
;
8934 Elf_Internal_Rela
*relstart
, *rel
, *toc_relocs
;
8935 unsigned long *skip
, *drop
;
8936 unsigned char *used
;
8937 unsigned char *keep
, last
, some_unused
;
8939 if (!is_ppc64_elf (ibfd
))
8942 toc
= bfd_get_section_by_name (ibfd
, ".toc");
8945 || toc
->sec_info_type
== SEC_INFO_TYPE_JUST_SYMS
8946 || discarded_section (toc
))
8951 symtab_hdr
= &elf_symtab_hdr (ibfd
);
8953 /* Look at sections dropped from the final link. */
8956 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8958 if (sec
->reloc_count
== 0
8959 || !discarded_section (sec
)
8960 || get_opd_info (sec
)
8961 || (sec
->flags
& SEC_ALLOC
) == 0
8962 || (sec
->flags
& SEC_DEBUGGING
) != 0)
8965 relstart
= _bfd_elf_link_read_relocs (ibfd
, sec
, NULL
, NULL
, FALSE
);
8966 if (relstart
== NULL
)
8969 /* Run through the relocs to see which toc entries might be
8971 for (rel
= relstart
; rel
< relstart
+ sec
->reloc_count
; ++rel
)
8973 enum elf_ppc64_reloc_type r_type
;
8974 unsigned long r_symndx
;
8976 struct elf_link_hash_entry
*h
;
8977 Elf_Internal_Sym
*sym
;
8980 r_type
= ELF64_R_TYPE (rel
->r_info
);
8987 case R_PPC64_TOC16_LO
:
8988 case R_PPC64_TOC16_HI
:
8989 case R_PPC64_TOC16_HA
:
8990 case R_PPC64_TOC16_DS
:
8991 case R_PPC64_TOC16_LO_DS
:
8995 r_symndx
= ELF64_R_SYM (rel
->r_info
);
8996 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
9004 val
= h
->root
.u
.def
.value
;
9006 val
= sym
->st_value
;
9007 val
+= rel
->r_addend
;
9009 if (val
>= toc
->size
)
9012 /* Anything in the toc ought to be aligned to 8 bytes.
9013 If not, don't mark as unused. */
9019 skip
= bfd_zmalloc (sizeof (*skip
) * (toc
->size
+ 15) / 8);
9024 skip
[val
>> 3] = ref_from_discarded
;
9027 if (elf_section_data (sec
)->relocs
!= relstart
)
9031 /* For largetoc loads of address constants, we can convert
9032 . addis rx,2,addr@got@ha
9033 . ld ry,addr@got@l(rx)
9035 . addis rx,2,addr@toc@ha
9036 . addi ry,rx,addr@toc@l
9037 when addr is within 2G of the toc pointer. This then means
9038 that the word storing "addr" in the toc is no longer needed. */
9040 if (!ppc64_elf_tdata (ibfd
)->has_small_toc_reloc
9041 && toc
->output_section
->rawsize
< (bfd_vma
) 1 << 31
9042 && toc
->reloc_count
!= 0)
9044 /* Read toc relocs. */
9045 toc_relocs
= _bfd_elf_link_read_relocs (ibfd
, toc
, NULL
, NULL
,
9047 if (toc_relocs
== NULL
)
9050 for (rel
= toc_relocs
; rel
< toc_relocs
+ toc
->reloc_count
; ++rel
)
9052 enum elf_ppc64_reloc_type r_type
;
9053 unsigned long r_symndx
;
9055 struct elf_link_hash_entry
*h
;
9056 Elf_Internal_Sym
*sym
;
9059 r_type
= ELF64_R_TYPE (rel
->r_info
);
9060 if (r_type
!= R_PPC64_ADDR64
)
9063 r_symndx
= ELF64_R_SYM (rel
->r_info
);
9064 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
9069 || sym_sec
->output_section
== NULL
9070 || discarded_section (sym_sec
))
9073 if (!SYMBOL_REFERENCES_LOCAL (info
, h
))
9078 if (h
->type
== STT_GNU_IFUNC
)
9080 val
= h
->root
.u
.def
.value
;
9084 if (ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
)
9086 val
= sym
->st_value
;
9088 val
+= rel
->r_addend
;
9089 val
+= sym_sec
->output_section
->vma
+ sym_sec
->output_offset
;
9091 /* We don't yet know the exact toc pointer value, but we
9092 know it will be somewhere in the toc section. Don't
9093 optimize if the difference from any possible toc
9094 pointer is outside [ff..f80008000, 7fff7fff]. */
9095 addr
= toc
->output_section
->vma
+ TOC_BASE_OFF
;
9096 if (val
- addr
+ (bfd_vma
) 0x80008000 >= (bfd_vma
) 1 << 32)
9099 addr
= toc
->output_section
->vma
+ toc
->output_section
->rawsize
;
9100 if (val
- addr
+ (bfd_vma
) 0x80008000 >= (bfd_vma
) 1 << 32)
9105 skip
= bfd_zmalloc (sizeof (*skip
) * (toc
->size
+ 15) / 8);
9110 skip
[rel
->r_offset
>> 3]
9111 |= can_optimize
| ((rel
- toc_relocs
) << 2);
9118 used
= bfd_zmalloc (sizeof (*used
) * (toc
->size
+ 7) / 8);
9122 if (local_syms
!= NULL
9123 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
9127 && elf_section_data (sec
)->relocs
!= relstart
)
9129 if (toc_relocs
!= NULL
9130 && elf_section_data (toc
)->relocs
!= toc_relocs
)
9137 /* Now check all kept sections that might reference the toc.
9138 Check the toc itself last. */
9139 for (sec
= (ibfd
->sections
== toc
&& toc
->next
? toc
->next
9142 sec
= (sec
== toc
? NULL
9143 : sec
->next
== NULL
? toc
9144 : sec
->next
== toc
&& toc
->next
? toc
->next
9149 if (sec
->reloc_count
== 0
9150 || discarded_section (sec
)
9151 || get_opd_info (sec
)
9152 || (sec
->flags
& SEC_ALLOC
) == 0
9153 || (sec
->flags
& SEC_DEBUGGING
) != 0)
9156 relstart
= _bfd_elf_link_read_relocs (ibfd
, sec
, NULL
, NULL
,
9158 if (relstart
== NULL
)
9164 /* Mark toc entries referenced as used. */
9168 for (rel
= relstart
; rel
< relstart
+ sec
->reloc_count
; ++rel
)
9170 enum elf_ppc64_reloc_type r_type
;
9171 unsigned long r_symndx
;
9173 struct elf_link_hash_entry
*h
;
9174 Elf_Internal_Sym
*sym
;
9176 enum {no_check
, check_lo
, check_ha
} insn_check
;
9178 r_type
= ELF64_R_TYPE (rel
->r_info
);
9182 insn_check
= no_check
;
9185 case R_PPC64_GOT_TLSLD16_HA
:
9186 case R_PPC64_GOT_TLSGD16_HA
:
9187 case R_PPC64_GOT_TPREL16_HA
:
9188 case R_PPC64_GOT_DTPREL16_HA
:
9189 case R_PPC64_GOT16_HA
:
9190 case R_PPC64_TOC16_HA
:
9191 insn_check
= check_ha
;
9194 case R_PPC64_GOT_TLSLD16_LO
:
9195 case R_PPC64_GOT_TLSGD16_LO
:
9196 case R_PPC64_GOT_TPREL16_LO_DS
:
9197 case R_PPC64_GOT_DTPREL16_LO_DS
:
9198 case R_PPC64_GOT16_LO
:
9199 case R_PPC64_GOT16_LO_DS
:
9200 case R_PPC64_TOC16_LO
:
9201 case R_PPC64_TOC16_LO_DS
:
9202 insn_check
= check_lo
;
9206 if (insn_check
!= no_check
)
9208 bfd_vma off
= rel
->r_offset
& ~3;
9209 unsigned char buf
[4];
9212 if (!bfd_get_section_contents (ibfd
, sec
, buf
, off
, 4))
9217 insn
= bfd_get_32 (ibfd
, buf
);
9218 if (insn_check
== check_lo
9219 ? !ok_lo_toc_insn (insn
, r_type
)
9220 : ((insn
& ((0x3f << 26) | 0x1f << 16))
9221 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9225 ppc64_elf_tdata (ibfd
)->unexpected_toc_insn
= 1;
9226 sprintf (str
, "%#08x", insn
);
9227 info
->callbacks
->einfo
9228 /* xgettext:c-format */
9229 (_("%P: %H: toc optimization is not supported for"
9230 " %s instruction.\n"),
9231 ibfd
, sec
, rel
->r_offset
& ~3, str
);
9238 case R_PPC64_TOC16_LO
:
9239 case R_PPC64_TOC16_HI
:
9240 case R_PPC64_TOC16_HA
:
9241 case R_PPC64_TOC16_DS
:
9242 case R_PPC64_TOC16_LO_DS
:
9243 /* In case we're taking addresses of toc entries. */
9244 case R_PPC64_ADDR64
:
9251 r_symndx
= ELF64_R_SYM (rel
->r_info
);
9252 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
9263 val
= h
->root
.u
.def
.value
;
9265 val
= sym
->st_value
;
9266 val
+= rel
->r_addend
;
9268 if (val
>= toc
->size
)
9271 if ((skip
[val
>> 3] & can_optimize
) != 0)
9278 case R_PPC64_TOC16_HA
:
9281 case R_PPC64_TOC16_LO_DS
:
9282 off
= rel
->r_offset
;
9283 off
+= (bfd_big_endian (ibfd
) ? -2 : 3);
9284 if (!bfd_get_section_contents (ibfd
, sec
, &opc
,
9290 if ((opc
& (0x3f << 2)) == (58u << 2))
9295 /* Wrong sort of reloc, or not a ld. We may
9296 as well clear ref_from_discarded too. */
9303 /* For the toc section, we only mark as used if this
9304 entry itself isn't unused. */
9305 else if ((used
[rel
->r_offset
>> 3]
9306 || !(skip
[rel
->r_offset
>> 3] & ref_from_discarded
))
9309 /* Do all the relocs again, to catch reference
9318 if (elf_section_data (sec
)->relocs
!= relstart
)
9322 /* Merge the used and skip arrays. Assume that TOC
9323 doublewords not appearing as either used or unused belong
9324 to to an entry more than one doubleword in size. */
9325 for (drop
= skip
, keep
= used
, last
= 0, some_unused
= 0;
9326 drop
< skip
+ (toc
->size
+ 7) / 8;
9331 *drop
&= ~ref_from_discarded
;
9332 if ((*drop
& can_optimize
) != 0)
9336 else if ((*drop
& ref_from_discarded
) != 0)
9339 last
= ref_from_discarded
;
9349 bfd_byte
*contents
, *src
;
9351 Elf_Internal_Sym
*sym
;
9352 bfd_boolean local_toc_syms
= FALSE
;
9354 /* Shuffle the toc contents, and at the same time convert the
9355 skip array from booleans into offsets. */
9356 if (!bfd_malloc_and_get_section (ibfd
, toc
, &contents
))
9359 elf_section_data (toc
)->this_hdr
.contents
= contents
;
9361 for (src
= contents
, off
= 0, drop
= skip
;
9362 src
< contents
+ toc
->size
;
9365 if ((*drop
& (can_optimize
| ref_from_discarded
)) != 0)
9370 memcpy (src
- off
, src
, 8);
9374 toc
->rawsize
= toc
->size
;
9375 toc
->size
= src
- contents
- off
;
9377 /* Adjust addends for relocs against the toc section sym,
9378 and optimize any accesses we can. */
9379 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
9381 if (sec
->reloc_count
== 0
9382 || discarded_section (sec
))
9385 relstart
= _bfd_elf_link_read_relocs (ibfd
, sec
, NULL
, NULL
,
9387 if (relstart
== NULL
)
9390 for (rel
= relstart
; rel
< relstart
+ sec
->reloc_count
; ++rel
)
9392 enum elf_ppc64_reloc_type r_type
;
9393 unsigned long r_symndx
;
9395 struct elf_link_hash_entry
*h
;
9398 r_type
= ELF64_R_TYPE (rel
->r_info
);
9405 case R_PPC64_TOC16_LO
:
9406 case R_PPC64_TOC16_HI
:
9407 case R_PPC64_TOC16_HA
:
9408 case R_PPC64_TOC16_DS
:
9409 case R_PPC64_TOC16_LO_DS
:
9410 case R_PPC64_ADDR64
:
9414 r_symndx
= ELF64_R_SYM (rel
->r_info
);
9415 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
9423 val
= h
->root
.u
.def
.value
;
9426 val
= sym
->st_value
;
9428 local_toc_syms
= TRUE
;
9431 val
+= rel
->r_addend
;
9433 if (val
> toc
->rawsize
)
9435 else if ((skip
[val
>> 3] & ref_from_discarded
) != 0)
9437 else if ((skip
[val
>> 3] & can_optimize
) != 0)
9439 Elf_Internal_Rela
*tocrel
9440 = toc_relocs
+ (skip
[val
>> 3] >> 2);
9441 unsigned long tsym
= ELF64_R_SYM (tocrel
->r_info
);
9445 case R_PPC64_TOC16_HA
:
9446 rel
->r_info
= ELF64_R_INFO (tsym
, R_PPC64_TOC16_HA
);
9449 case R_PPC64_TOC16_LO_DS
:
9450 rel
->r_info
= ELF64_R_INFO (tsym
, R_PPC64_LO_DS_OPT
);
9454 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
9456 info
->callbacks
->einfo
9457 /* xgettext:c-format */
9458 (_("%P: %H: %s references "
9459 "optimized away TOC entry\n"),
9460 ibfd
, sec
, rel
->r_offset
,
9461 ppc64_elf_howto_table
[r_type
]->name
);
9462 bfd_set_error (bfd_error_bad_value
);
9465 rel
->r_addend
= tocrel
->r_addend
;
9466 elf_section_data (sec
)->relocs
= relstart
;
9470 if (h
!= NULL
|| sym
->st_value
!= 0)
9473 rel
->r_addend
-= skip
[val
>> 3];
9474 elf_section_data (sec
)->relocs
= relstart
;
9477 if (elf_section_data (sec
)->relocs
!= relstart
)
9481 /* We shouldn't have local or global symbols defined in the TOC,
9482 but handle them anyway. */
9483 if (local_syms
!= NULL
)
9484 for (sym
= local_syms
;
9485 sym
< local_syms
+ symtab_hdr
->sh_info
;
9487 if (sym
->st_value
!= 0
9488 && bfd_section_from_elf_index (ibfd
, sym
->st_shndx
) == toc
)
9492 if (sym
->st_value
> toc
->rawsize
)
9493 i
= toc
->rawsize
>> 3;
9495 i
= sym
->st_value
>> 3;
9497 if ((skip
[i
] & (ref_from_discarded
| can_optimize
)) != 0)
9501 (_("%s defined on removed toc entry"),
9502 bfd_elf_sym_name (ibfd
, symtab_hdr
, sym
, NULL
));
9505 while ((skip
[i
] & (ref_from_discarded
| can_optimize
)));
9506 sym
->st_value
= (bfd_vma
) i
<< 3;
9509 sym
->st_value
-= skip
[i
];
9510 symtab_hdr
->contents
= (unsigned char *) local_syms
;
9513 /* Adjust any global syms defined in this toc input section. */
9514 if (toc_inf
.global_toc_syms
)
9517 toc_inf
.skip
= skip
;
9518 toc_inf
.global_toc_syms
= FALSE
;
9519 elf_link_hash_traverse (elf_hash_table (info
), adjust_toc_syms
,
9523 if (toc
->reloc_count
!= 0)
9525 Elf_Internal_Shdr
*rel_hdr
;
9526 Elf_Internal_Rela
*wrel
;
9529 /* Remove unused toc relocs, and adjust those we keep. */
9530 if (toc_relocs
== NULL
)
9531 toc_relocs
= _bfd_elf_link_read_relocs (ibfd
, toc
, NULL
, NULL
,
9533 if (toc_relocs
== NULL
)
9537 for (rel
= toc_relocs
; rel
< toc_relocs
+ toc
->reloc_count
; ++rel
)
9538 if ((skip
[rel
->r_offset
>> 3]
9539 & (ref_from_discarded
| can_optimize
)) == 0)
9541 wrel
->r_offset
= rel
->r_offset
- skip
[rel
->r_offset
>> 3];
9542 wrel
->r_info
= rel
->r_info
;
9543 wrel
->r_addend
= rel
->r_addend
;
9546 else if (!dec_dynrel_count (rel
->r_info
, toc
, info
,
9547 &local_syms
, NULL
, NULL
))
9550 elf_section_data (toc
)->relocs
= toc_relocs
;
9551 toc
->reloc_count
= wrel
- toc_relocs
;
9552 rel_hdr
= _bfd_elf_single_rel_hdr (toc
);
9553 sz
= rel_hdr
->sh_entsize
;
9554 rel_hdr
->sh_size
= toc
->reloc_count
* sz
;
9557 else if (toc_relocs
!= NULL
9558 && elf_section_data (toc
)->relocs
!= toc_relocs
)
9561 if (local_syms
!= NULL
9562 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
9564 if (!info
->keep_memory
)
9567 symtab_hdr
->contents
= (unsigned char *) local_syms
;
9575 /* Return true iff input section I references the TOC using
9576 instructions limited to +/-32k offsets. */
9579 ppc64_elf_has_small_toc_reloc (asection
*i
)
9581 return (is_ppc64_elf (i
->owner
)
9582 && ppc64_elf_tdata (i
->owner
)->has_small_toc_reloc
);
9585 /* Allocate space for one GOT entry. */
9588 allocate_got (struct elf_link_hash_entry
*h
,
9589 struct bfd_link_info
*info
,
9590 struct got_entry
*gent
)
9592 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
9594 struct ppc_link_hash_entry
*eh
= (struct ppc_link_hash_entry
*) h
;
9595 int entsize
= (gent
->tls_type
& eh
->tls_mask
& (TLS_GD
| TLS_LD
)
9597 int rentsize
= (gent
->tls_type
& eh
->tls_mask
& TLS_GD
9598 ? 2 : 1) * sizeof (Elf64_External_Rela
);
9599 asection
*got
= ppc64_elf_tdata (gent
->owner
)->got
;
9601 gent
->got
.offset
= got
->size
;
9602 got
->size
+= entsize
;
9604 dyn
= htab
->elf
.dynamic_sections_created
;
9605 if (h
->type
== STT_GNU_IFUNC
)
9607 htab
->elf
.irelplt
->size
+= rentsize
;
9608 htab
->got_reli_size
+= rentsize
;
9610 else if ((bfd_link_pic (info
)
9611 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
))
9612 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
9613 || h
->root
.type
!= bfd_link_hash_undefweak
))
9615 asection
*relgot
= ppc64_elf_tdata (gent
->owner
)->relgot
;
9616 relgot
->size
+= rentsize
;
9620 /* This function merges got entries in the same toc group. */
9623 merge_got_entries (struct got_entry
**pent
)
9625 struct got_entry
*ent
, *ent2
;
9627 for (ent
= *pent
; ent
!= NULL
; ent
= ent
->next
)
9628 if (!ent
->is_indirect
)
9629 for (ent2
= ent
->next
; ent2
!= NULL
; ent2
= ent2
->next
)
9630 if (!ent2
->is_indirect
9631 && ent2
->addend
== ent
->addend
9632 && ent2
->tls_type
== ent
->tls_type
9633 && elf_gp (ent2
->owner
) == elf_gp (ent
->owner
))
9635 ent2
->is_indirect
= TRUE
;
9636 ent2
->got
.ent
= ent
;
9640 /* Allocate space in .plt, .got and associated reloc sections for
9644 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
9646 struct bfd_link_info
*info
;
9647 struct ppc_link_hash_table
*htab
;
9649 struct ppc_link_hash_entry
*eh
;
9650 struct got_entry
**pgent
, *gent
;
9652 if (h
->root
.type
== bfd_link_hash_indirect
)
9655 info
= (struct bfd_link_info
*) inf
;
9656 htab
= ppc_hash_table (info
);
9660 eh
= (struct ppc_link_hash_entry
*) h
;
9661 /* Run through the TLS GD got entries first if we're changing them
9663 if ((eh
->tls_mask
& TLS_TPRELGD
) != 0)
9664 for (gent
= h
->got
.glist
; gent
!= NULL
; gent
= gent
->next
)
9665 if (gent
->got
.refcount
> 0
9666 && (gent
->tls_type
& TLS_GD
) != 0)
9668 /* This was a GD entry that has been converted to TPREL. If
9669 there happens to be a TPREL entry we can use that one. */
9670 struct got_entry
*ent
;
9671 for (ent
= h
->got
.glist
; ent
!= NULL
; ent
= ent
->next
)
9672 if (ent
->got
.refcount
> 0
9673 && (ent
->tls_type
& TLS_TPREL
) != 0
9674 && ent
->addend
== gent
->addend
9675 && ent
->owner
== gent
->owner
)
9677 gent
->got
.refcount
= 0;
9681 /* If not, then we'll be using our own TPREL entry. */
9682 if (gent
->got
.refcount
!= 0)
9683 gent
->tls_type
= TLS_TLS
| TLS_TPREL
;
9686 /* Remove any list entry that won't generate a word in the GOT before
9687 we call merge_got_entries. Otherwise we risk merging to empty
9689 pgent
= &h
->got
.glist
;
9690 while ((gent
= *pgent
) != NULL
)
9691 if (gent
->got
.refcount
> 0)
9693 if ((gent
->tls_type
& TLS_LD
) != 0
9696 ppc64_tlsld_got (gent
->owner
)->got
.refcount
+= 1;
9697 *pgent
= gent
->next
;
9700 pgent
= &gent
->next
;
9703 *pgent
= gent
->next
;
9705 if (!htab
->do_multi_toc
)
9706 merge_got_entries (&h
->got
.glist
);
9708 for (gent
= h
->got
.glist
; gent
!= NULL
; gent
= gent
->next
)
9709 if (!gent
->is_indirect
)
9711 /* Make sure this symbol is output as a dynamic symbol.
9712 Undefined weak syms won't yet be marked as dynamic,
9713 nor will all TLS symbols. */
9714 if (h
->dynindx
== -1
9716 && h
->type
!= STT_GNU_IFUNC
9717 && htab
->elf
.dynamic_sections_created
)
9719 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
9723 if (!is_ppc64_elf (gent
->owner
))
9726 allocate_got (h
, info
, gent
);
9729 if (!htab
->elf
.dynamic_sections_created
9730 && h
->type
!= STT_GNU_IFUNC
)
9731 eh
->dyn_relocs
= NULL
;
9733 if (eh
->dyn_relocs
!= NULL
)
9735 struct elf_dyn_relocs
*p
, **pp
;
9737 /* In the shared -Bsymbolic case, discard space allocated for
9738 dynamic pc-relative relocs against symbols which turn out to
9739 be defined in regular objects. For the normal shared case,
9740 discard space for relocs that have become local due to symbol
9741 visibility changes. */
9743 if (bfd_link_pic (info
))
9745 /* Relocs that use pc_count are those that appear on a call
9746 insn, or certain REL relocs (see must_be_dyn_reloc) that
9747 can be generated via assembly. We want calls to
9748 protected symbols to resolve directly to the function
9749 rather than going via the plt. If people want function
9750 pointer comparisons to work as expected then they should
9751 avoid writing weird assembly. */
9752 if (SYMBOL_CALLS_LOCAL (info
, h
))
9754 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
9756 p
->count
-= p
->pc_count
;
9765 /* Also discard relocs on undefined weak syms with
9766 non-default visibility. */
9767 if (eh
->dyn_relocs
!= NULL
9768 && h
->root
.type
== bfd_link_hash_undefweak
)
9770 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
)
9771 eh
->dyn_relocs
= NULL
;
9773 /* Make sure this symbol is output as a dynamic symbol.
9774 Undefined weak syms won't yet be marked as dynamic. */
9775 else if (h
->dynindx
== -1
9776 && !h
->forced_local
)
9778 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
9783 else if (h
->type
== STT_GNU_IFUNC
)
9785 /* A plt entry is always created when making direct calls to
9786 an ifunc, even when building a static executable, but
9787 that doesn't cover all cases. We may have only an ifunc
9788 initialised function pointer for a given ifunc symbol.
9790 For ELFv2, dynamic relocations are not required when
9791 generating a global entry PLT stub. */
9792 if (abiversion (info
->output_bfd
) >= 2)
9794 if (global_entry_stub (h
))
9795 eh
->dyn_relocs
= NULL
;
9798 /* For ELFv1 we have function descriptors. Descriptors need
9799 to be treated like PLT entries and thus have dynamic
9800 relocations. One exception is when the function
9801 descriptor is copied into .dynbss (which should only
9802 happen with ancient versions of gcc). */
9803 else if (h
->needs_copy
)
9804 eh
->dyn_relocs
= NULL
;
9806 else if (ELIMINATE_COPY_RELOCS
)
9808 /* For the non-pic case, discard space for relocs against
9809 symbols which turn out to need copy relocs or are not
9812 /* First make sure this symbol is output as a dynamic symbol.
9813 Undefined weak syms won't yet be marked as dynamic. */
9814 if (h
->root
.type
== bfd_link_hash_undefweak
9819 && !bfd_elf_link_record_dynamic_symbol (info
, h
))
9824 || h
->dynindx
== -1)
9825 eh
->dyn_relocs
= NULL
;
9828 /* Finally, allocate space. */
9829 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
9831 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
9832 if (eh
->elf
.type
== STT_GNU_IFUNC
)
9833 sreloc
= htab
->elf
.irelplt
;
9834 sreloc
->size
+= p
->count
* sizeof (Elf64_External_Rela
);
9838 if ((htab
->elf
.dynamic_sections_created
9840 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info
), h
))
9841 || h
->type
== STT_GNU_IFUNC
)
9843 struct plt_entry
*pent
;
9844 bfd_boolean doneone
= FALSE
;
9845 for (pent
= h
->plt
.plist
; pent
!= NULL
; pent
= pent
->next
)
9846 if (pent
->plt
.refcount
> 0)
9848 if (!htab
->elf
.dynamic_sections_created
9849 || h
->dynindx
== -1)
9852 pent
->plt
.offset
= s
->size
;
9853 s
->size
+= PLT_ENTRY_SIZE (htab
);
9854 s
= htab
->elf
.irelplt
;
9858 /* If this is the first .plt entry, make room for the special
9862 s
->size
+= PLT_INITIAL_ENTRY_SIZE (htab
);
9864 pent
->plt
.offset
= s
->size
;
9866 /* Make room for this entry. */
9867 s
->size
+= PLT_ENTRY_SIZE (htab
);
9869 /* Make room for the .glink code. */
9872 s
->size
+= GLINK_CALL_STUB_SIZE
;
9875 /* We need bigger stubs past index 32767. */
9876 if (s
->size
>= GLINK_CALL_STUB_SIZE
+ 32768*2*4)
9883 /* We also need to make an entry in the .rela.plt section. */
9884 s
= htab
->elf
.srelplt
;
9886 s
->size
+= sizeof (Elf64_External_Rela
);
9890 pent
->plt
.offset
= (bfd_vma
) -1;
9893 h
->plt
.plist
= NULL
;
9899 h
->plt
.plist
= NULL
;
9906 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9907 to set up space for global entry stubs. These are put in glink,
9908 after the branch table. */
9911 size_global_entry_stubs (struct elf_link_hash_entry
*h
, void *inf
)
9913 struct bfd_link_info
*info
;
9914 struct ppc_link_hash_table
*htab
;
9915 struct plt_entry
*pent
;
9918 if (h
->root
.type
== bfd_link_hash_indirect
)
9921 if (!h
->pointer_equality_needed
)
9928 htab
= ppc_hash_table (info
);
9933 for (pent
= h
->plt
.plist
; pent
!= NULL
; pent
= pent
->next
)
9934 if (pent
->plt
.offset
!= (bfd_vma
) -1
9935 && pent
->addend
== 0)
9937 /* For ELFv2, if this symbol is not defined in a regular file
9938 and we are not generating a shared library or pie, then we
9939 need to define the symbol in the executable on a call stub.
9940 This is to avoid text relocations. */
9941 s
->size
= (s
->size
+ 15) & -16;
9942 h
->root
.type
= bfd_link_hash_defined
;
9943 h
->root
.u
.def
.section
= s
;
9944 h
->root
.u
.def
.value
= s
->size
;
9951 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
9952 read-only sections. */
9955 maybe_set_textrel (struct elf_link_hash_entry
*h
, void *info
)
9957 if (h
->root
.type
== bfd_link_hash_indirect
)
9960 if (readonly_dynrelocs (h
))
9962 ((struct bfd_link_info
*) info
)->flags
|= DF_TEXTREL
;
9964 /* Not an error, just cut short the traversal. */
9970 /* Set the sizes of the dynamic sections. */
9973 ppc64_elf_size_dynamic_sections (bfd
*output_bfd
,
9974 struct bfd_link_info
*info
)
9976 struct ppc_link_hash_table
*htab
;
9981 struct got_entry
*first_tlsld
;
9983 htab
= ppc_hash_table (info
);
9987 dynobj
= htab
->elf
.dynobj
;
9991 if (htab
->elf
.dynamic_sections_created
)
9993 /* Set the contents of the .interp section to the interpreter. */
9994 if (bfd_link_executable (info
) && !info
->nointerp
)
9996 s
= bfd_get_linker_section (dynobj
, ".interp");
9999 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
10000 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
10004 /* Set up .got offsets for local syms, and space for local dynamic
10006 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
10008 struct got_entry
**lgot_ents
;
10009 struct got_entry
**end_lgot_ents
;
10010 struct plt_entry
**local_plt
;
10011 struct plt_entry
**end_local_plt
;
10012 unsigned char *lgot_masks
;
10013 bfd_size_type locsymcount
;
10014 Elf_Internal_Shdr
*symtab_hdr
;
10016 if (!is_ppc64_elf (ibfd
))
10019 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
10021 struct ppc_dyn_relocs
*p
;
10023 for (p
= elf_section_data (s
)->local_dynrel
; p
!= NULL
; p
= p
->next
)
10025 if (!bfd_is_abs_section (p
->sec
)
10026 && bfd_is_abs_section (p
->sec
->output_section
))
10028 /* Input section has been discarded, either because
10029 it is a copy of a linkonce section or due to
10030 linker script /DISCARD/, so we'll be discarding
10033 else if (p
->count
!= 0)
10035 asection
*srel
= elf_section_data (p
->sec
)->sreloc
;
10037 srel
= htab
->elf
.irelplt
;
10038 srel
->size
+= p
->count
* sizeof (Elf64_External_Rela
);
10039 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
10040 info
->flags
|= DF_TEXTREL
;
10045 lgot_ents
= elf_local_got_ents (ibfd
);
10049 symtab_hdr
= &elf_symtab_hdr (ibfd
);
10050 locsymcount
= symtab_hdr
->sh_info
;
10051 end_lgot_ents
= lgot_ents
+ locsymcount
;
10052 local_plt
= (struct plt_entry
**) end_lgot_ents
;
10053 end_local_plt
= local_plt
+ locsymcount
;
10054 lgot_masks
= (unsigned char *) end_local_plt
;
10055 s
= ppc64_elf_tdata (ibfd
)->got
;
10056 for (; lgot_ents
< end_lgot_ents
; ++lgot_ents
, ++lgot_masks
)
10058 struct got_entry
**pent
, *ent
;
10061 while ((ent
= *pent
) != NULL
)
10062 if (ent
->got
.refcount
> 0)
10064 if ((ent
->tls_type
& *lgot_masks
& TLS_LD
) != 0)
10066 ppc64_tlsld_got (ibfd
)->got
.refcount
+= 1;
10071 unsigned int ent_size
= 8;
10072 unsigned int rel_size
= sizeof (Elf64_External_Rela
);
10074 ent
->got
.offset
= s
->size
;
10075 if ((ent
->tls_type
& *lgot_masks
& TLS_GD
) != 0)
10080 s
->size
+= ent_size
;
10081 if ((*lgot_masks
& PLT_IFUNC
) != 0)
10083 htab
->elf
.irelplt
->size
+= rel_size
;
10084 htab
->got_reli_size
+= rel_size
;
10086 else if (bfd_link_pic (info
))
10088 asection
*srel
= ppc64_elf_tdata (ibfd
)->relgot
;
10089 srel
->size
+= rel_size
;
10098 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
10099 for (; local_plt
< end_local_plt
; ++local_plt
)
10101 struct plt_entry
*ent
;
10103 for (ent
= *local_plt
; ent
!= NULL
; ent
= ent
->next
)
10104 if (ent
->plt
.refcount
> 0)
10106 s
= htab
->elf
.iplt
;
10107 ent
->plt
.offset
= s
->size
;
10108 s
->size
+= PLT_ENTRY_SIZE (htab
);
10110 htab
->elf
.irelplt
->size
+= sizeof (Elf64_External_Rela
);
10113 ent
->plt
.offset
= (bfd_vma
) -1;
10117 /* Allocate global sym .plt and .got entries, and space for global
10118 sym dynamic relocs. */
10119 elf_link_hash_traverse (&htab
->elf
, allocate_dynrelocs
, info
);
10120 /* Stash the end of glink branch table. */
10121 if (htab
->glink
!= NULL
)
10122 htab
->glink
->rawsize
= htab
->glink
->size
;
10124 if (!htab
->opd_abi
&& !bfd_link_pic (info
))
10125 elf_link_hash_traverse (&htab
->elf
, size_global_entry_stubs
, info
);
10127 first_tlsld
= NULL
;
10128 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
10130 struct got_entry
*ent
;
10132 if (!is_ppc64_elf (ibfd
))
10135 ent
= ppc64_tlsld_got (ibfd
);
10136 if (ent
->got
.refcount
> 0)
10138 if (!htab
->do_multi_toc
&& first_tlsld
!= NULL
)
10140 ent
->is_indirect
= TRUE
;
10141 ent
->got
.ent
= first_tlsld
;
10145 if (first_tlsld
== NULL
)
10147 s
= ppc64_elf_tdata (ibfd
)->got
;
10148 ent
->got
.offset
= s
->size
;
10151 if (bfd_link_pic (info
))
10153 asection
*srel
= ppc64_elf_tdata (ibfd
)->relgot
;
10154 srel
->size
+= sizeof (Elf64_External_Rela
);
10159 ent
->got
.offset
= (bfd_vma
) -1;
10162 /* We now have determined the sizes of the various dynamic sections.
10163 Allocate memory for them. */
10165 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
10167 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
10170 if (s
== htab
->brlt
|| s
== htab
->relbrlt
)
10171 /* These haven't been allocated yet; don't strip. */
10173 else if (s
== htab
->elf
.sgot
10174 || s
== htab
->elf
.splt
10175 || s
== htab
->elf
.iplt
10176 || s
== htab
->glink
10177 || s
== htab
->elf
.sdynbss
)
10179 /* Strip this section if we don't need it; see the
10182 else if (s
== htab
->glink_eh_frame
)
10184 if (!bfd_is_abs_section (s
->output_section
))
10185 /* Not sized yet. */
10188 else if (CONST_STRNEQ (s
->name
, ".rela"))
10192 if (s
!= htab
->elf
.srelplt
)
10195 /* We use the reloc_count field as a counter if we need
10196 to copy relocs into the output file. */
10197 s
->reloc_count
= 0;
10202 /* It's not one of our sections, so don't allocate space. */
10208 /* If we don't need this section, strip it from the
10209 output file. This is mostly to handle .rela.bss and
10210 .rela.plt. We must create both sections in
10211 create_dynamic_sections, because they must be created
10212 before the linker maps input sections to output
10213 sections. The linker does that before
10214 adjust_dynamic_symbol is called, and it is that
10215 function which decides whether anything needs to go
10216 into these sections. */
10217 s
->flags
|= SEC_EXCLUDE
;
10221 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
10224 /* Allocate memory for the section contents. We use bfd_zalloc
10225 here in case unused entries are not reclaimed before the
10226 section's contents are written out. This should not happen,
10227 but this way if it does we get a R_PPC64_NONE reloc in .rela
10228 sections instead of garbage.
10229 We also rely on the section contents being zero when writing
10231 s
->contents
= bfd_zalloc (dynobj
, s
->size
);
10232 if (s
->contents
== NULL
)
10236 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
10238 if (!is_ppc64_elf (ibfd
))
10241 s
= ppc64_elf_tdata (ibfd
)->got
;
10242 if (s
!= NULL
&& s
!= htab
->elf
.sgot
)
10245 s
->flags
|= SEC_EXCLUDE
;
10248 s
->contents
= bfd_zalloc (ibfd
, s
->size
);
10249 if (s
->contents
== NULL
)
10253 s
= ppc64_elf_tdata (ibfd
)->relgot
;
10257 s
->flags
|= SEC_EXCLUDE
;
10260 s
->contents
= bfd_zalloc (ibfd
, s
->size
);
10261 if (s
->contents
== NULL
)
10264 s
->reloc_count
= 0;
10269 if (htab
->elf
.dynamic_sections_created
)
10271 bfd_boolean tls_opt
;
10273 /* Add some entries to the .dynamic section. We fill in the
10274 values later, in ppc64_elf_finish_dynamic_sections, but we
10275 must add the entries now so that we get the correct size for
10276 the .dynamic section. The DT_DEBUG entry is filled in by the
10277 dynamic linker and used by the debugger. */
10278 #define add_dynamic_entry(TAG, VAL) \
10279 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10281 if (bfd_link_executable (info
))
10283 if (!add_dynamic_entry (DT_DEBUG
, 0))
10287 if (htab
->elf
.splt
!= NULL
&& htab
->elf
.splt
->size
!= 0)
10289 if (!add_dynamic_entry (DT_PLTGOT
, 0)
10290 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
10291 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
10292 || !add_dynamic_entry (DT_JMPREL
, 0)
10293 || !add_dynamic_entry (DT_PPC64_GLINK
, 0))
10297 if (NO_OPD_RELOCS
&& abiversion (output_bfd
) <= 1)
10299 if (!add_dynamic_entry (DT_PPC64_OPD
, 0)
10300 || !add_dynamic_entry (DT_PPC64_OPDSZ
, 0))
10304 tls_opt
= (htab
->params
->tls_get_addr_opt
10305 && htab
->tls_get_addr_fd
!= NULL
10306 && htab
->tls_get_addr_fd
->elf
.plt
.plist
!= NULL
);
10307 if (tls_opt
|| !htab
->opd_abi
)
10309 if (!add_dynamic_entry (DT_PPC64_OPT
, tls_opt
? PPC64_OPT_TLS
: 0))
10315 if (!add_dynamic_entry (DT_RELA
, 0)
10316 || !add_dynamic_entry (DT_RELASZ
, 0)
10317 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf64_External_Rela
)))
10320 /* If any dynamic relocs apply to a read-only section,
10321 then we need a DT_TEXTREL entry. */
10322 if ((info
->flags
& DF_TEXTREL
) == 0)
10323 elf_link_hash_traverse (&htab
->elf
, maybe_set_textrel
, info
);
10325 if ((info
->flags
& DF_TEXTREL
) != 0)
10327 if (!add_dynamic_entry (DT_TEXTREL
, 0))
10332 #undef add_dynamic_entry
10337 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10340 ppc64_elf_hash_symbol (struct elf_link_hash_entry
*h
)
10342 if (h
->plt
.plist
!= NULL
10344 && !h
->pointer_equality_needed
)
10347 return _bfd_elf_hash_symbol (h
);
10350 /* Determine the type of stub needed, if any, for a call. */
10352 static inline enum ppc_stub_type
10353 ppc_type_of_stub (asection
*input_sec
,
10354 const Elf_Internal_Rela
*rel
,
10355 struct ppc_link_hash_entry
**hash
,
10356 struct plt_entry
**plt_ent
,
10357 bfd_vma destination
,
10358 unsigned long local_off
)
10360 struct ppc_link_hash_entry
*h
= *hash
;
10362 bfd_vma branch_offset
;
10363 bfd_vma max_branch_offset
;
10364 enum elf_ppc64_reloc_type r_type
;
10368 struct plt_entry
*ent
;
10369 struct ppc_link_hash_entry
*fdh
= h
;
10371 && h
->oh
->is_func_descriptor
)
10373 fdh
= ppc_follow_link (h
->oh
);
10377 for (ent
= fdh
->elf
.plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
10378 if (ent
->addend
== rel
->r_addend
10379 && ent
->plt
.offset
!= (bfd_vma
) -1)
10382 return ppc_stub_plt_call
;
10385 /* Here, we know we don't have a plt entry. If we don't have a
10386 either a defined function descriptor or a defined entry symbol
10387 in a regular object file, then it is pointless trying to make
10388 any other type of stub. */
10389 if (!is_static_defined (&fdh
->elf
)
10390 && !is_static_defined (&h
->elf
))
10391 return ppc_stub_none
;
10393 else if (elf_local_got_ents (input_sec
->owner
) != NULL
)
10395 Elf_Internal_Shdr
*symtab_hdr
= &elf_symtab_hdr (input_sec
->owner
);
10396 struct plt_entry
**local_plt
= (struct plt_entry
**)
10397 elf_local_got_ents (input_sec
->owner
) + symtab_hdr
->sh_info
;
10398 unsigned long r_symndx
= ELF64_R_SYM (rel
->r_info
);
10400 if (local_plt
[r_symndx
] != NULL
)
10402 struct plt_entry
*ent
;
10404 for (ent
= local_plt
[r_symndx
]; ent
!= NULL
; ent
= ent
->next
)
10405 if (ent
->addend
== rel
->r_addend
10406 && ent
->plt
.offset
!= (bfd_vma
) -1)
10409 return ppc_stub_plt_call
;
10414 /* Determine where the call point is. */
10415 location
= (input_sec
->output_offset
10416 + input_sec
->output_section
->vma
10419 branch_offset
= destination
- location
;
10420 r_type
= ELF64_R_TYPE (rel
->r_info
);
10422 /* Determine if a long branch stub is needed. */
10423 max_branch_offset
= 1 << 25;
10424 if (r_type
!= R_PPC64_REL24
)
10425 max_branch_offset
= 1 << 15;
10427 if (branch_offset
+ max_branch_offset
>= 2 * max_branch_offset
- local_off
)
10428 /* We need a stub. Figure out whether a long_branch or plt_branch
10429 is needed later. */
10430 return ppc_stub_long_branch
;
10432 return ppc_stub_none
;
10435 /* With power7 weakly ordered memory model, it is possible for ld.so
10436 to update a plt entry in one thread and have another thread see a
10437 stale zero toc entry. To avoid this we need some sort of acquire
10438 barrier in the call stub. One solution is to make the load of the
10439 toc word seem to appear to depend on the load of the function entry
10440 word. Another solution is to test for r2 being zero, and branch to
10441 the appropriate glink entry if so.
10443 . fake dep barrier compare
10444 . ld 12,xxx(2) ld 12,xxx(2)
10445 . mtctr 12 mtctr 12
10446 . xor 11,12,12 ld 2,xxx+8(2)
10447 . add 2,2,11 cmpldi 2,0
10448 . ld 2,xxx+8(2) bnectr+
10449 . bctr b <glink_entry>
10451 The solution involving the compare turns out to be faster, so
10452 that's what we use unless the branch won't reach. */
10454 #define ALWAYS_USE_FAKE_DEP 0
10455 #define ALWAYS_EMIT_R2SAVE 0
10457 #define PPC_LO(v) ((v) & 0xffff)
10458 #define PPC_HI(v) (((v) >> 16) & 0xffff)
10459 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
10461 static inline unsigned int
10462 plt_stub_size (struct ppc_link_hash_table
*htab
,
10463 struct ppc_stub_hash_entry
*stub_entry
,
10466 unsigned size
= 12;
10468 if (ALWAYS_EMIT_R2SAVE
10469 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
10471 if (PPC_HA (off
) != 0)
10476 if (htab
->params
->plt_static_chain
)
10478 if (htab
->params
->plt_thread_safe
10479 && htab
->elf
.dynamic_sections_created
10480 && stub_entry
->h
!= NULL
10481 && stub_entry
->h
->elf
.dynindx
!= -1)
10483 if (PPC_HA (off
+ 8 + 8 * htab
->params
->plt_static_chain
) != PPC_HA (off
))
10486 if (stub_entry
->h
!= NULL
10487 && (stub_entry
->h
== htab
->tls_get_addr_fd
10488 || stub_entry
->h
== htab
->tls_get_addr
)
10489 && htab
->params
->tls_get_addr_opt
)
10494 /* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
10495 then return the padding needed to do so. */
10496 static inline unsigned int
10497 plt_stub_pad (struct ppc_link_hash_table
*htab
,
10498 struct ppc_stub_hash_entry
*stub_entry
,
10501 int stub_align
= 1 << htab
->params
->plt_stub_align
;
10502 unsigned stub_size
= plt_stub_size (htab
, stub_entry
, plt_off
);
10503 bfd_vma stub_off
= stub_entry
->group
->stub_sec
->size
;
10505 if (((stub_off
+ stub_size
- 1) & -stub_align
) - (stub_off
& -stub_align
)
10506 > ((stub_size
- 1) & -stub_align
))
10507 return stub_align
- (stub_off
& (stub_align
- 1));
10511 /* Build a .plt call stub. */
10513 static inline bfd_byte
*
10514 build_plt_stub (struct ppc_link_hash_table
*htab
,
10515 struct ppc_stub_hash_entry
*stub_entry
,
10516 bfd_byte
*p
, bfd_vma offset
, Elf_Internal_Rela
*r
)
10518 bfd
*obfd
= htab
->params
->stub_bfd
;
10519 bfd_boolean plt_load_toc
= htab
->opd_abi
;
10520 bfd_boolean plt_static_chain
= htab
->params
->plt_static_chain
;
10521 bfd_boolean plt_thread_safe
= (htab
->params
->plt_thread_safe
10522 && htab
->elf
.dynamic_sections_created
10523 && stub_entry
->h
!= NULL
10524 && stub_entry
->h
->elf
.dynindx
!= -1);
10525 bfd_boolean use_fake_dep
= plt_thread_safe
;
10526 bfd_vma cmp_branch_off
= 0;
10528 if (!ALWAYS_USE_FAKE_DEP
10531 && !((stub_entry
->h
== htab
->tls_get_addr_fd
10532 || stub_entry
->h
== htab
->tls_get_addr
)
10533 && htab
->params
->tls_get_addr_opt
))
10535 bfd_vma pltoff
= stub_entry
->plt_ent
->plt
.offset
& ~1;
10536 bfd_vma pltindex
= ((pltoff
- PLT_INITIAL_ENTRY_SIZE (htab
))
10537 / PLT_ENTRY_SIZE (htab
));
10538 bfd_vma glinkoff
= GLINK_CALL_STUB_SIZE
+ pltindex
* 8;
10541 if (pltindex
> 32768)
10542 glinkoff
+= (pltindex
- 32768) * 4;
10544 + htab
->glink
->output_offset
10545 + htab
->glink
->output_section
->vma
);
10546 from
= (p
- stub_entry
->group
->stub_sec
->contents
10547 + 4 * (ALWAYS_EMIT_R2SAVE
10548 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
10549 + 4 * (PPC_HA (offset
) != 0)
10550 + 4 * (PPC_HA (offset
+ 8 + 8 * plt_static_chain
)
10551 != PPC_HA (offset
))
10552 + 4 * (plt_static_chain
!= 0)
10554 + stub_entry
->group
->stub_sec
->output_offset
10555 + stub_entry
->group
->stub_sec
->output_section
->vma
);
10556 cmp_branch_off
= to
- from
;
10557 use_fake_dep
= cmp_branch_off
+ (1 << 25) >= (1 << 26);
10560 if (PPC_HA (offset
) != 0)
10564 if (ALWAYS_EMIT_R2SAVE
10565 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
10566 r
[0].r_offset
+= 4;
10567 r
[0].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_HA
);
10568 r
[1].r_offset
= r
[0].r_offset
+ 4;
10569 r
[1].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS
);
10570 r
[1].r_addend
= r
[0].r_addend
;
10573 if (PPC_HA (offset
+ 8 + 8 * plt_static_chain
) != PPC_HA (offset
))
10575 r
[2].r_offset
= r
[1].r_offset
+ 4;
10576 r
[2].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_LO
);
10577 r
[2].r_addend
= r
[0].r_addend
;
10581 r
[2].r_offset
= r
[1].r_offset
+ 8 + 8 * use_fake_dep
;
10582 r
[2].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS
);
10583 r
[2].r_addend
= r
[0].r_addend
+ 8;
10584 if (plt_static_chain
)
10586 r
[3].r_offset
= r
[2].r_offset
+ 4;
10587 r
[3].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS
);
10588 r
[3].r_addend
= r
[0].r_addend
+ 16;
10593 if (ALWAYS_EMIT_R2SAVE
10594 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
10595 bfd_put_32 (obfd
, STD_R2_0R1
+ STK_TOC (htab
), p
), p
+= 4;
10598 bfd_put_32 (obfd
, ADDIS_R11_R2
| PPC_HA (offset
), p
), p
+= 4;
10599 bfd_put_32 (obfd
, LD_R12_0R11
| PPC_LO (offset
), p
), p
+= 4;
10603 bfd_put_32 (obfd
, ADDIS_R12_R2
| PPC_HA (offset
), p
), p
+= 4;
10604 bfd_put_32 (obfd
, LD_R12_0R12
| PPC_LO (offset
), p
), p
+= 4;
10607 && PPC_HA (offset
+ 8 + 8 * plt_static_chain
) != PPC_HA (offset
))
10609 bfd_put_32 (obfd
, ADDI_R11_R11
| PPC_LO (offset
), p
), p
+= 4;
10612 bfd_put_32 (obfd
, MTCTR_R12
, p
), p
+= 4;
10617 bfd_put_32 (obfd
, XOR_R2_R12_R12
, p
), p
+= 4;
10618 bfd_put_32 (obfd
, ADD_R11_R11_R2
, p
), p
+= 4;
10620 bfd_put_32 (obfd
, LD_R2_0R11
| PPC_LO (offset
+ 8), p
), p
+= 4;
10621 if (plt_static_chain
)
10622 bfd_put_32 (obfd
, LD_R11_0R11
| PPC_LO (offset
+ 16), p
), p
+= 4;
10629 if (ALWAYS_EMIT_R2SAVE
10630 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
10631 r
[0].r_offset
+= 4;
10632 r
[0].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_DS
);
10635 if (PPC_HA (offset
+ 8 + 8 * plt_static_chain
) != PPC_HA (offset
))
10637 r
[1].r_offset
= r
[0].r_offset
+ 4;
10638 r
[1].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16
);
10639 r
[1].r_addend
= r
[0].r_addend
;
10643 r
[1].r_offset
= r
[0].r_offset
+ 8 + 8 * use_fake_dep
;
10644 r
[1].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_DS
);
10645 r
[1].r_addend
= r
[0].r_addend
+ 8 + 8 * plt_static_chain
;
10646 if (plt_static_chain
)
10648 r
[2].r_offset
= r
[1].r_offset
+ 4;
10649 r
[2].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_DS
);
10650 r
[2].r_addend
= r
[0].r_addend
+ 8;
10655 if (ALWAYS_EMIT_R2SAVE
10656 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
10657 bfd_put_32 (obfd
, STD_R2_0R1
+ STK_TOC (htab
), p
), p
+= 4;
10658 bfd_put_32 (obfd
, LD_R12_0R2
| PPC_LO (offset
), p
), p
+= 4;
10660 && PPC_HA (offset
+ 8 + 8 * plt_static_chain
) != PPC_HA (offset
))
10662 bfd_put_32 (obfd
, ADDI_R2_R2
| PPC_LO (offset
), p
), p
+= 4;
10665 bfd_put_32 (obfd
, MTCTR_R12
, p
), p
+= 4;
10670 bfd_put_32 (obfd
, XOR_R11_R12_R12
, p
), p
+= 4;
10671 bfd_put_32 (obfd
, ADD_R2_R2_R11
, p
), p
+= 4;
10673 if (plt_static_chain
)
10674 bfd_put_32 (obfd
, LD_R11_0R2
| PPC_LO (offset
+ 16), p
), p
+= 4;
10675 bfd_put_32 (obfd
, LD_R2_0R2
| PPC_LO (offset
+ 8), p
), p
+= 4;
10678 if (plt_load_toc
&& plt_thread_safe
&& !use_fake_dep
)
10680 bfd_put_32 (obfd
, CMPLDI_R2_0
, p
), p
+= 4;
10681 bfd_put_32 (obfd
, BNECTR_P4
, p
), p
+= 4;
10682 bfd_put_32 (obfd
, B_DOT
| (cmp_branch_off
& 0x3fffffc), p
), p
+= 4;
10685 bfd_put_32 (obfd
, BCTR
, p
), p
+= 4;
10689 /* Build a special .plt call stub for __tls_get_addr. */
10691 #define LD_R11_0R3 0xe9630000
10692 #define LD_R12_0R3 0xe9830000
10693 #define MR_R0_R3 0x7c601b78
10694 #define CMPDI_R11_0 0x2c2b0000
10695 #define ADD_R3_R12_R13 0x7c6c6a14
10696 #define BEQLR 0x4d820020
10697 #define MR_R3_R0 0x7c030378
10698 #define STD_R11_0R1 0xf9610000
10699 #define BCTRL 0x4e800421
10700 #define LD_R11_0R1 0xe9610000
10701 #define MTLR_R11 0x7d6803a6
10703 static inline bfd_byte
*
10704 build_tls_get_addr_stub (struct ppc_link_hash_table
*htab
,
10705 struct ppc_stub_hash_entry
*stub_entry
,
10706 bfd_byte
*p
, bfd_vma offset
, Elf_Internal_Rela
*r
)
10708 bfd
*obfd
= htab
->params
->stub_bfd
;
10710 bfd_put_32 (obfd
, LD_R11_0R3
+ 0, p
), p
+= 4;
10711 bfd_put_32 (obfd
, LD_R12_0R3
+ 8, p
), p
+= 4;
10712 bfd_put_32 (obfd
, MR_R0_R3
, p
), p
+= 4;
10713 bfd_put_32 (obfd
, CMPDI_R11_0
, p
), p
+= 4;
10714 bfd_put_32 (obfd
, ADD_R3_R12_R13
, p
), p
+= 4;
10715 bfd_put_32 (obfd
, BEQLR
, p
), p
+= 4;
10716 bfd_put_32 (obfd
, MR_R3_R0
, p
), p
+= 4;
10717 bfd_put_32 (obfd
, MFLR_R11
, p
), p
+= 4;
10718 bfd_put_32 (obfd
, STD_R11_0R1
+ STK_LINKER (htab
), p
), p
+= 4;
10721 r
[0].r_offset
+= 9 * 4;
10722 p
= build_plt_stub (htab
, stub_entry
, p
, offset
, r
);
10723 bfd_put_32 (obfd
, BCTRL
, p
- 4);
10725 bfd_put_32 (obfd
, LD_R2_0R1
+ STK_TOC (htab
), p
), p
+= 4;
10726 bfd_put_32 (obfd
, LD_R11_0R1
+ STK_LINKER (htab
), p
), p
+= 4;
10727 bfd_put_32 (obfd
, MTLR_R11
, p
), p
+= 4;
10728 bfd_put_32 (obfd
, BLR
, p
), p
+= 4;
10733 static Elf_Internal_Rela
*
10734 get_relocs (asection
*sec
, int count
)
10736 Elf_Internal_Rela
*relocs
;
10737 struct bfd_elf_section_data
*elfsec_data
;
10739 elfsec_data
= elf_section_data (sec
);
10740 relocs
= elfsec_data
->relocs
;
10741 if (relocs
== NULL
)
10743 bfd_size_type relsize
;
10744 relsize
= sec
->reloc_count
* sizeof (*relocs
);
10745 relocs
= bfd_alloc (sec
->owner
, relsize
);
10746 if (relocs
== NULL
)
10748 elfsec_data
->relocs
= relocs
;
10749 elfsec_data
->rela
.hdr
= bfd_zalloc (sec
->owner
,
10750 sizeof (Elf_Internal_Shdr
));
10751 if (elfsec_data
->rela
.hdr
== NULL
)
10753 elfsec_data
->rela
.hdr
->sh_size
= (sec
->reloc_count
10754 * sizeof (Elf64_External_Rela
));
10755 elfsec_data
->rela
.hdr
->sh_entsize
= sizeof (Elf64_External_Rela
);
10756 sec
->reloc_count
= 0;
10758 relocs
+= sec
->reloc_count
;
10759 sec
->reloc_count
+= count
;
10764 get_r2off (struct bfd_link_info
*info
,
10765 struct ppc_stub_hash_entry
*stub_entry
)
10767 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
10768 bfd_vma r2off
= htab
->sec_info
[stub_entry
->target_section
->id
].toc_off
;
10772 /* Support linking -R objects. Get the toc pointer from the
10775 if (!htab
->opd_abi
)
10777 asection
*opd
= stub_entry
->h
->elf
.root
.u
.def
.section
;
10778 bfd_vma opd_off
= stub_entry
->h
->elf
.root
.u
.def
.value
;
10780 if (strcmp (opd
->name
, ".opd") != 0
10781 || opd
->reloc_count
!= 0)
10783 info
->callbacks
->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10784 stub_entry
->h
->elf
.root
.root
.string
);
10785 bfd_set_error (bfd_error_bad_value
);
10786 return (bfd_vma
) -1;
10788 if (!bfd_get_section_contents (opd
->owner
, opd
, buf
, opd_off
+ 8, 8))
10789 return (bfd_vma
) -1;
10790 r2off
= bfd_get_64 (opd
->owner
, buf
);
10791 r2off
-= elf_gp (info
->output_bfd
);
10793 r2off
-= htab
->sec_info
[stub_entry
->group
->link_sec
->id
].toc_off
;
10798 ppc_build_one_stub (struct bfd_hash_entry
*gen_entry
, void *in_arg
)
10800 struct ppc_stub_hash_entry
*stub_entry
;
10801 struct ppc_branch_hash_entry
*br_entry
;
10802 struct bfd_link_info
*info
;
10803 struct ppc_link_hash_table
*htab
;
10808 Elf_Internal_Rela
*r
;
10811 /* Massage our args to the form they really have. */
10812 stub_entry
= (struct ppc_stub_hash_entry
*) gen_entry
;
10815 htab
= ppc_hash_table (info
);
10819 /* Make a note of the offset within the stubs for this entry. */
10820 stub_entry
->stub_offset
= stub_entry
->group
->stub_sec
->size
;
10821 loc
= stub_entry
->group
->stub_sec
->contents
+ stub_entry
->stub_offset
;
10823 htab
->stub_count
[stub_entry
->stub_type
- 1] += 1;
10824 switch (stub_entry
->stub_type
)
10826 case ppc_stub_long_branch
:
10827 case ppc_stub_long_branch_r2off
:
10828 /* Branches are relative. This is where we are going to. */
10829 dest
= (stub_entry
->target_value
10830 + stub_entry
->target_section
->output_offset
10831 + stub_entry
->target_section
->output_section
->vma
);
10832 dest
+= PPC64_LOCAL_ENTRY_OFFSET (stub_entry
->other
);
10835 /* And this is where we are coming from. */
10836 off
-= (stub_entry
->stub_offset
10837 + stub_entry
->group
->stub_sec
->output_offset
10838 + stub_entry
->group
->stub_sec
->output_section
->vma
);
10841 if (stub_entry
->stub_type
== ppc_stub_long_branch_r2off
)
10843 bfd_vma r2off
= get_r2off (info
, stub_entry
);
10845 if (r2off
== (bfd_vma
) -1)
10847 htab
->stub_error
= TRUE
;
10850 bfd_put_32 (htab
->params
->stub_bfd
, STD_R2_0R1
+ STK_TOC (htab
), loc
);
10853 if (PPC_HA (r2off
) != 0)
10855 bfd_put_32 (htab
->params
->stub_bfd
,
10856 ADDIS_R2_R2
| PPC_HA (r2off
), loc
);
10860 if (PPC_LO (r2off
) != 0)
10862 bfd_put_32 (htab
->params
->stub_bfd
,
10863 ADDI_R2_R2
| PPC_LO (r2off
), loc
);
10869 bfd_put_32 (htab
->params
->stub_bfd
, B_DOT
| (off
& 0x3fffffc), loc
);
10871 if (off
+ (1 << 25) >= (bfd_vma
) (1 << 26))
10873 info
->callbacks
->einfo
10874 (_("%P: long branch stub `%s' offset overflow\n"),
10875 stub_entry
->root
.string
);
10876 htab
->stub_error
= TRUE
;
10880 if (info
->emitrelocations
)
10882 r
= get_relocs (stub_entry
->group
->stub_sec
, 1);
10885 r
->r_offset
= loc
- stub_entry
->group
->stub_sec
->contents
;
10886 r
->r_info
= ELF64_R_INFO (0, R_PPC64_REL24
);
10887 r
->r_addend
= dest
;
10888 if (stub_entry
->h
!= NULL
)
10890 struct elf_link_hash_entry
**hashes
;
10891 unsigned long symndx
;
10892 struct ppc_link_hash_entry
*h
;
10894 hashes
= elf_sym_hashes (htab
->params
->stub_bfd
);
10895 if (hashes
== NULL
)
10897 bfd_size_type hsize
;
10899 hsize
= (htab
->stub_globals
+ 1) * sizeof (*hashes
);
10900 hashes
= bfd_zalloc (htab
->params
->stub_bfd
, hsize
);
10901 if (hashes
== NULL
)
10903 elf_sym_hashes (htab
->params
->stub_bfd
) = hashes
;
10904 htab
->stub_globals
= 1;
10906 symndx
= htab
->stub_globals
++;
10908 hashes
[symndx
] = &h
->elf
;
10909 r
->r_info
= ELF64_R_INFO (symndx
, R_PPC64_REL24
);
10910 if (h
->oh
!= NULL
&& h
->oh
->is_func
)
10911 h
= ppc_follow_link (h
->oh
);
10912 if (h
->elf
.root
.u
.def
.section
!= stub_entry
->target_section
)
10913 /* H is an opd symbol. The addend must be zero. */
10917 off
= (h
->elf
.root
.u
.def
.value
10918 + h
->elf
.root
.u
.def
.section
->output_offset
10919 + h
->elf
.root
.u
.def
.section
->output_section
->vma
);
10920 r
->r_addend
-= off
;
10926 case ppc_stub_plt_branch
:
10927 case ppc_stub_plt_branch_r2off
:
10928 br_entry
= ppc_branch_hash_lookup (&htab
->branch_hash_table
,
10929 stub_entry
->root
.string
+ 9,
10931 if (br_entry
== NULL
)
10933 info
->callbacks
->einfo (_("%P: can't find branch stub `%s'\n"),
10934 stub_entry
->root
.string
);
10935 htab
->stub_error
= TRUE
;
10939 dest
= (stub_entry
->target_value
10940 + stub_entry
->target_section
->output_offset
10941 + stub_entry
->target_section
->output_section
->vma
);
10942 if (stub_entry
->stub_type
!= ppc_stub_plt_branch_r2off
)
10943 dest
+= PPC64_LOCAL_ENTRY_OFFSET (stub_entry
->other
);
10945 bfd_put_64 (htab
->brlt
->owner
, dest
,
10946 htab
->brlt
->contents
+ br_entry
->offset
);
10948 if (br_entry
->iter
== htab
->stub_iteration
)
10950 br_entry
->iter
= 0;
10952 if (htab
->relbrlt
!= NULL
)
10954 /* Create a reloc for the branch lookup table entry. */
10955 Elf_Internal_Rela rela
;
10958 rela
.r_offset
= (br_entry
->offset
10959 + htab
->brlt
->output_offset
10960 + htab
->brlt
->output_section
->vma
);
10961 rela
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
10962 rela
.r_addend
= dest
;
10964 rl
= htab
->relbrlt
->contents
;
10965 rl
+= (htab
->relbrlt
->reloc_count
++
10966 * sizeof (Elf64_External_Rela
));
10967 bfd_elf64_swap_reloca_out (htab
->relbrlt
->owner
, &rela
, rl
);
10969 else if (info
->emitrelocations
)
10971 r
= get_relocs (htab
->brlt
, 1);
10974 /* brlt, being SEC_LINKER_CREATED does not go through the
10975 normal reloc processing. Symbols and offsets are not
10976 translated from input file to output file form, so
10977 set up the offset per the output file. */
10978 r
->r_offset
= (br_entry
->offset
10979 + htab
->brlt
->output_offset
10980 + htab
->brlt
->output_section
->vma
);
10981 r
->r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
10982 r
->r_addend
= dest
;
10986 dest
= (br_entry
->offset
10987 + htab
->brlt
->output_offset
10988 + htab
->brlt
->output_section
->vma
);
10991 - elf_gp (htab
->brlt
->output_section
->owner
)
10992 - htab
->sec_info
[stub_entry
->group
->link_sec
->id
].toc_off
);
10994 if (off
+ 0x80008000 > 0xffffffff || (off
& 7) != 0)
10996 info
->callbacks
->einfo
10997 (_("%P: linkage table error against `%T'\n"),
10998 stub_entry
->root
.string
);
10999 bfd_set_error (bfd_error_bad_value
);
11000 htab
->stub_error
= TRUE
;
11004 if (info
->emitrelocations
)
11006 r
= get_relocs (stub_entry
->group
->stub_sec
, 1 + (PPC_HA (off
) != 0));
11009 r
[0].r_offset
= loc
- stub_entry
->group
->stub_sec
->contents
;
11010 if (bfd_big_endian (info
->output_bfd
))
11011 r
[0].r_offset
+= 2;
11012 if (stub_entry
->stub_type
== ppc_stub_plt_branch_r2off
)
11013 r
[0].r_offset
+= 4;
11014 r
[0].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_DS
);
11015 r
[0].r_addend
= dest
;
11016 if (PPC_HA (off
) != 0)
11018 r
[0].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_HA
);
11019 r
[1].r_offset
= r
[0].r_offset
+ 4;
11020 r
[1].r_info
= ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS
);
11021 r
[1].r_addend
= r
[0].r_addend
;
11025 if (stub_entry
->stub_type
!= ppc_stub_plt_branch_r2off
)
11027 if (PPC_HA (off
) != 0)
11030 bfd_put_32 (htab
->params
->stub_bfd
,
11031 ADDIS_R12_R2
| PPC_HA (off
), loc
);
11033 bfd_put_32 (htab
->params
->stub_bfd
,
11034 LD_R12_0R12
| PPC_LO (off
), loc
);
11039 bfd_put_32 (htab
->params
->stub_bfd
,
11040 LD_R12_0R2
| PPC_LO (off
), loc
);
11045 bfd_vma r2off
= get_r2off (info
, stub_entry
);
11047 if (r2off
== (bfd_vma
) -1)
11049 htab
->stub_error
= TRUE
;
11053 bfd_put_32 (htab
->params
->stub_bfd
, STD_R2_0R1
+ STK_TOC (htab
), loc
);
11056 if (PPC_HA (off
) != 0)
11059 bfd_put_32 (htab
->params
->stub_bfd
,
11060 ADDIS_R12_R2
| PPC_HA (off
), loc
);
11062 bfd_put_32 (htab
->params
->stub_bfd
,
11063 LD_R12_0R12
| PPC_LO (off
), loc
);
11066 bfd_put_32 (htab
->params
->stub_bfd
, LD_R12_0R2
| PPC_LO (off
), loc
);
11068 if (PPC_HA (r2off
) != 0)
11072 bfd_put_32 (htab
->params
->stub_bfd
,
11073 ADDIS_R2_R2
| PPC_HA (r2off
), loc
);
11075 if (PPC_LO (r2off
) != 0)
11079 bfd_put_32 (htab
->params
->stub_bfd
,
11080 ADDI_R2_R2
| PPC_LO (r2off
), loc
);
11084 bfd_put_32 (htab
->params
->stub_bfd
, MTCTR_R12
, loc
);
11086 bfd_put_32 (htab
->params
->stub_bfd
, BCTR
, loc
);
11089 case ppc_stub_plt_call
:
11090 case ppc_stub_plt_call_r2save
:
11091 if (stub_entry
->h
!= NULL
11092 && stub_entry
->h
->is_func_descriptor
11093 && stub_entry
->h
->oh
!= NULL
)
11095 struct ppc_link_hash_entry
*fh
= ppc_follow_link (stub_entry
->h
->oh
);
11097 /* If the old-ABI "dot-symbol" is undefined make it weak so
11098 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
11099 if (fh
->elf
.root
.type
== bfd_link_hash_undefined
11100 && (stub_entry
->h
->elf
.root
.type
== bfd_link_hash_defined
11101 || stub_entry
->h
->elf
.root
.type
== bfd_link_hash_defweak
))
11102 fh
->elf
.root
.type
= bfd_link_hash_undefweak
;
11105 /* Now build the stub. */
11106 dest
= stub_entry
->plt_ent
->plt
.offset
& ~1;
11107 if (dest
>= (bfd_vma
) -2)
11110 plt
= htab
->elf
.splt
;
11111 if (!htab
->elf
.dynamic_sections_created
11112 || stub_entry
->h
== NULL
11113 || stub_entry
->h
->elf
.dynindx
== -1)
11114 plt
= htab
->elf
.iplt
;
11116 dest
+= plt
->output_offset
+ plt
->output_section
->vma
;
11118 if (stub_entry
->h
== NULL
11119 && (stub_entry
->plt_ent
->plt
.offset
& 1) == 0)
11121 Elf_Internal_Rela rela
;
11124 rela
.r_offset
= dest
;
11126 rela
.r_info
= ELF64_R_INFO (0, R_PPC64_JMP_IREL
);
11128 rela
.r_info
= ELF64_R_INFO (0, R_PPC64_IRELATIVE
);
11129 rela
.r_addend
= (stub_entry
->target_value
11130 + stub_entry
->target_section
->output_offset
11131 + stub_entry
->target_section
->output_section
->vma
);
11133 rl
= (htab
->elf
.irelplt
->contents
11134 + (htab
->elf
.irelplt
->reloc_count
++
11135 * sizeof (Elf64_External_Rela
)));
11136 bfd_elf64_swap_reloca_out (info
->output_bfd
, &rela
, rl
);
11137 stub_entry
->plt_ent
->plt
.offset
|= 1;
11141 - elf_gp (plt
->output_section
->owner
)
11142 - htab
->sec_info
[stub_entry
->group
->link_sec
->id
].toc_off
);
11144 if (off
+ 0x80008000 > 0xffffffff || (off
& 7) != 0)
11146 info
->callbacks
->einfo
11147 /* xgettext:c-format */
11148 (_("%P: linkage table error against `%T'\n"),
11149 stub_entry
->h
!= NULL
11150 ? stub_entry
->h
->elf
.root
.root
.string
11152 bfd_set_error (bfd_error_bad_value
);
11153 htab
->stub_error
= TRUE
;
11157 if (htab
->params
->plt_stub_align
!= 0)
11159 unsigned pad
= plt_stub_pad (htab
, stub_entry
, off
);
11161 stub_entry
->group
->stub_sec
->size
+= pad
;
11162 stub_entry
->stub_offset
= stub_entry
->group
->stub_sec
->size
;
11167 if (info
->emitrelocations
)
11169 r
= get_relocs (stub_entry
->group
->stub_sec
,
11170 ((PPC_HA (off
) != 0)
11172 ? 2 + (htab
->params
->plt_static_chain
11173 && PPC_HA (off
+ 16) == PPC_HA (off
))
11177 r
[0].r_offset
= loc
- stub_entry
->group
->stub_sec
->contents
;
11178 if (bfd_big_endian (info
->output_bfd
))
11179 r
[0].r_offset
+= 2;
11180 r
[0].r_addend
= dest
;
11182 if (stub_entry
->h
!= NULL
11183 && (stub_entry
->h
== htab
->tls_get_addr_fd
11184 || stub_entry
->h
== htab
->tls_get_addr
)
11185 && htab
->params
->tls_get_addr_opt
)
11186 p
= build_tls_get_addr_stub (htab
, stub_entry
, loc
, off
, r
);
11188 p
= build_plt_stub (htab
, stub_entry
, loc
, off
, r
);
11192 case ppc_stub_save_res
:
11200 stub_entry
->group
->stub_sec
->size
+= size
;
11202 if (htab
->params
->emit_stub_syms
)
11204 struct elf_link_hash_entry
*h
;
11207 const char *const stub_str
[] = { "long_branch",
11208 "long_branch_r2off",
11210 "plt_branch_r2off",
11214 len1
= strlen (stub_str
[stub_entry
->stub_type
- 1]);
11215 len2
= strlen (stub_entry
->root
.string
);
11216 name
= bfd_malloc (len1
+ len2
+ 2);
11219 memcpy (name
, stub_entry
->root
.string
, 9);
11220 memcpy (name
+ 9, stub_str
[stub_entry
->stub_type
- 1], len1
);
11221 memcpy (name
+ len1
+ 9, stub_entry
->root
.string
+ 8, len2
- 8 + 1);
11222 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, FALSE
, FALSE
);
11225 if (h
->root
.type
== bfd_link_hash_new
)
11227 h
->root
.type
= bfd_link_hash_defined
;
11228 h
->root
.u
.def
.section
= stub_entry
->group
->stub_sec
;
11229 h
->root
.u
.def
.value
= stub_entry
->stub_offset
;
11230 h
->ref_regular
= 1;
11231 h
->def_regular
= 1;
11232 h
->ref_regular_nonweak
= 1;
11233 h
->forced_local
= 1;
11235 h
->root
.linker_def
= 1;
11242 /* As above, but don't actually build the stub. Just bump offset so
11243 we know stub section sizes, and select plt_branch stubs where
11244 long_branch stubs won't do. */
11247 ppc_size_one_stub (struct bfd_hash_entry
*gen_entry
, void *in_arg
)
11249 struct ppc_stub_hash_entry
*stub_entry
;
11250 struct bfd_link_info
*info
;
11251 struct ppc_link_hash_table
*htab
;
11255 /* Massage our args to the form they really have. */
11256 stub_entry
= (struct ppc_stub_hash_entry
*) gen_entry
;
11259 htab
= ppc_hash_table (info
);
11263 if (stub_entry
->h
!= NULL
11264 && stub_entry
->h
->save_res
11265 && stub_entry
->h
->elf
.root
.type
== bfd_link_hash_defined
11266 && stub_entry
->h
->elf
.root
.u
.def
.section
== htab
->sfpr
)
11268 /* Don't make stubs to out-of-line register save/restore
11269 functions. Instead, emit copies of the functions. */
11270 stub_entry
->group
->needs_save_res
= 1;
11271 stub_entry
->stub_type
= ppc_stub_save_res
;
11275 if (stub_entry
->stub_type
== ppc_stub_plt_call
11276 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
11279 off
= stub_entry
->plt_ent
->plt
.offset
& ~(bfd_vma
) 1;
11280 if (off
>= (bfd_vma
) -2)
11282 plt
= htab
->elf
.splt
;
11283 if (!htab
->elf
.dynamic_sections_created
11284 || stub_entry
->h
== NULL
11285 || stub_entry
->h
->elf
.dynindx
== -1)
11286 plt
= htab
->elf
.iplt
;
11287 off
+= (plt
->output_offset
11288 + plt
->output_section
->vma
11289 - elf_gp (plt
->output_section
->owner
)
11290 - htab
->sec_info
[stub_entry
->group
->link_sec
->id
].toc_off
);
11292 size
= plt_stub_size (htab
, stub_entry
, off
);
11293 if (htab
->params
->plt_stub_align
)
11294 size
+= plt_stub_pad (htab
, stub_entry
, off
);
11295 if (info
->emitrelocations
)
11297 stub_entry
->group
->stub_sec
->reloc_count
11298 += ((PPC_HA (off
) != 0)
11300 ? 2 + (htab
->params
->plt_static_chain
11301 && PPC_HA (off
+ 16) == PPC_HA (off
))
11303 stub_entry
->group
->stub_sec
->flags
|= SEC_RELOC
;
11308 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11311 bfd_vma local_off
= 0;
11313 off
= (stub_entry
->target_value
11314 + stub_entry
->target_section
->output_offset
11315 + stub_entry
->target_section
->output_section
->vma
);
11316 off
-= (stub_entry
->group
->stub_sec
->size
11317 + stub_entry
->group
->stub_sec
->output_offset
11318 + stub_entry
->group
->stub_sec
->output_section
->vma
);
11320 /* Reset the stub type from the plt variant in case we now
11321 can reach with a shorter stub. */
11322 if (stub_entry
->stub_type
>= ppc_stub_plt_branch
)
11323 stub_entry
->stub_type
+= ppc_stub_long_branch
- ppc_stub_plt_branch
;
11326 if (stub_entry
->stub_type
== ppc_stub_long_branch_r2off
)
11328 r2off
= get_r2off (info
, stub_entry
);
11329 if (r2off
== (bfd_vma
) -1)
11331 htab
->stub_error
= TRUE
;
11335 if (PPC_HA (r2off
) != 0)
11337 if (PPC_LO (r2off
) != 0)
11342 local_off
= PPC64_LOCAL_ENTRY_OFFSET (stub_entry
->other
);
11344 /* If the branch offset if too big, use a ppc_stub_plt_branch.
11345 Do the same for -R objects without function descriptors. */
11346 if (off
+ (1 << 25) >= (bfd_vma
) (1 << 26) - local_off
11347 || (stub_entry
->stub_type
== ppc_stub_long_branch_r2off
11349 && htab
->sec_info
[stub_entry
->target_section
->id
].toc_off
== 0))
11351 struct ppc_branch_hash_entry
*br_entry
;
11353 br_entry
= ppc_branch_hash_lookup (&htab
->branch_hash_table
,
11354 stub_entry
->root
.string
+ 9,
11356 if (br_entry
== NULL
)
11358 info
->callbacks
->einfo (_("%P: can't build branch stub `%s'\n"),
11359 stub_entry
->root
.string
);
11360 htab
->stub_error
= TRUE
;
11364 if (br_entry
->iter
!= htab
->stub_iteration
)
11366 br_entry
->iter
= htab
->stub_iteration
;
11367 br_entry
->offset
= htab
->brlt
->size
;
11368 htab
->brlt
->size
+= 8;
11370 if (htab
->relbrlt
!= NULL
)
11371 htab
->relbrlt
->size
+= sizeof (Elf64_External_Rela
);
11372 else if (info
->emitrelocations
)
11374 htab
->brlt
->reloc_count
+= 1;
11375 htab
->brlt
->flags
|= SEC_RELOC
;
11379 stub_entry
->stub_type
+= ppc_stub_plt_branch
- ppc_stub_long_branch
;
11380 off
= (br_entry
->offset
11381 + htab
->brlt
->output_offset
11382 + htab
->brlt
->output_section
->vma
11383 - elf_gp (htab
->brlt
->output_section
->owner
)
11384 - htab
->sec_info
[stub_entry
->group
->link_sec
->id
].toc_off
);
11386 if (info
->emitrelocations
)
11388 stub_entry
->group
->stub_sec
->reloc_count
11389 += 1 + (PPC_HA (off
) != 0);
11390 stub_entry
->group
->stub_sec
->flags
|= SEC_RELOC
;
11393 if (stub_entry
->stub_type
!= ppc_stub_plt_branch_r2off
)
11396 if (PPC_HA (off
) != 0)
11402 if (PPC_HA (off
) != 0)
11405 if (PPC_HA (r2off
) != 0)
11407 if (PPC_LO (r2off
) != 0)
11411 else if (info
->emitrelocations
)
11413 stub_entry
->group
->stub_sec
->reloc_count
+= 1;
11414 stub_entry
->group
->stub_sec
->flags
|= SEC_RELOC
;
11418 stub_entry
->group
->stub_sec
->size
+= size
;
11422 /* Set up various things so that we can make a list of input sections
11423 for each output section included in the link. Returns -1 on error,
11424 0 when no stubs will be needed, and 1 on success. */
11427 ppc64_elf_setup_section_lists (struct bfd_link_info
*info
)
11431 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
11436 htab
->sec_info_arr_size
= bfd_get_next_section_id ();
11437 amt
= sizeof (*htab
->sec_info
) * (htab
->sec_info_arr_size
);
11438 htab
->sec_info
= bfd_zmalloc (amt
);
11439 if (htab
->sec_info
== NULL
)
11442 /* Set toc_off for com, und, abs and ind sections. */
11443 for (id
= 0; id
< 3; id
++)
11444 htab
->sec_info
[id
].toc_off
= TOC_BASE_OFF
;
11449 /* Set up for first pass at multitoc partitioning. */
11452 ppc64_elf_start_multitoc_partition (struct bfd_link_info
*info
)
11454 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
11456 htab
->toc_curr
= ppc64_elf_set_toc (info
, info
->output_bfd
);
11457 htab
->toc_bfd
= NULL
;
11458 htab
->toc_first_sec
= NULL
;
11461 /* The linker repeatedly calls this function for each TOC input section
11462 and linker generated GOT section. Group input bfds such that the toc
11463 within a group is less than 64k in size. */
11466 ppc64_elf_next_toc_section (struct bfd_link_info
*info
, asection
*isec
)
11468 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
11469 bfd_vma addr
, off
, limit
;
11474 if (!htab
->second_toc_pass
)
11476 /* Keep track of the first .toc or .got section for this input bfd. */
11477 bfd_boolean new_bfd
= htab
->toc_bfd
!= isec
->owner
;
11481 htab
->toc_bfd
= isec
->owner
;
11482 htab
->toc_first_sec
= isec
;
11485 addr
= isec
->output_offset
+ isec
->output_section
->vma
;
11486 off
= addr
- htab
->toc_curr
;
11487 limit
= 0x80008000;
11488 if (ppc64_elf_tdata (isec
->owner
)->has_small_toc_reloc
)
11490 if (off
+ isec
->size
> limit
)
11492 addr
= (htab
->toc_first_sec
->output_offset
11493 + htab
->toc_first_sec
->output_section
->vma
);
11494 htab
->toc_curr
= addr
;
11495 htab
->toc_curr
&= -TOC_BASE_ALIGN
;
11498 /* toc_curr is the base address of this toc group. Set elf_gp
11499 for the input section to be the offset relative to the
11500 output toc base plus 0x8000. Making the input elf_gp an
11501 offset allows us to move the toc as a whole without
11502 recalculating input elf_gp. */
11503 off
= htab
->toc_curr
- elf_gp (isec
->output_section
->owner
);
11504 off
+= TOC_BASE_OFF
;
11506 /* Die if someone uses a linker script that doesn't keep input
11507 file .toc and .got together. */
11509 && elf_gp (isec
->owner
) != 0
11510 && elf_gp (isec
->owner
) != off
)
11513 elf_gp (isec
->owner
) = off
;
11517 /* During the second pass toc_first_sec points to the start of
11518 a toc group, and toc_curr is used to track the old elf_gp.
11519 We use toc_bfd to ensure we only look at each bfd once. */
11520 if (htab
->toc_bfd
== isec
->owner
)
11522 htab
->toc_bfd
= isec
->owner
;
11524 if (htab
->toc_first_sec
== NULL
11525 || htab
->toc_curr
!= elf_gp (isec
->owner
))
11527 htab
->toc_curr
= elf_gp (isec
->owner
);
11528 htab
->toc_first_sec
= isec
;
11530 addr
= (htab
->toc_first_sec
->output_offset
11531 + htab
->toc_first_sec
->output_section
->vma
);
11532 off
= addr
- elf_gp (isec
->output_section
->owner
) + TOC_BASE_OFF
;
11533 elf_gp (isec
->owner
) = off
;
11538 /* Called via elf_link_hash_traverse to merge GOT entries for global
11542 merge_global_got (struct elf_link_hash_entry
*h
, void *inf ATTRIBUTE_UNUSED
)
11544 if (h
->root
.type
== bfd_link_hash_indirect
)
11547 merge_got_entries (&h
->got
.glist
);
11552 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11556 reallocate_got (struct elf_link_hash_entry
*h
, void *inf
)
11558 struct got_entry
*gent
;
11560 if (h
->root
.type
== bfd_link_hash_indirect
)
11563 for (gent
= h
->got
.glist
; gent
!= NULL
; gent
= gent
->next
)
11564 if (!gent
->is_indirect
)
11565 allocate_got (h
, (struct bfd_link_info
*) inf
, gent
);
11569 /* Called on the first multitoc pass after the last call to
11570 ppc64_elf_next_toc_section. This function removes duplicate GOT
11574 ppc64_elf_layout_multitoc (struct bfd_link_info
*info
)
11576 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
11577 struct bfd
*ibfd
, *ibfd2
;
11578 bfd_boolean done_something
;
11580 htab
->multi_toc_needed
= htab
->toc_curr
!= elf_gp (info
->output_bfd
);
11582 if (!htab
->do_multi_toc
)
11585 /* Merge global sym got entries within a toc group. */
11586 elf_link_hash_traverse (&htab
->elf
, merge_global_got
, info
);
11588 /* And tlsld_got. */
11589 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
11591 struct got_entry
*ent
, *ent2
;
11593 if (!is_ppc64_elf (ibfd
))
11596 ent
= ppc64_tlsld_got (ibfd
);
11597 if (!ent
->is_indirect
11598 && ent
->got
.offset
!= (bfd_vma
) -1)
11600 for (ibfd2
= ibfd
->link
.next
; ibfd2
!= NULL
; ibfd2
= ibfd2
->link
.next
)
11602 if (!is_ppc64_elf (ibfd2
))
11605 ent2
= ppc64_tlsld_got (ibfd2
);
11606 if (!ent2
->is_indirect
11607 && ent2
->got
.offset
!= (bfd_vma
) -1
11608 && elf_gp (ibfd2
) == elf_gp (ibfd
))
11610 ent2
->is_indirect
= TRUE
;
11611 ent2
->got
.ent
= ent
;
11617 /* Zap sizes of got sections. */
11618 htab
->elf
.irelplt
->rawsize
= htab
->elf
.irelplt
->size
;
11619 htab
->elf
.irelplt
->size
-= htab
->got_reli_size
;
11620 htab
->got_reli_size
= 0;
11622 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
11624 asection
*got
, *relgot
;
11626 if (!is_ppc64_elf (ibfd
))
11629 got
= ppc64_elf_tdata (ibfd
)->got
;
11632 got
->rawsize
= got
->size
;
11634 relgot
= ppc64_elf_tdata (ibfd
)->relgot
;
11635 relgot
->rawsize
= relgot
->size
;
11640 /* Now reallocate the got, local syms first. We don't need to
11641 allocate section contents again since we never increase size. */
11642 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
11644 struct got_entry
**lgot_ents
;
11645 struct got_entry
**end_lgot_ents
;
11646 struct plt_entry
**local_plt
;
11647 struct plt_entry
**end_local_plt
;
11648 unsigned char *lgot_masks
;
11649 bfd_size_type locsymcount
;
11650 Elf_Internal_Shdr
*symtab_hdr
;
11653 if (!is_ppc64_elf (ibfd
))
11656 lgot_ents
= elf_local_got_ents (ibfd
);
11660 symtab_hdr
= &elf_symtab_hdr (ibfd
);
11661 locsymcount
= symtab_hdr
->sh_info
;
11662 end_lgot_ents
= lgot_ents
+ locsymcount
;
11663 local_plt
= (struct plt_entry
**) end_lgot_ents
;
11664 end_local_plt
= local_plt
+ locsymcount
;
11665 lgot_masks
= (unsigned char *) end_local_plt
;
11666 s
= ppc64_elf_tdata (ibfd
)->got
;
11667 for (; lgot_ents
< end_lgot_ents
; ++lgot_ents
, ++lgot_masks
)
11669 struct got_entry
*ent
;
11671 for (ent
= *lgot_ents
; ent
!= NULL
; ent
= ent
->next
)
11673 unsigned int ent_size
= 8;
11674 unsigned int rel_size
= sizeof (Elf64_External_Rela
);
11676 ent
->got
.offset
= s
->size
;
11677 if ((ent
->tls_type
& *lgot_masks
& TLS_GD
) != 0)
11682 s
->size
+= ent_size
;
11683 if ((*lgot_masks
& PLT_IFUNC
) != 0)
11685 htab
->elf
.irelplt
->size
+= rel_size
;
11686 htab
->got_reli_size
+= rel_size
;
11688 else if (bfd_link_pic (info
))
11690 asection
*srel
= ppc64_elf_tdata (ibfd
)->relgot
;
11691 srel
->size
+= rel_size
;
11697 elf_link_hash_traverse (&htab
->elf
, reallocate_got
, info
);
11699 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
11701 struct got_entry
*ent
;
11703 if (!is_ppc64_elf (ibfd
))
11706 ent
= ppc64_tlsld_got (ibfd
);
11707 if (!ent
->is_indirect
11708 && ent
->got
.offset
!= (bfd_vma
) -1)
11710 asection
*s
= ppc64_elf_tdata (ibfd
)->got
;
11711 ent
->got
.offset
= s
->size
;
11713 if (bfd_link_pic (info
))
11715 asection
*srel
= ppc64_elf_tdata (ibfd
)->relgot
;
11716 srel
->size
+= sizeof (Elf64_External_Rela
);
11721 done_something
= htab
->elf
.irelplt
->rawsize
!= htab
->elf
.irelplt
->size
;
11722 if (!done_something
)
11723 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link
.next
)
11727 if (!is_ppc64_elf (ibfd
))
11730 got
= ppc64_elf_tdata (ibfd
)->got
;
11733 done_something
= got
->rawsize
!= got
->size
;
11734 if (done_something
)
11739 if (done_something
)
11740 (*htab
->params
->layout_sections_again
) ();
11742 /* Set up for second pass over toc sections to recalculate elf_gp
11743 on input sections. */
11744 htab
->toc_bfd
= NULL
;
11745 htab
->toc_first_sec
= NULL
;
11746 htab
->second_toc_pass
= TRUE
;
11747 return done_something
;
11750 /* Called after second pass of multitoc partitioning. */
11753 ppc64_elf_finish_multitoc_partition (struct bfd_link_info
*info
)
11755 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
11757 /* After the second pass, toc_curr tracks the TOC offset used
11758 for code sections below in ppc64_elf_next_input_section. */
11759 htab
->toc_curr
= TOC_BASE_OFF
;
11762 /* No toc references were found in ISEC. If the code in ISEC makes no
11763 calls, then there's no need to use toc adjusting stubs when branching
11764 into ISEC. Actually, indirect calls from ISEC are OK as they will
11765 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11766 needed, and 2 if a cyclical call-graph was found but no other reason
11767 for a stub was detected. If called from the top level, a return of
11768 2 means the same as a return of 0. */
11771 toc_adjusting_stub_needed (struct bfd_link_info
*info
, asection
*isec
)
11775 /* Mark this section as checked. */
11776 isec
->call_check_done
= 1;
11778 /* We know none of our code bearing sections will need toc stubs. */
11779 if ((isec
->flags
& SEC_LINKER_CREATED
) != 0)
11782 if (isec
->size
== 0)
11785 if (isec
->output_section
== NULL
)
11789 if (isec
->reloc_count
!= 0)
11791 Elf_Internal_Rela
*relstart
, *rel
;
11792 Elf_Internal_Sym
*local_syms
;
11793 struct ppc_link_hash_table
*htab
;
11795 relstart
= _bfd_elf_link_read_relocs (isec
->owner
, isec
, NULL
, NULL
,
11796 info
->keep_memory
);
11797 if (relstart
== NULL
)
11800 /* Look for branches to outside of this section. */
11802 htab
= ppc_hash_table (info
);
11806 for (rel
= relstart
; rel
< relstart
+ isec
->reloc_count
; ++rel
)
11808 enum elf_ppc64_reloc_type r_type
;
11809 unsigned long r_symndx
;
11810 struct elf_link_hash_entry
*h
;
11811 struct ppc_link_hash_entry
*eh
;
11812 Elf_Internal_Sym
*sym
;
11814 struct _opd_sec_data
*opd
;
11818 r_type
= ELF64_R_TYPE (rel
->r_info
);
11819 if (r_type
!= R_PPC64_REL24
11820 && r_type
!= R_PPC64_REL14
11821 && r_type
!= R_PPC64_REL14_BRTAKEN
11822 && r_type
!= R_PPC64_REL14_BRNTAKEN
)
11825 r_symndx
= ELF64_R_SYM (rel
->r_info
);
11826 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
, r_symndx
,
11833 /* Calls to dynamic lib functions go through a plt call stub
11835 eh
= (struct ppc_link_hash_entry
*) h
;
11837 && (eh
->elf
.plt
.plist
!= NULL
11839 && ppc_follow_link (eh
->oh
)->elf
.plt
.plist
!= NULL
)))
11845 if (sym_sec
== NULL
)
11846 /* Ignore other undefined symbols. */
11849 /* Assume branches to other sections not included in the
11850 link need stubs too, to cover -R and absolute syms. */
11851 if (sym_sec
->output_section
== NULL
)
11858 sym_value
= sym
->st_value
;
11861 if (h
->root
.type
!= bfd_link_hash_defined
11862 && h
->root
.type
!= bfd_link_hash_defweak
)
11864 sym_value
= h
->root
.u
.def
.value
;
11866 sym_value
+= rel
->r_addend
;
11868 /* If this branch reloc uses an opd sym, find the code section. */
11869 opd
= get_opd_info (sym_sec
);
11872 if (h
== NULL
&& opd
->adjust
!= NULL
)
11876 adjust
= opd
->adjust
[OPD_NDX (sym_value
)];
11878 /* Assume deleted functions won't ever be called. */
11880 sym_value
+= adjust
;
11883 dest
= opd_entry_value (sym_sec
, sym_value
,
11884 &sym_sec
, NULL
, FALSE
);
11885 if (dest
== (bfd_vma
) -1)
11890 + sym_sec
->output_offset
11891 + sym_sec
->output_section
->vma
);
11893 /* Ignore branch to self. */
11894 if (sym_sec
== isec
)
11897 /* If the called function uses the toc, we need a stub. */
11898 if (sym_sec
->has_toc_reloc
11899 || sym_sec
->makes_toc_func_call
)
11905 /* Assume any branch that needs a long branch stub might in fact
11906 need a plt_branch stub. A plt_branch stub uses r2. */
11907 else if (dest
- (isec
->output_offset
11908 + isec
->output_section
->vma
11909 + rel
->r_offset
) + (1 << 25)
11910 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11918 /* If calling back to a section in the process of being
11919 tested, we can't say for sure that no toc adjusting stubs
11920 are needed, so don't return zero. */
11921 else if (sym_sec
->call_check_in_progress
)
11924 /* Branches to another section that itself doesn't have any TOC
11925 references are OK. Recursively call ourselves to check. */
11926 else if (!sym_sec
->call_check_done
)
11930 /* Mark current section as indeterminate, so that other
11931 sections that call back to current won't be marked as
11933 isec
->call_check_in_progress
= 1;
11934 recur
= toc_adjusting_stub_needed (info
, sym_sec
);
11935 isec
->call_check_in_progress
= 0;
11946 if (local_syms
!= NULL
11947 && (elf_symtab_hdr (isec
->owner
).contents
11948 != (unsigned char *) local_syms
))
11950 if (elf_section_data (isec
)->relocs
!= relstart
)
11955 && isec
->map_head
.s
!= NULL
11956 && (strcmp (isec
->output_section
->name
, ".init") == 0
11957 || strcmp (isec
->output_section
->name
, ".fini") == 0))
11959 if (isec
->map_head
.s
->has_toc_reloc
11960 || isec
->map_head
.s
->makes_toc_func_call
)
11962 else if (!isec
->map_head
.s
->call_check_done
)
11965 isec
->call_check_in_progress
= 1;
11966 recur
= toc_adjusting_stub_needed (info
, isec
->map_head
.s
);
11967 isec
->call_check_in_progress
= 0;
11974 isec
->makes_toc_func_call
= 1;
11979 /* The linker repeatedly calls this function for each input section,
11980 in the order that input sections are linked into output sections.
11981 Build lists of input sections to determine groupings between which
11982 we may insert linker stubs. */
11985 ppc64_elf_next_input_section (struct bfd_link_info
*info
, asection
*isec
)
11987 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
11992 if ((isec
->output_section
->flags
& SEC_CODE
) != 0
11993 && isec
->output_section
->id
< htab
->sec_info_arr_size
)
11995 /* This happens to make the list in reverse order,
11996 which is what we want. */
11997 htab
->sec_info
[isec
->id
].u
.list
11998 = htab
->sec_info
[isec
->output_section
->id
].u
.list
;
11999 htab
->sec_info
[isec
->output_section
->id
].u
.list
= isec
;
12002 if (htab
->multi_toc_needed
)
12004 /* Analyse sections that aren't already flagged as needing a
12005 valid toc pointer. Exclude .fixup for the linux kernel.
12006 .fixup contains branches, but only back to the function that
12007 hit an exception. */
12008 if (!(isec
->has_toc_reloc
12009 || (isec
->flags
& SEC_CODE
) == 0
12010 || strcmp (isec
->name
, ".fixup") == 0
12011 || isec
->call_check_done
))
12013 if (toc_adjusting_stub_needed (info
, isec
) < 0)
12016 /* Make all sections use the TOC assigned for this object file.
12017 This will be wrong for pasted sections; We fix that in
12018 check_pasted_section(). */
12019 if (elf_gp (isec
->owner
) != 0)
12020 htab
->toc_curr
= elf_gp (isec
->owner
);
12023 htab
->sec_info
[isec
->id
].toc_off
= htab
->toc_curr
;
12027 /* Check that all .init and .fini sections use the same toc, if they
12028 have toc relocs. */
12031 check_pasted_section (struct bfd_link_info
*info
, const char *name
)
12033 asection
*o
= bfd_get_section_by_name (info
->output_bfd
, name
);
12037 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
12038 bfd_vma toc_off
= 0;
12041 for (i
= o
->map_head
.s
; i
!= NULL
; i
= i
->map_head
.s
)
12042 if (i
->has_toc_reloc
)
12045 toc_off
= htab
->sec_info
[i
->id
].toc_off
;
12046 else if (toc_off
!= htab
->sec_info
[i
->id
].toc_off
)
12051 for (i
= o
->map_head
.s
; i
!= NULL
; i
= i
->map_head
.s
)
12052 if (i
->makes_toc_func_call
)
12054 toc_off
= htab
->sec_info
[i
->id
].toc_off
;
12058 /* Make sure the whole pasted function uses the same toc offset. */
12060 for (i
= o
->map_head
.s
; i
!= NULL
; i
= i
->map_head
.s
)
12061 htab
->sec_info
[i
->id
].toc_off
= toc_off
;
12067 ppc64_elf_check_init_fini (struct bfd_link_info
*info
)
12069 return (check_pasted_section (info
, ".init")
12070 & check_pasted_section (info
, ".fini"));
12073 /* See whether we can group stub sections together. Grouping stub
12074 sections may result in fewer stubs. More importantly, we need to
12075 put all .init* and .fini* stubs at the beginning of the .init or
12076 .fini output sections respectively, because glibc splits the
12077 _init and _fini functions into multiple parts. Putting a stub in
12078 the middle of a function is not a good idea. */
12081 group_sections (struct bfd_link_info
*info
,
12082 bfd_size_type stub_group_size
,
12083 bfd_boolean stubs_always_before_branch
)
12085 struct ppc_link_hash_table
*htab
;
12087 bfd_boolean suppress_size_errors
;
12089 htab
= ppc_hash_table (info
);
12093 suppress_size_errors
= FALSE
;
12094 if (stub_group_size
== 1)
12096 /* Default values. */
12097 if (stubs_always_before_branch
)
12098 stub_group_size
= 0x1e00000;
12100 stub_group_size
= 0x1c00000;
12101 suppress_size_errors
= TRUE
;
12104 for (osec
= info
->output_bfd
->sections
; osec
!= NULL
; osec
= osec
->next
)
12108 if (osec
->id
>= htab
->sec_info_arr_size
)
12111 tail
= htab
->sec_info
[osec
->id
].u
.list
;
12112 while (tail
!= NULL
)
12116 bfd_size_type total
;
12117 bfd_boolean big_sec
;
12119 struct map_stub
*group
;
12120 bfd_size_type group_size
;
12123 total
= tail
->size
;
12124 group_size
= (ppc64_elf_section_data (tail
) != NULL
12125 && ppc64_elf_section_data (tail
)->has_14bit_branch
12126 ? stub_group_size
>> 10 : stub_group_size
);
12128 big_sec
= total
> group_size
;
12129 if (big_sec
&& !suppress_size_errors
)
12130 /* xgettext:c-format */
12131 _bfd_error_handler (_("%B section %A exceeds stub group size"),
12132 tail
->owner
, tail
);
12133 curr_toc
= htab
->sec_info
[tail
->id
].toc_off
;
12135 while ((prev
= htab
->sec_info
[curr
->id
].u
.list
) != NULL
12136 && ((total
+= curr
->output_offset
- prev
->output_offset
)
12137 < (ppc64_elf_section_data (prev
) != NULL
12138 && ppc64_elf_section_data (prev
)->has_14bit_branch
12139 ? (group_size
= stub_group_size
>> 10) : group_size
))
12140 && htab
->sec_info
[prev
->id
].toc_off
== curr_toc
)
12143 /* OK, the size from the start of CURR to the end is less
12144 than group_size and thus can be handled by one stub
12145 section. (or the tail section is itself larger than
12146 group_size, in which case we may be toast.) We should
12147 really be keeping track of the total size of stubs added
12148 here, as stubs contribute to the final output section
12149 size. That's a little tricky, and this way will only
12150 break if stubs added make the total size more than 2^25,
12151 ie. for the default stub_group_size, if stubs total more
12152 than 2097152 bytes, or nearly 75000 plt call stubs. */
12153 group
= bfd_alloc (curr
->owner
, sizeof (*group
));
12156 group
->link_sec
= curr
;
12157 group
->stub_sec
= NULL
;
12158 group
->needs_save_res
= 0;
12159 group
->next
= htab
->group
;
12160 htab
->group
= group
;
12163 prev
= htab
->sec_info
[tail
->id
].u
.list
;
12164 /* Set up this stub group. */
12165 htab
->sec_info
[tail
->id
].u
.group
= group
;
12167 while (tail
!= curr
&& (tail
= prev
) != NULL
);
12169 /* But wait, there's more! Input sections up to group_size
12170 bytes before the stub section can be handled by it too.
12171 Don't do this if we have a really large section after the
12172 stubs, as adding more stubs increases the chance that
12173 branches may not reach into the stub section. */
12174 if (!stubs_always_before_branch
&& !big_sec
)
12177 while (prev
!= NULL
12178 && ((total
+= tail
->output_offset
- prev
->output_offset
)
12179 < (ppc64_elf_section_data (prev
) != NULL
12180 && ppc64_elf_section_data (prev
)->has_14bit_branch
12181 ? (group_size
= stub_group_size
>> 10) : group_size
))
12182 && htab
->sec_info
[prev
->id
].toc_off
== curr_toc
)
12185 prev
= htab
->sec_info
[tail
->id
].u
.list
;
12186 htab
->sec_info
[tail
->id
].u
.group
= group
;
12195 static const unsigned char glink_eh_frame_cie
[] =
12197 0, 0, 0, 16, /* length. */
12198 0, 0, 0, 0, /* id. */
12199 1, /* CIE version. */
12200 'z', 'R', 0, /* Augmentation string. */
12201 4, /* Code alignment. */
12202 0x78, /* Data alignment. */
12204 1, /* Augmentation size. */
12205 DW_EH_PE_pcrel
| DW_EH_PE_sdata4
, /* FDE encoding. */
12206 DW_CFA_def_cfa
, 1, 0, /* def_cfa: r1 offset 0. */
12210 /* Stripping output sections is normally done before dynamic section
12211 symbols have been allocated. This function is called later, and
12212 handles cases like htab->brlt which is mapped to its own output
12216 maybe_strip_output (struct bfd_link_info
*info
, asection
*isec
)
12218 if (isec
->size
== 0
12219 && isec
->output_section
->size
== 0
12220 && !(isec
->output_section
->flags
& SEC_KEEP
)
12221 && !bfd_section_removed_from_list (info
->output_bfd
,
12222 isec
->output_section
)
12223 && elf_section_data (isec
->output_section
)->dynindx
== 0)
12225 isec
->output_section
->flags
|= SEC_EXCLUDE
;
12226 bfd_section_list_remove (info
->output_bfd
, isec
->output_section
);
12227 info
->output_bfd
->section_count
--;
12231 /* Determine and set the size of the stub section for a final link.
12233 The basic idea here is to examine all the relocations looking for
12234 PC-relative calls to a target that is unreachable with a "bl"
12238 ppc64_elf_size_stubs (struct bfd_link_info
*info
)
12240 bfd_size_type stub_group_size
;
12241 bfd_boolean stubs_always_before_branch
;
12242 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
12247 if (htab
->params
->plt_thread_safe
== -1 && !bfd_link_executable (info
))
12248 htab
->params
->plt_thread_safe
= 1;
12249 if (!htab
->opd_abi
)
12250 htab
->params
->plt_thread_safe
= 0;
12251 else if (htab
->params
->plt_thread_safe
== -1)
12253 static const char *const thread_starter
[] =
12257 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12259 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12260 "mq_notify", "create_timer",
12265 "GOMP_parallel_start",
12266 "GOMP_parallel_loop_static",
12267 "GOMP_parallel_loop_static_start",
12268 "GOMP_parallel_loop_dynamic",
12269 "GOMP_parallel_loop_dynamic_start",
12270 "GOMP_parallel_loop_guided",
12271 "GOMP_parallel_loop_guided_start",
12272 "GOMP_parallel_loop_runtime",
12273 "GOMP_parallel_loop_runtime_start",
12274 "GOMP_parallel_sections",
12275 "GOMP_parallel_sections_start",
12281 for (i
= 0; i
< ARRAY_SIZE (thread_starter
); i
++)
12283 struct elf_link_hash_entry
*h
;
12284 h
= elf_link_hash_lookup (&htab
->elf
, thread_starter
[i
],
12285 FALSE
, FALSE
, TRUE
);
12286 htab
->params
->plt_thread_safe
= h
!= NULL
&& h
->ref_regular
;
12287 if (htab
->params
->plt_thread_safe
)
12291 stubs_always_before_branch
= htab
->params
->group_size
< 0;
12292 if (htab
->params
->group_size
< 0)
12293 stub_group_size
= -htab
->params
->group_size
;
12295 stub_group_size
= htab
->params
->group_size
;
12297 if (!group_sections (info
, stub_group_size
, stubs_always_before_branch
))
12300 #define STUB_SHRINK_ITER 20
12301 /* Loop until no stubs added. After iteration 20 of this loop we may
12302 exit on a stub section shrinking. This is to break out of a
12303 pathological case where adding stubs on one iteration decreases
12304 section gaps (perhaps due to alignment), which then requires
12305 fewer or smaller stubs on the next iteration. */
12310 unsigned int bfd_indx
;
12311 struct map_stub
*group
;
12312 asection
*stub_sec
;
12314 htab
->stub_iteration
+= 1;
12316 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
12318 input_bfd
= input_bfd
->link
.next
, bfd_indx
++)
12320 Elf_Internal_Shdr
*symtab_hdr
;
12322 Elf_Internal_Sym
*local_syms
= NULL
;
12324 if (!is_ppc64_elf (input_bfd
))
12327 /* We'll need the symbol table in a second. */
12328 symtab_hdr
= &elf_symtab_hdr (input_bfd
);
12329 if (symtab_hdr
->sh_info
== 0)
12332 /* Walk over each section attached to the input bfd. */
12333 for (section
= input_bfd
->sections
;
12335 section
= section
->next
)
12337 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
12339 /* If there aren't any relocs, then there's nothing more
12341 if ((section
->flags
& SEC_RELOC
) == 0
12342 || (section
->flags
& SEC_ALLOC
) == 0
12343 || (section
->flags
& SEC_LOAD
) == 0
12344 || (section
->flags
& SEC_CODE
) == 0
12345 || section
->reloc_count
== 0)
12348 /* If this section is a link-once section that will be
12349 discarded, then don't create any stubs. */
12350 if (section
->output_section
== NULL
12351 || section
->output_section
->owner
!= info
->output_bfd
)
12354 /* Get the relocs. */
12356 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
, NULL
,
12357 info
->keep_memory
);
12358 if (internal_relocs
== NULL
)
12359 goto error_ret_free_local
;
12361 /* Now examine each relocation. */
12362 irela
= internal_relocs
;
12363 irelaend
= irela
+ section
->reloc_count
;
12364 for (; irela
< irelaend
; irela
++)
12366 enum elf_ppc64_reloc_type r_type
;
12367 unsigned int r_indx
;
12368 enum ppc_stub_type stub_type
;
12369 struct ppc_stub_hash_entry
*stub_entry
;
12370 asection
*sym_sec
, *code_sec
;
12371 bfd_vma sym_value
, code_value
;
12372 bfd_vma destination
;
12373 unsigned long local_off
;
12374 bfd_boolean ok_dest
;
12375 struct ppc_link_hash_entry
*hash
;
12376 struct ppc_link_hash_entry
*fdh
;
12377 struct elf_link_hash_entry
*h
;
12378 Elf_Internal_Sym
*sym
;
12380 const asection
*id_sec
;
12381 struct _opd_sec_data
*opd
;
12382 struct plt_entry
*plt_ent
;
12384 r_type
= ELF64_R_TYPE (irela
->r_info
);
12385 r_indx
= ELF64_R_SYM (irela
->r_info
);
12387 if (r_type
>= R_PPC64_max
)
12389 bfd_set_error (bfd_error_bad_value
);
12390 goto error_ret_free_internal
;
12393 /* Only look for stubs on branch instructions. */
12394 if (r_type
!= R_PPC64_REL24
12395 && r_type
!= R_PPC64_REL14
12396 && r_type
!= R_PPC64_REL14_BRTAKEN
12397 && r_type
!= R_PPC64_REL14_BRNTAKEN
)
12400 /* Now determine the call target, its name, value,
12402 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
12403 r_indx
, input_bfd
))
12404 goto error_ret_free_internal
;
12405 hash
= (struct ppc_link_hash_entry
*) h
;
12412 sym_value
= sym
->st_value
;
12413 if (sym_sec
!= NULL
12414 && sym_sec
->output_section
!= NULL
)
12417 else if (hash
->elf
.root
.type
== bfd_link_hash_defined
12418 || hash
->elf
.root
.type
== bfd_link_hash_defweak
)
12420 sym_value
= hash
->elf
.root
.u
.def
.value
;
12421 if (sym_sec
->output_section
!= NULL
)
12424 else if (hash
->elf
.root
.type
== bfd_link_hash_undefweak
12425 || hash
->elf
.root
.type
== bfd_link_hash_undefined
)
12427 /* Recognise an old ABI func code entry sym, and
12428 use the func descriptor sym instead if it is
12430 if (hash
->elf
.root
.root
.string
[0] == '.'
12431 && hash
->oh
!= NULL
)
12433 fdh
= ppc_follow_link (hash
->oh
);
12434 if (fdh
->elf
.root
.type
== bfd_link_hash_defined
12435 || fdh
->elf
.root
.type
== bfd_link_hash_defweak
)
12437 sym_sec
= fdh
->elf
.root
.u
.def
.section
;
12438 sym_value
= fdh
->elf
.root
.u
.def
.value
;
12439 if (sym_sec
->output_section
!= NULL
)
12448 bfd_set_error (bfd_error_bad_value
);
12449 goto error_ret_free_internal
;
12456 sym_value
+= irela
->r_addend
;
12457 destination
= (sym_value
12458 + sym_sec
->output_offset
12459 + sym_sec
->output_section
->vma
);
12460 local_off
= PPC64_LOCAL_ENTRY_OFFSET (hash
12465 code_sec
= sym_sec
;
12466 code_value
= sym_value
;
12467 opd
= get_opd_info (sym_sec
);
12472 if (hash
== NULL
&& opd
->adjust
!= NULL
)
12474 long adjust
= opd
->adjust
[OPD_NDX (sym_value
)];
12477 code_value
+= adjust
;
12478 sym_value
+= adjust
;
12480 dest
= opd_entry_value (sym_sec
, sym_value
,
12481 &code_sec
, &code_value
, FALSE
);
12482 if (dest
!= (bfd_vma
) -1)
12484 destination
= dest
;
12487 /* Fixup old ABI sym to point at code
12489 hash
->elf
.root
.type
= bfd_link_hash_defweak
;
12490 hash
->elf
.root
.u
.def
.section
= code_sec
;
12491 hash
->elf
.root
.u
.def
.value
= code_value
;
12496 /* Determine what (if any) linker stub is needed. */
12498 stub_type
= ppc_type_of_stub (section
, irela
, &hash
,
12499 &plt_ent
, destination
,
12502 if (stub_type
!= ppc_stub_plt_call
)
12504 /* Check whether we need a TOC adjusting stub.
12505 Since the linker pastes together pieces from
12506 different object files when creating the
12507 _init and _fini functions, it may be that a
12508 call to what looks like a local sym is in
12509 fact a call needing a TOC adjustment. */
12510 if (code_sec
!= NULL
12511 && code_sec
->output_section
!= NULL
12512 && (htab
->sec_info
[code_sec
->id
].toc_off
12513 != htab
->sec_info
[section
->id
].toc_off
)
12514 && (code_sec
->has_toc_reloc
12515 || code_sec
->makes_toc_func_call
))
12516 stub_type
= ppc_stub_long_branch_r2off
;
12519 if (stub_type
== ppc_stub_none
)
12522 /* __tls_get_addr calls might be eliminated. */
12523 if (stub_type
!= ppc_stub_plt_call
12525 && (hash
== htab
->tls_get_addr
12526 || hash
== htab
->tls_get_addr_fd
)
12527 && section
->has_tls_reloc
12528 && irela
!= internal_relocs
)
12530 /* Get tls info. */
12531 unsigned char *tls_mask
;
12533 if (!get_tls_mask (&tls_mask
, NULL
, NULL
, &local_syms
,
12534 irela
- 1, input_bfd
))
12535 goto error_ret_free_internal
;
12536 if (*tls_mask
!= 0)
12540 if (stub_type
== ppc_stub_plt_call
12541 && irela
+ 1 < irelaend
12542 && irela
[1].r_offset
== irela
->r_offset
+ 4
12543 && ELF64_R_TYPE (irela
[1].r_info
) == R_PPC64_TOCSAVE
)
12545 if (!tocsave_find (htab
, INSERT
,
12546 &local_syms
, irela
+ 1, input_bfd
))
12547 goto error_ret_free_internal
;
12549 else if (stub_type
== ppc_stub_plt_call
)
12550 stub_type
= ppc_stub_plt_call_r2save
;
12552 /* Support for grouping stub sections. */
12553 id_sec
= htab
->sec_info
[section
->id
].u
.group
->link_sec
;
12555 /* Get the name of this stub. */
12556 stub_name
= ppc_stub_name (id_sec
, sym_sec
, hash
, irela
);
12558 goto error_ret_free_internal
;
12560 stub_entry
= ppc_stub_hash_lookup (&htab
->stub_hash_table
,
12561 stub_name
, FALSE
, FALSE
);
12562 if (stub_entry
!= NULL
)
12564 /* The proper stub has already been created. */
12566 if (stub_type
== ppc_stub_plt_call_r2save
)
12567 stub_entry
->stub_type
= stub_type
;
12571 stub_entry
= ppc_add_stub (stub_name
, section
, info
);
12572 if (stub_entry
== NULL
)
12575 error_ret_free_internal
:
12576 if (elf_section_data (section
)->relocs
== NULL
)
12577 free (internal_relocs
);
12578 error_ret_free_local
:
12579 if (local_syms
!= NULL
12580 && (symtab_hdr
->contents
12581 != (unsigned char *) local_syms
))
12586 stub_entry
->stub_type
= stub_type
;
12587 if (stub_type
!= ppc_stub_plt_call
12588 && stub_type
!= ppc_stub_plt_call_r2save
)
12590 stub_entry
->target_value
= code_value
;
12591 stub_entry
->target_section
= code_sec
;
12595 stub_entry
->target_value
= sym_value
;
12596 stub_entry
->target_section
= sym_sec
;
12598 stub_entry
->h
= hash
;
12599 stub_entry
->plt_ent
= plt_ent
;
12600 stub_entry
->other
= hash
? hash
->elf
.other
: sym
->st_other
;
12602 if (stub_entry
->h
!= NULL
)
12603 htab
->stub_globals
+= 1;
12606 /* We're done with the internal relocs, free them. */
12607 if (elf_section_data (section
)->relocs
!= internal_relocs
)
12608 free (internal_relocs
);
12611 if (local_syms
!= NULL
12612 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
12614 if (!info
->keep_memory
)
12617 symtab_hdr
->contents
= (unsigned char *) local_syms
;
12621 /* We may have added some stubs. Find out the new size of the
12623 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
12625 stub_sec
= stub_sec
->next
)
12626 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0)
12628 if (htab
->stub_iteration
<= STUB_SHRINK_ITER
12629 || stub_sec
->rawsize
< stub_sec
->size
)
12630 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
12631 stub_sec
->rawsize
= stub_sec
->size
;
12632 stub_sec
->size
= 0;
12633 stub_sec
->reloc_count
= 0;
12634 stub_sec
->flags
&= ~SEC_RELOC
;
12637 htab
->brlt
->size
= 0;
12638 htab
->brlt
->reloc_count
= 0;
12639 htab
->brlt
->flags
&= ~SEC_RELOC
;
12640 if (htab
->relbrlt
!= NULL
)
12641 htab
->relbrlt
->size
= 0;
12643 bfd_hash_traverse (&htab
->stub_hash_table
, ppc_size_one_stub
, info
);
12645 for (group
= htab
->group
; group
!= NULL
; group
= group
->next
)
12646 if (group
->needs_save_res
)
12647 group
->stub_sec
->size
+= htab
->sfpr
->size
;
12649 if (info
->emitrelocations
12650 && htab
->glink
!= NULL
&& htab
->glink
->size
!= 0)
12652 htab
->glink
->reloc_count
= 1;
12653 htab
->glink
->flags
|= SEC_RELOC
;
12656 if (htab
->glink_eh_frame
!= NULL
12657 && !bfd_is_abs_section (htab
->glink_eh_frame
->output_section
)
12658 && htab
->glink_eh_frame
->output_section
->size
!= 0)
12660 size_t size
= 0, align
;
12662 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
12664 stub_sec
= stub_sec
->next
)
12665 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0)
12667 if (htab
->glink
!= NULL
&& htab
->glink
->size
!= 0)
12670 size
+= sizeof (glink_eh_frame_cie
);
12672 align
<<= htab
->glink_eh_frame
->output_section
->alignment_power
;
12674 size
= (size
+ align
) & ~align
;
12675 htab
->glink_eh_frame
->rawsize
= htab
->glink_eh_frame
->size
;
12676 htab
->glink_eh_frame
->size
= size
;
12679 if (htab
->params
->plt_stub_align
!= 0)
12680 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
12682 stub_sec
= stub_sec
->next
)
12683 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0)
12684 stub_sec
->size
= ((stub_sec
->size
12685 + (1 << htab
->params
->plt_stub_align
) - 1)
12686 & -(1 << htab
->params
->plt_stub_align
));
12688 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
12690 stub_sec
= stub_sec
->next
)
12691 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0
12692 && stub_sec
->rawsize
!= stub_sec
->size
12693 && (htab
->stub_iteration
<= STUB_SHRINK_ITER
12694 || stub_sec
->rawsize
< stub_sec
->size
))
12697 if (stub_sec
== NULL
12698 && (htab
->glink_eh_frame
== NULL
12699 || htab
->glink_eh_frame
->rawsize
== htab
->glink_eh_frame
->size
))
12702 /* Ask the linker to do its stuff. */
12703 (*htab
->params
->layout_sections_again
) ();
12706 if (htab
->glink_eh_frame
!= NULL
12707 && htab
->glink_eh_frame
->size
!= 0)
12710 bfd_byte
*p
, *last_fde
;
12711 size_t last_fde_len
, size
, align
, pad
;
12712 asection
*stub_sec
;
12714 p
= bfd_zalloc (htab
->glink_eh_frame
->owner
, htab
->glink_eh_frame
->size
);
12717 htab
->glink_eh_frame
->contents
= p
;
12720 memcpy (p
, glink_eh_frame_cie
, sizeof (glink_eh_frame_cie
));
12721 /* CIE length (rewrite in case little-endian). */
12722 last_fde_len
= sizeof (glink_eh_frame_cie
) - 4;
12723 bfd_put_32 (htab
->elf
.dynobj
, last_fde_len
, p
);
12724 p
+= sizeof (glink_eh_frame_cie
);
12726 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
12728 stub_sec
= stub_sec
->next
)
12729 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0)
12734 bfd_put_32 (htab
->elf
.dynobj
, 20, p
);
12737 val
= p
- htab
->glink_eh_frame
->contents
;
12738 bfd_put_32 (htab
->elf
.dynobj
, val
, p
);
12740 /* Offset to stub section, written later. */
12742 /* stub section size. */
12743 bfd_put_32 (htab
->elf
.dynobj
, stub_sec
->size
, p
);
12745 /* Augmentation. */
12750 if (htab
->glink
!= NULL
&& htab
->glink
->size
!= 0)
12755 bfd_put_32 (htab
->elf
.dynobj
, 20, p
);
12758 val
= p
- htab
->glink_eh_frame
->contents
;
12759 bfd_put_32 (htab
->elf
.dynobj
, val
, p
);
12761 /* Offset to .glink, written later. */
12764 bfd_put_32 (htab
->elf
.dynobj
, htab
->glink
->size
- 8, p
);
12766 /* Augmentation. */
12769 *p
++ = DW_CFA_advance_loc
+ 1;
12770 *p
++ = DW_CFA_register
;
12772 *p
++ = htab
->opd_abi
? 12 : 0;
12773 *p
++ = DW_CFA_advance_loc
+ 4;
12774 *p
++ = DW_CFA_restore_extended
;
12777 /* Subsume any padding into the last FDE if user .eh_frame
12778 sections are aligned more than glink_eh_frame. Otherwise any
12779 zero padding will be seen as a terminator. */
12780 size
= p
- htab
->glink_eh_frame
->contents
;
12782 align
<<= htab
->glink_eh_frame
->output_section
->alignment_power
;
12784 pad
= ((size
+ align
) & ~align
) - size
;
12785 htab
->glink_eh_frame
->size
= size
+ pad
;
12786 bfd_put_32 (htab
->elf
.dynobj
, last_fde_len
+ pad
, last_fde
);
12789 maybe_strip_output (info
, htab
->brlt
);
12790 if (htab
->glink_eh_frame
!= NULL
)
12791 maybe_strip_output (info
, htab
->glink_eh_frame
);
12796 /* Called after we have determined section placement. If sections
12797 move, we'll be called again. Provide a value for TOCstart. */
12800 ppc64_elf_set_toc (struct bfd_link_info
*info
, bfd
*obfd
)
12803 bfd_vma TOCstart
, adjust
;
12807 struct elf_link_hash_entry
*h
;
12808 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
12810 if (is_elf_hash_table (htab
)
12811 && htab
->hgot
!= NULL
)
12815 h
= elf_link_hash_lookup (htab
, ".TOC.", FALSE
, FALSE
, TRUE
);
12816 if (is_elf_hash_table (htab
))
12820 && h
->root
.type
== bfd_link_hash_defined
12821 && !h
->root
.linker_def
12822 && (!is_elf_hash_table (htab
)
12823 || h
->def_regular
))
12825 TOCstart
= (h
->root
.u
.def
.value
- TOC_BASE_OFF
12826 + h
->root
.u
.def
.section
->output_offset
12827 + h
->root
.u
.def
.section
->output_section
->vma
);
12828 _bfd_set_gp_value (obfd
, TOCstart
);
12833 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12834 order. The TOC starts where the first of these sections starts. */
12835 s
= bfd_get_section_by_name (obfd
, ".got");
12836 if (s
== NULL
|| (s
->flags
& SEC_EXCLUDE
) != 0)
12837 s
= bfd_get_section_by_name (obfd
, ".toc");
12838 if (s
== NULL
|| (s
->flags
& SEC_EXCLUDE
) != 0)
12839 s
= bfd_get_section_by_name (obfd
, ".tocbss");
12840 if (s
== NULL
|| (s
->flags
& SEC_EXCLUDE
) != 0)
12841 s
= bfd_get_section_by_name (obfd
, ".plt");
12842 if (s
== NULL
|| (s
->flags
& SEC_EXCLUDE
) != 0)
12844 /* This may happen for
12845 o references to TOC base (SYM@toc / TOC[tc0]) without a
12847 o bad linker script
12848 o --gc-sections and empty TOC sections
12850 FIXME: Warn user? */
12852 /* Look for a likely section. We probably won't even be
12854 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
12855 if ((s
->flags
& (SEC_ALLOC
| SEC_SMALL_DATA
| SEC_READONLY
12857 == (SEC_ALLOC
| SEC_SMALL_DATA
))
12860 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
12861 if ((s
->flags
& (SEC_ALLOC
| SEC_SMALL_DATA
| SEC_EXCLUDE
))
12862 == (SEC_ALLOC
| SEC_SMALL_DATA
))
12865 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
12866 if ((s
->flags
& (SEC_ALLOC
| SEC_READONLY
| SEC_EXCLUDE
))
12870 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
12871 if ((s
->flags
& (SEC_ALLOC
| SEC_EXCLUDE
)) == SEC_ALLOC
)
12877 TOCstart
= s
->output_section
->vma
+ s
->output_offset
;
12879 /* Force alignment. */
12880 adjust
= TOCstart
& (TOC_BASE_ALIGN
- 1);
12881 TOCstart
-= adjust
;
12882 _bfd_set_gp_value (obfd
, TOCstart
);
12884 if (info
!= NULL
&& s
!= NULL
)
12886 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
12890 if (htab
->elf
.hgot
!= NULL
)
12892 htab
->elf
.hgot
->root
.u
.def
.value
= TOC_BASE_OFF
- adjust
;
12893 htab
->elf
.hgot
->root
.u
.def
.section
= s
;
12898 struct bfd_link_hash_entry
*bh
= NULL
;
12899 _bfd_generic_link_add_one_symbol (info
, obfd
, ".TOC.", BSF_GLOBAL
,
12900 s
, TOC_BASE_OFF
- adjust
,
12901 NULL
, FALSE
, FALSE
, &bh
);
12907 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12908 write out any global entry stubs. */
12911 build_global_entry_stubs (struct elf_link_hash_entry
*h
, void *inf
)
12913 struct bfd_link_info
*info
;
12914 struct ppc_link_hash_table
*htab
;
12915 struct plt_entry
*pent
;
12918 if (h
->root
.type
== bfd_link_hash_indirect
)
12921 if (!h
->pointer_equality_needed
)
12924 if (h
->def_regular
)
12928 htab
= ppc_hash_table (info
);
12933 for (pent
= h
->plt
.plist
; pent
!= NULL
; pent
= pent
->next
)
12934 if (pent
->plt
.offset
!= (bfd_vma
) -1
12935 && pent
->addend
== 0)
12941 p
= s
->contents
+ h
->root
.u
.def
.value
;
12942 plt
= htab
->elf
.splt
;
12943 if (!htab
->elf
.dynamic_sections_created
12944 || h
->dynindx
== -1)
12945 plt
= htab
->elf
.iplt
;
12946 off
= pent
->plt
.offset
+ plt
->output_offset
+ plt
->output_section
->vma
;
12947 off
-= h
->root
.u
.def
.value
+ s
->output_offset
+ s
->output_section
->vma
;
12949 if (off
+ 0x80008000 > 0xffffffff || (off
& 3) != 0)
12951 info
->callbacks
->einfo
12952 (_("%P: linkage table error against `%T'\n"),
12953 h
->root
.root
.string
);
12954 bfd_set_error (bfd_error_bad_value
);
12955 htab
->stub_error
= TRUE
;
12958 htab
->stub_count
[ppc_stub_global_entry
- 1] += 1;
12959 if (htab
->params
->emit_stub_syms
)
12961 size_t len
= strlen (h
->root
.root
.string
);
12962 char *name
= bfd_malloc (sizeof "12345678.global_entry." + len
);
12967 sprintf (name
, "%08x.global_entry.%s", s
->id
, h
->root
.root
.string
);
12968 h
= elf_link_hash_lookup (&htab
->elf
, name
, TRUE
, FALSE
, FALSE
);
12971 if (h
->root
.type
== bfd_link_hash_new
)
12973 h
->root
.type
= bfd_link_hash_defined
;
12974 h
->root
.u
.def
.section
= s
;
12975 h
->root
.u
.def
.value
= p
- s
->contents
;
12976 h
->ref_regular
= 1;
12977 h
->def_regular
= 1;
12978 h
->ref_regular_nonweak
= 1;
12979 h
->forced_local
= 1;
12981 h
->root
.linker_def
= 1;
12985 if (PPC_HA (off
) != 0)
12987 bfd_put_32 (s
->owner
, ADDIS_R12_R12
| PPC_HA (off
), p
);
12990 bfd_put_32 (s
->owner
, LD_R12_0R12
| PPC_LO (off
), p
);
12992 bfd_put_32 (s
->owner
, MTCTR_R12
, p
);
12994 bfd_put_32 (s
->owner
, BCTR
, p
);
13000 /* Build all the stubs associated with the current output file.
13001 The stubs are kept in a hash table attached to the main linker
13002 hash table. This function is called via gldelf64ppc_finish. */
13005 ppc64_elf_build_stubs (struct bfd_link_info
*info
,
13008 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
13009 struct map_stub
*group
;
13010 asection
*stub_sec
;
13012 int stub_sec_count
= 0;
13017 /* Allocate memory to hold the linker stubs. */
13018 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
13020 stub_sec
= stub_sec
->next
)
13021 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0
13022 && stub_sec
->size
!= 0)
13024 stub_sec
->contents
= bfd_zalloc (htab
->params
->stub_bfd
, stub_sec
->size
);
13025 if (stub_sec
->contents
== NULL
)
13027 stub_sec
->size
= 0;
13030 if (htab
->glink
!= NULL
&& htab
->glink
->size
!= 0)
13035 /* Build the .glink plt call stub. */
13036 if (htab
->params
->emit_stub_syms
)
13038 struct elf_link_hash_entry
*h
;
13039 h
= elf_link_hash_lookup (&htab
->elf
, "__glink_PLTresolve",
13040 TRUE
, FALSE
, FALSE
);
13043 if (h
->root
.type
== bfd_link_hash_new
)
13045 h
->root
.type
= bfd_link_hash_defined
;
13046 h
->root
.u
.def
.section
= htab
->glink
;
13047 h
->root
.u
.def
.value
= 8;
13048 h
->ref_regular
= 1;
13049 h
->def_regular
= 1;
13050 h
->ref_regular_nonweak
= 1;
13051 h
->forced_local
= 1;
13053 h
->root
.linker_def
= 1;
13056 plt0
= (htab
->elf
.splt
->output_section
->vma
13057 + htab
->elf
.splt
->output_offset
13059 if (info
->emitrelocations
)
13061 Elf_Internal_Rela
*r
= get_relocs (htab
->glink
, 1);
13064 r
->r_offset
= (htab
->glink
->output_offset
13065 + htab
->glink
->output_section
->vma
);
13066 r
->r_info
= ELF64_R_INFO (0, R_PPC64_REL64
);
13067 r
->r_addend
= plt0
;
13069 p
= htab
->glink
->contents
;
13070 plt0
-= htab
->glink
->output_section
->vma
+ htab
->glink
->output_offset
;
13071 bfd_put_64 (htab
->glink
->owner
, plt0
, p
);
13075 bfd_put_32 (htab
->glink
->owner
, MFLR_R12
, p
);
13077 bfd_put_32 (htab
->glink
->owner
, BCL_20_31
, p
);
13079 bfd_put_32 (htab
->glink
->owner
, MFLR_R11
, p
);
13081 bfd_put_32 (htab
->glink
->owner
, LD_R2_0R11
| (-16 & 0xfffc), p
);
13083 bfd_put_32 (htab
->glink
->owner
, MTLR_R12
, p
);
13085 bfd_put_32 (htab
->glink
->owner
, ADD_R11_R2_R11
, p
);
13087 bfd_put_32 (htab
->glink
->owner
, LD_R12_0R11
, p
);
13089 bfd_put_32 (htab
->glink
->owner
, LD_R2_0R11
| 8, p
);
13091 bfd_put_32 (htab
->glink
->owner
, MTCTR_R12
, p
);
13093 bfd_put_32 (htab
->glink
->owner
, LD_R11_0R11
| 16, p
);
13098 bfd_put_32 (htab
->glink
->owner
, MFLR_R0
, p
);
13100 bfd_put_32 (htab
->glink
->owner
, BCL_20_31
, p
);
13102 bfd_put_32 (htab
->glink
->owner
, MFLR_R11
, p
);
13104 bfd_put_32 (htab
->glink
->owner
, LD_R2_0R11
| (-16 & 0xfffc), p
);
13106 bfd_put_32 (htab
->glink
->owner
, MTLR_R0
, p
);
13108 bfd_put_32 (htab
->glink
->owner
, SUB_R12_R12_R11
, p
);
13110 bfd_put_32 (htab
->glink
->owner
, ADD_R11_R2_R11
, p
);
13112 bfd_put_32 (htab
->glink
->owner
, ADDI_R0_R12
| (-48 & 0xffff), p
);
13114 bfd_put_32 (htab
->glink
->owner
, LD_R12_0R11
, p
);
13116 bfd_put_32 (htab
->glink
->owner
, SRDI_R0_R0_2
, p
);
13118 bfd_put_32 (htab
->glink
->owner
, MTCTR_R12
, p
);
13120 bfd_put_32 (htab
->glink
->owner
, LD_R11_0R11
| 8, p
);
13123 bfd_put_32 (htab
->glink
->owner
, BCTR
, p
);
13125 while (p
- htab
->glink
->contents
< GLINK_CALL_STUB_SIZE
)
13127 bfd_put_32 (htab
->glink
->owner
, NOP
, p
);
13131 /* Build the .glink lazy link call stubs. */
13133 while (p
< htab
->glink
->contents
+ htab
->glink
->rawsize
)
13139 bfd_put_32 (htab
->glink
->owner
, LI_R0_0
| indx
, p
);
13144 bfd_put_32 (htab
->glink
->owner
, LIS_R0_0
| PPC_HI (indx
), p
);
13146 bfd_put_32 (htab
->glink
->owner
, ORI_R0_R0_0
| PPC_LO (indx
),
13151 bfd_put_32 (htab
->glink
->owner
,
13152 B_DOT
| ((htab
->glink
->contents
- p
+ 8) & 0x3fffffc), p
);
13157 /* Build .glink global entry stubs. */
13158 if (htab
->glink
->size
> htab
->glink
->rawsize
)
13159 elf_link_hash_traverse (&htab
->elf
, build_global_entry_stubs
, info
);
13162 if (htab
->brlt
!= NULL
&& htab
->brlt
->size
!= 0)
13164 htab
->brlt
->contents
= bfd_zalloc (htab
->brlt
->owner
,
13166 if (htab
->brlt
->contents
== NULL
)
13169 if (htab
->relbrlt
!= NULL
&& htab
->relbrlt
->size
!= 0)
13171 htab
->relbrlt
->contents
= bfd_zalloc (htab
->relbrlt
->owner
,
13172 htab
->relbrlt
->size
);
13173 if (htab
->relbrlt
->contents
== NULL
)
13177 /* Build the stubs as directed by the stub hash table. */
13178 bfd_hash_traverse (&htab
->stub_hash_table
, ppc_build_one_stub
, info
);
13180 for (group
= htab
->group
; group
!= NULL
; group
= group
->next
)
13181 if (group
->needs_save_res
)
13183 stub_sec
= group
->stub_sec
;
13184 memcpy (stub_sec
->contents
+ stub_sec
->size
, htab
->sfpr
->contents
,
13186 if (htab
->params
->emit_stub_syms
)
13190 for (i
= 0; i
< ARRAY_SIZE (save_res_funcs
); i
++)
13191 if (!sfpr_define (info
, &save_res_funcs
[i
], stub_sec
))
13194 stub_sec
->size
+= htab
->sfpr
->size
;
13197 if (htab
->relbrlt
!= NULL
)
13198 htab
->relbrlt
->reloc_count
= 0;
13200 if (htab
->params
->plt_stub_align
!= 0)
13201 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
13203 stub_sec
= stub_sec
->next
)
13204 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0)
13205 stub_sec
->size
= ((stub_sec
->size
13206 + (1 << htab
->params
->plt_stub_align
) - 1)
13207 & -(1 << htab
->params
->plt_stub_align
));
13209 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
13211 stub_sec
= stub_sec
->next
)
13212 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0)
13214 stub_sec_count
+= 1;
13215 if (stub_sec
->rawsize
!= stub_sec
->size
13216 && (htab
->stub_iteration
<= STUB_SHRINK_ITER
13217 || stub_sec
->rawsize
< stub_sec
->size
))
13221 /* Note that the glink_eh_frame check here is not only testing that
13222 the generated size matched the calculated size but also that
13223 bfd_elf_discard_info didn't make any changes to the section. */
13224 if (stub_sec
!= NULL
13225 || (htab
->glink_eh_frame
!= NULL
13226 && htab
->glink_eh_frame
->rawsize
!= htab
->glink_eh_frame
->size
))
13228 htab
->stub_error
= TRUE
;
13229 info
->callbacks
->einfo (_("%P: stubs don't match calculated size\n"));
13232 if (htab
->stub_error
)
13237 *stats
= bfd_malloc (500);
13238 if (*stats
== NULL
)
13241 sprintf (*stats
, _("linker stubs in %u group%s\n"
13243 " toc adjust %lu\n"
13244 " long branch %lu\n"
13245 " long toc adj %lu\n"
13247 " plt call toc %lu\n"
13248 " global entry %lu"),
13250 stub_sec_count
== 1 ? "" : "s",
13251 htab
->stub_count
[ppc_stub_long_branch
- 1],
13252 htab
->stub_count
[ppc_stub_long_branch_r2off
- 1],
13253 htab
->stub_count
[ppc_stub_plt_branch
- 1],
13254 htab
->stub_count
[ppc_stub_plt_branch_r2off
- 1],
13255 htab
->stub_count
[ppc_stub_plt_call
- 1],
13256 htab
->stub_count
[ppc_stub_plt_call_r2save
- 1],
13257 htab
->stub_count
[ppc_stub_global_entry
- 1]);
13262 /* What to do when ld finds relocations against symbols defined in
13263 discarded sections. */
13265 static unsigned int
13266 ppc64_elf_action_discarded (asection
*sec
)
13268 if (strcmp (".opd", sec
->name
) == 0)
13271 if (strcmp (".toc", sec
->name
) == 0)
13274 if (strcmp (".toc1", sec
->name
) == 0)
13277 return _bfd_elf_default_action_discarded (sec
);
13280 /* The RELOCATE_SECTION function is called by the ELF backend linker
13281 to handle the relocations for a section.
13283 The relocs are always passed as Rela structures; if the section
13284 actually uses Rel structures, the r_addend field will always be
13287 This function is responsible for adjust the section contents as
13288 necessary, and (if using Rela relocs and generating a
13289 relocatable output file) adjusting the reloc addend as
13292 This function does not have to worry about setting the reloc
13293 address or the reloc symbol index.
13295 LOCAL_SYMS is a pointer to the swapped in local symbols.
13297 LOCAL_SECTIONS is an array giving the section in the input file
13298 corresponding to the st_shndx field of each local symbol.
13300 The global hash table entry for the global symbols can be found
13301 via elf_sym_hashes (input_bfd).
13303 When generating relocatable output, this function must handle
13304 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13305 going to be the section symbol corresponding to the output
13306 section, which means that the addend must be adjusted
13310 ppc64_elf_relocate_section (bfd
*output_bfd
,
13311 struct bfd_link_info
*info
,
13313 asection
*input_section
,
13314 bfd_byte
*contents
,
13315 Elf_Internal_Rela
*relocs
,
13316 Elf_Internal_Sym
*local_syms
,
13317 asection
**local_sections
)
13319 struct ppc_link_hash_table
*htab
;
13320 Elf_Internal_Shdr
*symtab_hdr
;
13321 struct elf_link_hash_entry
**sym_hashes
;
13322 Elf_Internal_Rela
*rel
;
13323 Elf_Internal_Rela
*wrel
;
13324 Elf_Internal_Rela
*relend
;
13325 Elf_Internal_Rela outrel
;
13327 struct got_entry
**local_got_ents
;
13329 bfd_boolean ret
= TRUE
;
13330 bfd_boolean is_opd
;
13331 /* Assume 'at' branch hints. */
13332 bfd_boolean is_isa_v2
= TRUE
;
13333 bfd_vma d_offset
= (bfd_big_endian (input_bfd
) ? 2 : 0);
13335 /* Initialize howto table if needed. */
13336 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
13339 htab
= ppc_hash_table (info
);
13343 /* Don't relocate stub sections. */
13344 if (input_section
->owner
== htab
->params
->stub_bfd
)
13347 BFD_ASSERT (is_ppc64_elf (input_bfd
));
13349 local_got_ents
= elf_local_got_ents (input_bfd
);
13350 TOCstart
= elf_gp (output_bfd
);
13351 symtab_hdr
= &elf_symtab_hdr (input_bfd
);
13352 sym_hashes
= elf_sym_hashes (input_bfd
);
13353 is_opd
= ppc64_elf_section_data (input_section
)->sec_type
== sec_opd
;
13355 rel
= wrel
= relocs
;
13356 relend
= relocs
+ input_section
->reloc_count
;
13357 for (; rel
< relend
; wrel
++, rel
++)
13359 enum elf_ppc64_reloc_type r_type
;
13361 bfd_reloc_status_type r
;
13362 Elf_Internal_Sym
*sym
;
13364 struct elf_link_hash_entry
*h_elf
;
13365 struct ppc_link_hash_entry
*h
;
13366 struct ppc_link_hash_entry
*fdh
;
13367 const char *sym_name
;
13368 unsigned long r_symndx
, toc_symndx
;
13369 bfd_vma toc_addend
;
13370 unsigned char tls_mask
, tls_gd
, tls_type
;
13371 unsigned char sym_type
;
13372 bfd_vma relocation
;
13373 bfd_boolean unresolved_reloc
;
13374 bfd_boolean warned
;
13375 enum { DEST_NORMAL
, DEST_OPD
, DEST_STUB
} reloc_dest
;
13378 struct ppc_stub_hash_entry
*stub_entry
;
13379 bfd_vma max_br_offset
;
13381 Elf_Internal_Rela orig_rel
;
13382 reloc_howto_type
*howto
;
13383 struct reloc_howto_struct alt_howto
;
13388 r_type
= ELF64_R_TYPE (rel
->r_info
);
13389 r_symndx
= ELF64_R_SYM (rel
->r_info
);
13391 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13392 symbol of the previous ADDR64 reloc. The symbol gives us the
13393 proper TOC base to use. */
13394 if (rel
->r_info
== ELF64_R_INFO (0, R_PPC64_TOC
)
13396 && ELF64_R_TYPE (wrel
[-1].r_info
) == R_PPC64_ADDR64
13398 r_symndx
= ELF64_R_SYM (wrel
[-1].r_info
);
13404 unresolved_reloc
= FALSE
;
13407 if (r_symndx
< symtab_hdr
->sh_info
)
13409 /* It's a local symbol. */
13410 struct _opd_sec_data
*opd
;
13412 sym
= local_syms
+ r_symndx
;
13413 sec
= local_sections
[r_symndx
];
13414 sym_name
= bfd_elf_sym_name (input_bfd
, symtab_hdr
, sym
, sec
);
13415 sym_type
= ELF64_ST_TYPE (sym
->st_info
);
13416 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
13417 opd
= get_opd_info (sec
);
13418 if (opd
!= NULL
&& opd
->adjust
!= NULL
)
13420 long adjust
= opd
->adjust
[OPD_NDX (sym
->st_value
13426 /* If this is a relocation against the opd section sym
13427 and we have edited .opd, adjust the reloc addend so
13428 that ld -r and ld --emit-relocs output is correct.
13429 If it is a reloc against some other .opd symbol,
13430 then the symbol value will be adjusted later. */
13431 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
13432 rel
->r_addend
+= adjust
;
13434 relocation
+= adjust
;
13440 bfd_boolean ignored
;
13442 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
13443 r_symndx
, symtab_hdr
, sym_hashes
,
13444 h_elf
, sec
, relocation
,
13445 unresolved_reloc
, warned
, ignored
);
13446 sym_name
= h_elf
->root
.root
.string
;
13447 sym_type
= h_elf
->type
;
13449 && sec
->owner
== output_bfd
13450 && strcmp (sec
->name
, ".opd") == 0)
13452 /* This is a symbol defined in a linker script. All
13453 such are defined in output sections, even those
13454 defined by simple assignment from a symbol defined in
13455 an input section. Transfer the symbol to an
13456 appropriate input .opd section, so that a branch to
13457 this symbol will be mapped to the location specified
13458 by the opd entry. */
13459 struct bfd_link_order
*lo
;
13460 for (lo
= sec
->map_head
.link_order
; lo
!= NULL
; lo
= lo
->next
)
13461 if (lo
->type
== bfd_indirect_link_order
)
13463 asection
*isec
= lo
->u
.indirect
.section
;
13464 if (h_elf
->root
.u
.def
.value
>= isec
->output_offset
13465 && h_elf
->root
.u
.def
.value
< (isec
->output_offset
13468 h_elf
->root
.u
.def
.value
-= isec
->output_offset
;
13469 h_elf
->root
.u
.def
.section
= isec
;
13476 h
= (struct ppc_link_hash_entry
*) h_elf
;
13478 if (sec
!= NULL
&& discarded_section (sec
))
13480 _bfd_clear_contents (ppc64_elf_howto_table
[r_type
],
13481 input_bfd
, input_section
,
13482 contents
+ rel
->r_offset
);
13483 wrel
->r_offset
= rel
->r_offset
;
13485 wrel
->r_addend
= 0;
13487 /* For ld -r, remove relocations in debug sections against
13488 sections defined in discarded sections. Not done for
13489 non-debug to preserve relocs in .eh_frame which the
13490 eh_frame editing code expects to be present. */
13491 if (bfd_link_relocatable (info
)
13492 && (input_section
->flags
& SEC_DEBUGGING
))
13498 if (bfd_link_relocatable (info
))
13501 if (h
!= NULL
&& &h
->elf
== htab
->elf
.hgot
)
13503 relocation
= TOCstart
+ htab
->sec_info
[input_section
->id
].toc_off
;
13504 sec
= bfd_abs_section_ptr
;
13505 unresolved_reloc
= FALSE
;
13508 /* TLS optimizations. Replace instruction sequences and relocs
13509 based on information we collected in tls_optimize. We edit
13510 RELOCS so that --emit-relocs will output something sensible
13511 for the final instruction stream. */
13516 tls_mask
= h
->tls_mask
;
13517 else if (local_got_ents
!= NULL
)
13519 struct plt_entry
**local_plt
= (struct plt_entry
**)
13520 (local_got_ents
+ symtab_hdr
->sh_info
);
13521 unsigned char *lgot_masks
= (unsigned char *)
13522 (local_plt
+ symtab_hdr
->sh_info
);
13523 tls_mask
= lgot_masks
[r_symndx
];
13526 && (r_type
== R_PPC64_TLS
13527 || r_type
== R_PPC64_TLSGD
13528 || r_type
== R_PPC64_TLSLD
))
13530 /* Check for toc tls entries. */
13531 unsigned char *toc_tls
;
13533 if (!get_tls_mask (&toc_tls
, &toc_symndx
, &toc_addend
,
13534 &local_syms
, rel
, input_bfd
))
13538 tls_mask
= *toc_tls
;
13541 /* Check that tls relocs are used with tls syms, and non-tls
13542 relocs are used with non-tls syms. */
13543 if (r_symndx
!= STN_UNDEF
13544 && r_type
!= R_PPC64_NONE
13546 || h
->elf
.root
.type
== bfd_link_hash_defined
13547 || h
->elf
.root
.type
== bfd_link_hash_defweak
)
13548 && (IS_PPC64_TLS_RELOC (r_type
)
13549 != (sym_type
== STT_TLS
13550 || (sym_type
== STT_SECTION
13551 && (sec
->flags
& SEC_THREAD_LOCAL
) != 0))))
13554 && (r_type
== R_PPC64_TLS
13555 || r_type
== R_PPC64_TLSGD
13556 || r_type
== R_PPC64_TLSLD
))
13557 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13560 info
->callbacks
->einfo
13561 (!IS_PPC64_TLS_RELOC (r_type
)
13562 /* xgettext:c-format */
13563 ? _("%P: %H: %s used with TLS symbol `%T'\n")
13564 /* xgettext:c-format */
13565 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
13566 input_bfd
, input_section
, rel
->r_offset
,
13567 ppc64_elf_howto_table
[r_type
]->name
,
13571 /* Ensure reloc mapping code below stays sane. */
13572 if (R_PPC64_TOC16_LO_DS
!= R_PPC64_TOC16_DS
+ 1
13573 || R_PPC64_TOC16_LO
!= R_PPC64_TOC16
+ 1
13574 || (R_PPC64_GOT_TLSLD16
& 3) != (R_PPC64_GOT_TLSGD16
& 3)
13575 || (R_PPC64_GOT_TLSLD16_LO
& 3) != (R_PPC64_GOT_TLSGD16_LO
& 3)
13576 || (R_PPC64_GOT_TLSLD16_HI
& 3) != (R_PPC64_GOT_TLSGD16_HI
& 3)
13577 || (R_PPC64_GOT_TLSLD16_HA
& 3) != (R_PPC64_GOT_TLSGD16_HA
& 3)
13578 || (R_PPC64_GOT_TLSLD16
& 3) != (R_PPC64_GOT_TPREL16_DS
& 3)
13579 || (R_PPC64_GOT_TLSLD16_LO
& 3) != (R_PPC64_GOT_TPREL16_LO_DS
& 3)
13580 || (R_PPC64_GOT_TLSLD16_HI
& 3) != (R_PPC64_GOT_TPREL16_HI
& 3)
13581 || (R_PPC64_GOT_TLSLD16_HA
& 3) != (R_PPC64_GOT_TPREL16_HA
& 3))
13589 case R_PPC64_LO_DS_OPT
:
13590 insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
- d_offset
);
13591 if ((insn
& (0x3f << 26)) != 58u << 26)
13593 insn
+= (14u << 26) - (58u << 26);
13594 bfd_put_32 (input_bfd
, insn
, contents
+ rel
->r_offset
- d_offset
);
13595 r_type
= R_PPC64_TOC16_LO
;
13596 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13599 case R_PPC64_TOC16
:
13600 case R_PPC64_TOC16_LO
:
13601 case R_PPC64_TOC16_DS
:
13602 case R_PPC64_TOC16_LO_DS
:
13604 /* Check for toc tls entries. */
13605 unsigned char *toc_tls
;
13608 retval
= get_tls_mask (&toc_tls
, &toc_symndx
, &toc_addend
,
13609 &local_syms
, rel
, input_bfd
);
13615 tls_mask
= *toc_tls
;
13616 if (r_type
== R_PPC64_TOC16_DS
13617 || r_type
== R_PPC64_TOC16_LO_DS
)
13620 && (tls_mask
& (TLS_DTPREL
| TLS_TPREL
)) == 0)
13625 /* If we found a GD reloc pair, then we might be
13626 doing a GD->IE transition. */
13629 tls_gd
= TLS_TPRELGD
;
13630 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
13633 else if (retval
== 3)
13635 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
13643 case R_PPC64_GOT_TPREL16_HI
:
13644 case R_PPC64_GOT_TPREL16_HA
:
13646 && (tls_mask
& TLS_TPREL
) == 0)
13648 rel
->r_offset
-= d_offset
;
13649 bfd_put_32 (input_bfd
, NOP
, contents
+ rel
->r_offset
);
13650 r_type
= R_PPC64_NONE
;
13651 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13655 case R_PPC64_GOT_TPREL16_DS
:
13656 case R_PPC64_GOT_TPREL16_LO_DS
:
13658 && (tls_mask
& TLS_TPREL
) == 0)
13661 insn
= bfd_get_32 (input_bfd
,
13662 contents
+ rel
->r_offset
- d_offset
);
13664 insn
|= 0x3c0d0000; /* addis 0,13,0 */
13665 bfd_put_32 (input_bfd
, insn
,
13666 contents
+ rel
->r_offset
- d_offset
);
13667 r_type
= R_PPC64_TPREL16_HA
;
13668 if (toc_symndx
!= 0)
13670 rel
->r_info
= ELF64_R_INFO (toc_symndx
, r_type
);
13671 rel
->r_addend
= toc_addend
;
13672 /* We changed the symbol. Start over in order to
13673 get h, sym, sec etc. right. */
13677 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13683 && (tls_mask
& TLS_TPREL
) == 0)
13685 insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
13686 insn
= _bfd_elf_ppc_at_tls_transform (insn
, 13);
13689 bfd_put_32 (input_bfd
, insn
, contents
+ rel
->r_offset
);
13690 /* Was PPC64_TLS which sits on insn boundary, now
13691 PPC64_TPREL16_LO which is at low-order half-word. */
13692 rel
->r_offset
+= d_offset
;
13693 r_type
= R_PPC64_TPREL16_LO
;
13694 if (toc_symndx
!= 0)
13696 rel
->r_info
= ELF64_R_INFO (toc_symndx
, r_type
);
13697 rel
->r_addend
= toc_addend
;
13698 /* We changed the symbol. Start over in order to
13699 get h, sym, sec etc. right. */
13703 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13707 case R_PPC64_GOT_TLSGD16_HI
:
13708 case R_PPC64_GOT_TLSGD16_HA
:
13709 tls_gd
= TLS_TPRELGD
;
13710 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
13714 case R_PPC64_GOT_TLSLD16_HI
:
13715 case R_PPC64_GOT_TLSLD16_HA
:
13716 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
13719 if ((tls_mask
& tls_gd
) != 0)
13720 r_type
= (((r_type
- (R_PPC64_GOT_TLSGD16
& 3)) & 3)
13721 + R_PPC64_GOT_TPREL16_DS
);
13724 rel
->r_offset
-= d_offset
;
13725 bfd_put_32 (input_bfd
, NOP
, contents
+ rel
->r_offset
);
13726 r_type
= R_PPC64_NONE
;
13728 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13732 case R_PPC64_GOT_TLSGD16
:
13733 case R_PPC64_GOT_TLSGD16_LO
:
13734 tls_gd
= TLS_TPRELGD
;
13735 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
13739 case R_PPC64_GOT_TLSLD16
:
13740 case R_PPC64_GOT_TLSLD16_LO
:
13741 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
13743 unsigned int insn1
, insn2
, insn3
;
13747 offset
= (bfd_vma
) -1;
13748 /* If not using the newer R_PPC64_TLSGD/LD to mark
13749 __tls_get_addr calls, we must trust that the call
13750 stays with its arg setup insns, ie. that the next
13751 reloc is the __tls_get_addr call associated with
13752 the current reloc. Edit both insns. */
13753 if (input_section
->has_tls_get_addr_call
13754 && rel
+ 1 < relend
13755 && branch_reloc_hash_match (input_bfd
, rel
+ 1,
13756 htab
->tls_get_addr
,
13757 htab
->tls_get_addr_fd
))
13758 offset
= rel
[1].r_offset
;
13759 /* We read the low GOT_TLS (or TOC16) insn because we
13760 need to keep the destination reg. It may be
13761 something other than the usual r3, and moved to r3
13762 before the call by intervening code. */
13763 insn1
= bfd_get_32 (input_bfd
,
13764 contents
+ rel
->r_offset
- d_offset
);
13765 if ((tls_mask
& tls_gd
) != 0)
13768 insn1
&= (0x1f << 21) | (0x1f << 16);
13769 insn1
|= 58 << 26; /* ld */
13770 insn2
= 0x7c636a14; /* add 3,3,13 */
13771 if (offset
!= (bfd_vma
) -1)
13772 rel
[1].r_info
= ELF64_R_INFO (STN_UNDEF
, R_PPC64_NONE
);
13773 if ((tls_mask
& TLS_EXPLICIT
) == 0)
13774 r_type
= (((r_type
- (R_PPC64_GOT_TLSGD16
& 3)) & 3)
13775 + R_PPC64_GOT_TPREL16_DS
);
13777 r_type
+= R_PPC64_TOC16_DS
- R_PPC64_TOC16
;
13778 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13783 insn1
&= 0x1f << 21;
13784 insn1
|= 0x3c0d0000; /* addis r,13,0 */
13785 insn2
= 0x38630000; /* addi 3,3,0 */
13788 /* Was an LD reloc. */
13790 sec
= local_sections
[toc_symndx
];
13792 r_symndx
< symtab_hdr
->sh_info
;
13794 if (local_sections
[r_symndx
] == sec
)
13796 if (r_symndx
>= symtab_hdr
->sh_info
)
13797 r_symndx
= STN_UNDEF
;
13798 rel
->r_addend
= htab
->elf
.tls_sec
->vma
+ DTP_OFFSET
;
13799 if (r_symndx
!= STN_UNDEF
)
13800 rel
->r_addend
-= (local_syms
[r_symndx
].st_value
13801 + sec
->output_offset
13802 + sec
->output_section
->vma
);
13804 else if (toc_symndx
!= 0)
13806 r_symndx
= toc_symndx
;
13807 rel
->r_addend
= toc_addend
;
13809 r_type
= R_PPC64_TPREL16_HA
;
13810 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13811 if (offset
!= (bfd_vma
) -1)
13813 rel
[1].r_info
= ELF64_R_INFO (r_symndx
,
13814 R_PPC64_TPREL16_LO
);
13815 rel
[1].r_offset
= offset
+ d_offset
;
13816 rel
[1].r_addend
= rel
->r_addend
;
13819 bfd_put_32 (input_bfd
, insn1
,
13820 contents
+ rel
->r_offset
- d_offset
);
13821 if (offset
!= (bfd_vma
) -1)
13823 insn3
= bfd_get_32 (input_bfd
,
13824 contents
+ offset
+ 4);
13826 || insn3
== CROR_151515
|| insn3
== CROR_313131
)
13828 rel
[1].r_offset
+= 4;
13829 bfd_put_32 (input_bfd
, insn2
, contents
+ offset
+ 4);
13832 bfd_put_32 (input_bfd
, insn2
, contents
+ offset
);
13834 if ((tls_mask
& tls_gd
) == 0
13835 && (tls_gd
== 0 || toc_symndx
!= 0))
13837 /* We changed the symbol. Start over in order
13838 to get h, sym, sec etc. right. */
13844 case R_PPC64_TLSGD
:
13845 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
13847 unsigned int insn2
, insn3
;
13848 bfd_vma offset
= rel
->r_offset
;
13850 if ((tls_mask
& TLS_TPRELGD
) != 0)
13853 r_type
= R_PPC64_NONE
;
13854 insn2
= 0x7c636a14; /* add 3,3,13 */
13859 if (toc_symndx
!= 0)
13861 r_symndx
= toc_symndx
;
13862 rel
->r_addend
= toc_addend
;
13864 r_type
= R_PPC64_TPREL16_LO
;
13865 rel
->r_offset
= offset
+ d_offset
;
13866 insn2
= 0x38630000; /* addi 3,3,0 */
13868 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13869 /* Zap the reloc on the _tls_get_addr call too. */
13870 BFD_ASSERT (offset
== rel
[1].r_offset
);
13871 rel
[1].r_info
= ELF64_R_INFO (STN_UNDEF
, R_PPC64_NONE
);
13872 insn3
= bfd_get_32 (input_bfd
,
13873 contents
+ offset
+ 4);
13875 || insn3
== CROR_151515
|| insn3
== CROR_313131
)
13877 rel
->r_offset
+= 4;
13878 bfd_put_32 (input_bfd
, insn2
, contents
+ offset
+ 4);
13881 bfd_put_32 (input_bfd
, insn2
, contents
+ offset
);
13882 if ((tls_mask
& TLS_TPRELGD
) == 0 && toc_symndx
!= 0)
13887 case R_PPC64_TLSLD
:
13888 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
13890 unsigned int insn2
, insn3
;
13891 bfd_vma offset
= rel
->r_offset
;
13894 sec
= local_sections
[toc_symndx
];
13896 r_symndx
< symtab_hdr
->sh_info
;
13898 if (local_sections
[r_symndx
] == sec
)
13900 if (r_symndx
>= symtab_hdr
->sh_info
)
13901 r_symndx
= STN_UNDEF
;
13902 rel
->r_addend
= htab
->elf
.tls_sec
->vma
+ DTP_OFFSET
;
13903 if (r_symndx
!= STN_UNDEF
)
13904 rel
->r_addend
-= (local_syms
[r_symndx
].st_value
13905 + sec
->output_offset
13906 + sec
->output_section
->vma
);
13908 r_type
= R_PPC64_TPREL16_LO
;
13909 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13910 rel
->r_offset
= offset
+ d_offset
;
13911 /* Zap the reloc on the _tls_get_addr call too. */
13912 BFD_ASSERT (offset
== rel
[1].r_offset
);
13913 rel
[1].r_info
= ELF64_R_INFO (STN_UNDEF
, R_PPC64_NONE
);
13914 insn2
= 0x38630000; /* addi 3,3,0 */
13915 insn3
= bfd_get_32 (input_bfd
,
13916 contents
+ offset
+ 4);
13918 || insn3
== CROR_151515
|| insn3
== CROR_313131
)
13920 rel
->r_offset
+= 4;
13921 bfd_put_32 (input_bfd
, insn2
, contents
+ offset
+ 4);
13924 bfd_put_32 (input_bfd
, insn2
, contents
+ offset
);
13929 case R_PPC64_DTPMOD64
:
13930 if (rel
+ 1 < relend
13931 && rel
[1].r_info
== ELF64_R_INFO (r_symndx
, R_PPC64_DTPREL64
)
13932 && rel
[1].r_offset
== rel
->r_offset
+ 8)
13934 if ((tls_mask
& TLS_GD
) == 0)
13936 rel
[1].r_info
= ELF64_R_INFO (r_symndx
, R_PPC64_NONE
);
13937 if ((tls_mask
& TLS_TPRELGD
) != 0)
13938 r_type
= R_PPC64_TPREL64
;
13941 bfd_put_64 (output_bfd
, 1, contents
+ rel
->r_offset
);
13942 r_type
= R_PPC64_NONE
;
13944 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13949 if ((tls_mask
& TLS_LD
) == 0)
13951 bfd_put_64 (output_bfd
, 1, contents
+ rel
->r_offset
);
13952 r_type
= R_PPC64_NONE
;
13953 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13958 case R_PPC64_TPREL64
:
13959 if ((tls_mask
& TLS_TPREL
) == 0)
13961 r_type
= R_PPC64_NONE
;
13962 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
13966 case R_PPC64_ENTRY
:
13967 relocation
= TOCstart
+ htab
->sec_info
[input_section
->id
].toc_off
;
13968 if (!bfd_link_pic (info
)
13969 && !info
->traditional_format
13970 && relocation
+ 0x80008000 <= 0xffffffff)
13972 unsigned int insn1
, insn2
;
13974 insn1
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
13975 insn2
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
+ 4);
13976 if ((insn1
& ~0xfffc) == LD_R2_0R12
13977 && insn2
== ADD_R2_R2_R12
)
13979 bfd_put_32 (input_bfd
,
13980 LIS_R2
+ PPC_HA (relocation
),
13981 contents
+ rel
->r_offset
);
13982 bfd_put_32 (input_bfd
,
13983 ADDI_R2_R2
+ PPC_LO (relocation
),
13984 contents
+ rel
->r_offset
+ 4);
13989 relocation
-= (rel
->r_offset
13990 + input_section
->output_offset
13991 + input_section
->output_section
->vma
);
13992 if (relocation
+ 0x80008000 <= 0xffffffff)
13994 unsigned int insn1
, insn2
;
13996 insn1
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
13997 insn2
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
+ 4);
13998 if ((insn1
& ~0xfffc) == LD_R2_0R12
13999 && insn2
== ADD_R2_R2_R12
)
14001 bfd_put_32 (input_bfd
,
14002 ADDIS_R2_R12
+ PPC_HA (relocation
),
14003 contents
+ rel
->r_offset
);
14004 bfd_put_32 (input_bfd
,
14005 ADDI_R2_R2
+ PPC_LO (relocation
),
14006 contents
+ rel
->r_offset
+ 4);
14012 case R_PPC64_REL16_HA
:
14013 /* If we are generating a non-PIC executable, edit
14014 . 0: addis 2,12,.TOC.-0b@ha
14015 . addi 2,2,.TOC.-0b@l
14016 used by ELFv2 global entry points to set up r2, to
14019 if .TOC. is in range. */
14020 if (!bfd_link_pic (info
)
14021 && !info
->traditional_format
14023 && rel
->r_addend
== d_offset
14024 && h
!= NULL
&& &h
->elf
== htab
->elf
.hgot
14025 && rel
+ 1 < relend
14026 && rel
[1].r_info
== ELF64_R_INFO (r_symndx
, R_PPC64_REL16_LO
)
14027 && rel
[1].r_offset
== rel
->r_offset
+ 4
14028 && rel
[1].r_addend
== rel
->r_addend
+ 4
14029 && relocation
+ 0x80008000 <= 0xffffffff)
14031 unsigned int insn1
, insn2
;
14032 bfd_vma offset
= rel
->r_offset
- d_offset
;
14033 insn1
= bfd_get_32 (input_bfd
, contents
+ offset
);
14034 insn2
= bfd_get_32 (input_bfd
, contents
+ offset
+ 4);
14035 if ((insn1
& 0xffff0000) == ADDIS_R2_R12
14036 && (insn2
& 0xffff0000) == ADDI_R2_R2
)
14038 r_type
= R_PPC64_ADDR16_HA
;
14039 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
14040 rel
->r_addend
-= d_offset
;
14041 rel
[1].r_info
= ELF64_R_INFO (r_symndx
, R_PPC64_ADDR16_LO
);
14042 rel
[1].r_addend
-= d_offset
+ 4;
14043 bfd_put_32 (input_bfd
, LIS_R2
, contents
+ offset
);
14049 /* Handle other relocations that tweak non-addend part of insn. */
14051 max_br_offset
= 1 << 25;
14052 addend
= rel
->r_addend
;
14053 reloc_dest
= DEST_NORMAL
;
14059 case R_PPC64_TOCSAVE
:
14060 if (relocation
+ addend
== (rel
->r_offset
14061 + input_section
->output_offset
14062 + input_section
->output_section
->vma
)
14063 && tocsave_find (htab
, NO_INSERT
,
14064 &local_syms
, rel
, input_bfd
))
14066 insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
14068 || insn
== CROR_151515
|| insn
== CROR_313131
)
14069 bfd_put_32 (input_bfd
,
14070 STD_R2_0R1
+ STK_TOC (htab
),
14071 contents
+ rel
->r_offset
);
14075 /* Branch taken prediction relocations. */
14076 case R_PPC64_ADDR14_BRTAKEN
:
14077 case R_PPC64_REL14_BRTAKEN
:
14078 insn
= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
14079 /* Fall through. */
14081 /* Branch not taken prediction relocations. */
14082 case R_PPC64_ADDR14_BRNTAKEN
:
14083 case R_PPC64_REL14_BRNTAKEN
:
14084 insn
|= bfd_get_32 (input_bfd
,
14085 contents
+ rel
->r_offset
) & ~(0x01 << 21);
14086 /* Fall through. */
14088 case R_PPC64_REL14
:
14089 max_br_offset
= 1 << 15;
14090 /* Fall through. */
14092 case R_PPC64_REL24
:
14093 /* Calls to functions with a different TOC, such as calls to
14094 shared objects, need to alter the TOC pointer. This is
14095 done using a linkage stub. A REL24 branching to these
14096 linkage stubs needs to be followed by a nop, as the nop
14097 will be replaced with an instruction to restore the TOC
14102 && h
->oh
->is_func_descriptor
)
14103 fdh
= ppc_follow_link (h
->oh
);
14104 stub_entry
= ppc_get_stub_entry (input_section
, sec
, fdh
, &orig_rel
,
14106 if (stub_entry
!= NULL
14107 && (stub_entry
->stub_type
== ppc_stub_plt_call
14108 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
14109 || stub_entry
->stub_type
== ppc_stub_plt_branch_r2off
14110 || stub_entry
->stub_type
== ppc_stub_long_branch_r2off
))
14112 bfd_boolean can_plt_call
= FALSE
;
14114 /* All of these stubs will modify r2, so there must be a
14115 branch and link followed by a nop. The nop is
14116 replaced by an insn to restore r2. */
14117 if (rel
->r_offset
+ 8 <= input_section
->size
)
14121 br
= bfd_get_32 (input_bfd
,
14122 contents
+ rel
->r_offset
);
14127 nop
= bfd_get_32 (input_bfd
,
14128 contents
+ rel
->r_offset
+ 4);
14130 || nop
== CROR_151515
|| nop
== CROR_313131
)
14133 && (h
== htab
->tls_get_addr_fd
14134 || h
== htab
->tls_get_addr
)
14135 && htab
->params
->tls_get_addr_opt
)
14137 /* Special stub used, leave nop alone. */
14140 bfd_put_32 (input_bfd
,
14141 LD_R2_0R1
+ STK_TOC (htab
),
14142 contents
+ rel
->r_offset
+ 4);
14143 can_plt_call
= TRUE
;
14148 if (!can_plt_call
&& h
!= NULL
)
14150 const char *name
= h
->elf
.root
.root
.string
;
14155 if (strncmp (name
, "__libc_start_main", 17) == 0
14156 && (name
[17] == 0 || name
[17] == '@'))
14158 /* Allow crt1 branch to go via a toc adjusting
14159 stub. Other calls that never return could do
14160 the same, if we could detect such. */
14161 can_plt_call
= TRUE
;
14167 /* g++ as of 20130507 emits self-calls without a
14168 following nop. This is arguably wrong since we
14169 have conflicting information. On the one hand a
14170 global symbol and on the other a local call
14171 sequence, but don't error for this special case.
14172 It isn't possible to cheaply verify we have
14173 exactly such a call. Allow all calls to the same
14175 asection
*code_sec
= sec
;
14177 if (get_opd_info (sec
) != NULL
)
14179 bfd_vma off
= (relocation
+ addend
14180 - sec
->output_section
->vma
14181 - sec
->output_offset
);
14183 opd_entry_value (sec
, off
, &code_sec
, NULL
, FALSE
);
14185 if (code_sec
== input_section
)
14186 can_plt_call
= TRUE
;
14191 if (stub_entry
->stub_type
== ppc_stub_plt_call
14192 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
14193 info
->callbacks
->einfo
14194 /* xgettext:c-format */
14195 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
14196 "recompile with -fPIC\n"),
14197 input_bfd
, input_section
, rel
->r_offset
, sym_name
);
14199 info
->callbacks
->einfo
14200 /* xgettext:c-format */
14201 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
14202 "(-mcmodel=small toc adjust stub)\n"),
14203 input_bfd
, input_section
, rel
->r_offset
, sym_name
);
14205 bfd_set_error (bfd_error_bad_value
);
14210 && (stub_entry
->stub_type
== ppc_stub_plt_call
14211 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
))
14212 unresolved_reloc
= FALSE
;
14215 if ((stub_entry
== NULL
14216 || stub_entry
->stub_type
== ppc_stub_long_branch
14217 || stub_entry
->stub_type
== ppc_stub_plt_branch
)
14218 && get_opd_info (sec
) != NULL
)
14220 /* The branch destination is the value of the opd entry. */
14221 bfd_vma off
= (relocation
+ addend
14222 - sec
->output_section
->vma
14223 - sec
->output_offset
);
14224 bfd_vma dest
= opd_entry_value (sec
, off
, NULL
, NULL
, FALSE
);
14225 if (dest
!= (bfd_vma
) -1)
14229 reloc_dest
= DEST_OPD
;
14233 /* If the branch is out of reach we ought to have a long
14235 from
= (rel
->r_offset
14236 + input_section
->output_offset
14237 + input_section
->output_section
->vma
);
14239 relocation
+= PPC64_LOCAL_ENTRY_OFFSET (fdh
14243 if (stub_entry
!= NULL
14244 && (stub_entry
->stub_type
== ppc_stub_long_branch
14245 || stub_entry
->stub_type
== ppc_stub_plt_branch
)
14246 && (r_type
== R_PPC64_ADDR14_BRTAKEN
14247 || r_type
== R_PPC64_ADDR14_BRNTAKEN
14248 || (relocation
+ addend
- from
+ max_br_offset
14249 < 2 * max_br_offset
)))
14250 /* Don't use the stub if this branch is in range. */
14253 if (stub_entry
!= NULL
)
14255 /* Munge up the value and addend so that we call the stub
14256 rather than the procedure directly. */
14257 asection
*stub_sec
= stub_entry
->group
->stub_sec
;
14259 if (stub_entry
->stub_type
== ppc_stub_save_res
)
14260 relocation
+= (stub_sec
->output_offset
14261 + stub_sec
->output_section
->vma
14262 + stub_sec
->size
- htab
->sfpr
->size
14263 - htab
->sfpr
->output_offset
14264 - htab
->sfpr
->output_section
->vma
);
14266 relocation
= (stub_entry
->stub_offset
14267 + stub_sec
->output_offset
14268 + stub_sec
->output_section
->vma
);
14270 reloc_dest
= DEST_STUB
;
14272 if ((stub_entry
->stub_type
== ppc_stub_plt_call
14273 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
14274 && (ALWAYS_EMIT_R2SAVE
14275 || stub_entry
->stub_type
== ppc_stub_plt_call_r2save
)
14276 && rel
+ 1 < relend
14277 && rel
[1].r_offset
== rel
->r_offset
+ 4
14278 && ELF64_R_TYPE (rel
[1].r_info
) == R_PPC64_TOCSAVE
)
14286 /* Set 'a' bit. This is 0b00010 in BO field for branch
14287 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14288 for branch on CTR insns (BO == 1a00t or 1a01t). */
14289 if ((insn
& (0x14 << 21)) == (0x04 << 21))
14290 insn
|= 0x02 << 21;
14291 else if ((insn
& (0x14 << 21)) == (0x10 << 21))
14292 insn
|= 0x08 << 21;
14298 /* Invert 'y' bit if not the default. */
14299 if ((bfd_signed_vma
) (relocation
+ addend
- from
) < 0)
14300 insn
^= 0x01 << 21;
14303 bfd_put_32 (input_bfd
, insn
, contents
+ rel
->r_offset
);
14306 /* NOP out calls to undefined weak functions.
14307 We can thus call a weak function without first
14308 checking whether the function is defined. */
14310 && h
->elf
.root
.type
== bfd_link_hash_undefweak
14311 && h
->elf
.dynindx
== -1
14312 && r_type
== R_PPC64_REL24
14316 bfd_put_32 (input_bfd
, NOP
, contents
+ rel
->r_offset
);
14322 /* Set `addend'. */
14327 info
->callbacks
->einfo
14328 /* xgettext:c-format */
14329 (_("%P: %B: unknown relocation type %d for `%T'\n"),
14330 input_bfd
, (int) r_type
, sym_name
);
14332 bfd_set_error (bfd_error_bad_value
);
14338 case R_PPC64_TLSGD
:
14339 case R_PPC64_TLSLD
:
14340 case R_PPC64_TOCSAVE
:
14341 case R_PPC64_GNU_VTINHERIT
:
14342 case R_PPC64_GNU_VTENTRY
:
14343 case R_PPC64_ENTRY
:
14346 /* GOT16 relocations. Like an ADDR16 using the symbol's
14347 address in the GOT as relocation value instead of the
14348 symbol's value itself. Also, create a GOT entry for the
14349 symbol and put the symbol value there. */
14350 case R_PPC64_GOT_TLSGD16
:
14351 case R_PPC64_GOT_TLSGD16_LO
:
14352 case R_PPC64_GOT_TLSGD16_HI
:
14353 case R_PPC64_GOT_TLSGD16_HA
:
14354 tls_type
= TLS_TLS
| TLS_GD
;
14357 case R_PPC64_GOT_TLSLD16
:
14358 case R_PPC64_GOT_TLSLD16_LO
:
14359 case R_PPC64_GOT_TLSLD16_HI
:
14360 case R_PPC64_GOT_TLSLD16_HA
:
14361 tls_type
= TLS_TLS
| TLS_LD
;
14364 case R_PPC64_GOT_TPREL16_DS
:
14365 case R_PPC64_GOT_TPREL16_LO_DS
:
14366 case R_PPC64_GOT_TPREL16_HI
:
14367 case R_PPC64_GOT_TPREL16_HA
:
14368 tls_type
= TLS_TLS
| TLS_TPREL
;
14371 case R_PPC64_GOT_DTPREL16_DS
:
14372 case R_PPC64_GOT_DTPREL16_LO_DS
:
14373 case R_PPC64_GOT_DTPREL16_HI
:
14374 case R_PPC64_GOT_DTPREL16_HA
:
14375 tls_type
= TLS_TLS
| TLS_DTPREL
;
14378 case R_PPC64_GOT16
:
14379 case R_PPC64_GOT16_LO
:
14380 case R_PPC64_GOT16_HI
:
14381 case R_PPC64_GOT16_HA
:
14382 case R_PPC64_GOT16_DS
:
14383 case R_PPC64_GOT16_LO_DS
:
14386 /* Relocation is to the entry for this symbol in the global
14391 unsigned long indx
= 0;
14392 struct got_entry
*ent
;
14394 if (tls_type
== (TLS_TLS
| TLS_LD
)
14396 || !h
->elf
.def_dynamic
))
14397 ent
= ppc64_tlsld_got (input_bfd
);
14403 bfd_boolean dyn
= htab
->elf
.dynamic_sections_created
;
14404 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, bfd_link_pic (info
),
14406 || (bfd_link_pic (info
)
14407 && SYMBOL_REFERENCES_LOCAL (info
, &h
->elf
)))
14408 /* This is actually a static link, or it is a
14409 -Bsymbolic link and the symbol is defined
14410 locally, or the symbol was forced to be local
14411 because of a version file. */
14415 BFD_ASSERT (h
->elf
.dynindx
!= -1);
14416 indx
= h
->elf
.dynindx
;
14417 unresolved_reloc
= FALSE
;
14419 ent
= h
->elf
.got
.glist
;
14423 if (local_got_ents
== NULL
)
14425 ent
= local_got_ents
[r_symndx
];
14428 for (; ent
!= NULL
; ent
= ent
->next
)
14429 if (ent
->addend
== orig_rel
.r_addend
14430 && ent
->owner
== input_bfd
14431 && ent
->tls_type
== tls_type
)
14437 if (ent
->is_indirect
)
14438 ent
= ent
->got
.ent
;
14439 offp
= &ent
->got
.offset
;
14440 got
= ppc64_elf_tdata (ent
->owner
)->got
;
14444 /* The offset must always be a multiple of 8. We use the
14445 least significant bit to record whether we have already
14446 processed this entry. */
14448 if ((off
& 1) != 0)
14452 /* Generate relocs for the dynamic linker, except in
14453 the case of TLSLD where we'll use one entry per
14461 ? h
->elf
.type
== STT_GNU_IFUNC
14462 : ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
);
14464 relgot
= htab
->elf
.irelplt
;
14465 else if ((bfd_link_pic (info
) || indx
!= 0)
14467 || (tls_type
== (TLS_TLS
| TLS_LD
)
14468 && !h
->elf
.def_dynamic
)
14469 || ELF_ST_VISIBILITY (h
->elf
.other
) == STV_DEFAULT
14470 || h
->elf
.root
.type
!= bfd_link_hash_undefweak
))
14471 relgot
= ppc64_elf_tdata (ent
->owner
)->relgot
;
14472 if (relgot
!= NULL
)
14474 outrel
.r_offset
= (got
->output_section
->vma
14475 + got
->output_offset
14477 outrel
.r_addend
= addend
;
14478 if (tls_type
& (TLS_LD
| TLS_GD
))
14480 outrel
.r_addend
= 0;
14481 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_DTPMOD64
);
14482 if (tls_type
== (TLS_TLS
| TLS_GD
))
14484 loc
= relgot
->contents
;
14485 loc
+= (relgot
->reloc_count
++
14486 * sizeof (Elf64_External_Rela
));
14487 bfd_elf64_swap_reloca_out (output_bfd
,
14489 outrel
.r_offset
+= 8;
14490 outrel
.r_addend
= addend
;
14492 = ELF64_R_INFO (indx
, R_PPC64_DTPREL64
);
14495 else if (tls_type
== (TLS_TLS
| TLS_DTPREL
))
14496 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_DTPREL64
);
14497 else if (tls_type
== (TLS_TLS
| TLS_TPREL
))
14498 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_TPREL64
);
14499 else if (indx
!= 0)
14500 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_GLOB_DAT
);
14504 outrel
.r_info
= ELF64_R_INFO (0, R_PPC64_IRELATIVE
);
14506 outrel
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
14508 /* Write the .got section contents for the sake
14510 loc
= got
->contents
+ off
;
14511 bfd_put_64 (output_bfd
, outrel
.r_addend
+ relocation
,
14515 if (indx
== 0 && tls_type
!= (TLS_TLS
| TLS_LD
))
14517 outrel
.r_addend
+= relocation
;
14518 if (tls_type
& (TLS_GD
| TLS_DTPREL
| TLS_TPREL
))
14520 if (htab
->elf
.tls_sec
== NULL
)
14521 outrel
.r_addend
= 0;
14523 outrel
.r_addend
-= htab
->elf
.tls_sec
->vma
;
14526 loc
= relgot
->contents
;
14527 loc
+= (relgot
->reloc_count
++
14528 * sizeof (Elf64_External_Rela
));
14529 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
14532 /* Init the .got section contents here if we're not
14533 emitting a reloc. */
14536 relocation
+= addend
;
14537 if (tls_type
== (TLS_TLS
| TLS_LD
))
14539 else if (tls_type
!= 0)
14541 if (htab
->elf
.tls_sec
== NULL
)
14545 relocation
-= htab
->elf
.tls_sec
->vma
+ DTP_OFFSET
;
14546 if (tls_type
== (TLS_TLS
| TLS_TPREL
))
14547 relocation
+= DTP_OFFSET
- TP_OFFSET
;
14550 if (tls_type
== (TLS_TLS
| TLS_GD
))
14552 bfd_put_64 (output_bfd
, relocation
,
14553 got
->contents
+ off
+ 8);
14558 bfd_put_64 (output_bfd
, relocation
,
14559 got
->contents
+ off
);
14563 if (off
>= (bfd_vma
) -2)
14566 relocation
= got
->output_section
->vma
+ got
->output_offset
+ off
;
14567 addend
= -(TOCstart
+ htab
->sec_info
[input_section
->id
].toc_off
);
14571 case R_PPC64_PLT16_HA
:
14572 case R_PPC64_PLT16_HI
:
14573 case R_PPC64_PLT16_LO
:
14574 case R_PPC64_PLT32
:
14575 case R_PPC64_PLT64
:
14576 /* Relocation is to the entry for this symbol in the
14577 procedure linkage table. */
14579 struct plt_entry
**plt_list
= NULL
;
14581 plt_list
= &h
->elf
.plt
.plist
;
14582 else if (local_got_ents
!= NULL
)
14584 struct plt_entry
**local_plt
= (struct plt_entry
**)
14585 (local_got_ents
+ symtab_hdr
->sh_info
);
14586 unsigned char *local_got_tls_masks
= (unsigned char *)
14587 (local_plt
+ symtab_hdr
->sh_info
);
14588 if ((local_got_tls_masks
[r_symndx
] & PLT_IFUNC
) != 0)
14589 plt_list
= local_plt
+ r_symndx
;
14593 struct plt_entry
*ent
;
14595 for (ent
= *plt_list
; ent
!= NULL
; ent
= ent
->next
)
14596 if (ent
->plt
.offset
!= (bfd_vma
) -1
14597 && ent
->addend
== orig_rel
.r_addend
)
14601 plt
= htab
->elf
.splt
;
14602 if (!htab
->elf
.dynamic_sections_created
14604 || h
->elf
.dynindx
== -1)
14605 plt
= htab
->elf
.iplt
;
14606 relocation
= (plt
->output_section
->vma
14607 + plt
->output_offset
14608 + ent
->plt
.offset
);
14610 unresolved_reloc
= FALSE
;
14618 /* Relocation value is TOC base. */
14619 relocation
= TOCstart
;
14620 if (r_symndx
== STN_UNDEF
)
14621 relocation
+= htab
->sec_info
[input_section
->id
].toc_off
;
14622 else if (unresolved_reloc
)
14624 else if (sec
!= NULL
&& sec
->id
< htab
->sec_info_arr_size
)
14625 relocation
+= htab
->sec_info
[sec
->id
].toc_off
;
14627 unresolved_reloc
= TRUE
;
14630 /* TOC16 relocs. We want the offset relative to the TOC base,
14631 which is the address of the start of the TOC plus 0x8000.
14632 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14634 case R_PPC64_TOC16
:
14635 case R_PPC64_TOC16_LO
:
14636 case R_PPC64_TOC16_HI
:
14637 case R_PPC64_TOC16_DS
:
14638 case R_PPC64_TOC16_LO_DS
:
14639 case R_PPC64_TOC16_HA
:
14640 addend
-= TOCstart
+ htab
->sec_info
[input_section
->id
].toc_off
;
14643 /* Relocate against the beginning of the section. */
14644 case R_PPC64_SECTOFF
:
14645 case R_PPC64_SECTOFF_LO
:
14646 case R_PPC64_SECTOFF_HI
:
14647 case R_PPC64_SECTOFF_DS
:
14648 case R_PPC64_SECTOFF_LO_DS
:
14649 case R_PPC64_SECTOFF_HA
:
14651 addend
-= sec
->output_section
->vma
;
14654 case R_PPC64_REL16
:
14655 case R_PPC64_REL16_LO
:
14656 case R_PPC64_REL16_HI
:
14657 case R_PPC64_REL16_HA
:
14658 case R_PPC64_REL16DX_HA
:
14661 case R_PPC64_REL14
:
14662 case R_PPC64_REL14_BRNTAKEN
:
14663 case R_PPC64_REL14_BRTAKEN
:
14664 case R_PPC64_REL24
:
14667 case R_PPC64_TPREL16
:
14668 case R_PPC64_TPREL16_LO
:
14669 case R_PPC64_TPREL16_HI
:
14670 case R_PPC64_TPREL16_HA
:
14671 case R_PPC64_TPREL16_DS
:
14672 case R_PPC64_TPREL16_LO_DS
:
14673 case R_PPC64_TPREL16_HIGH
:
14674 case R_PPC64_TPREL16_HIGHA
:
14675 case R_PPC64_TPREL16_HIGHER
:
14676 case R_PPC64_TPREL16_HIGHERA
:
14677 case R_PPC64_TPREL16_HIGHEST
:
14678 case R_PPC64_TPREL16_HIGHESTA
:
14680 && h
->elf
.root
.type
== bfd_link_hash_undefweak
14681 && h
->elf
.dynindx
== -1)
14683 /* Make this relocation against an undefined weak symbol
14684 resolve to zero. This is really just a tweak, since
14685 code using weak externs ought to check that they are
14686 defined before using them. */
14687 bfd_byte
*p
= contents
+ rel
->r_offset
- d_offset
;
14689 insn
= bfd_get_32 (input_bfd
, p
);
14690 insn
= _bfd_elf_ppc_at_tprel_transform (insn
, 13);
14692 bfd_put_32 (input_bfd
, insn
, p
);
14695 if (htab
->elf
.tls_sec
!= NULL
)
14696 addend
-= htab
->elf
.tls_sec
->vma
+ TP_OFFSET
;
14697 if (bfd_link_pic (info
))
14698 /* The TPREL16 relocs shouldn't really be used in shared
14699 libs as they will result in DT_TEXTREL being set, but
14700 support them anyway. */
14704 case R_PPC64_DTPREL16
:
14705 case R_PPC64_DTPREL16_LO
:
14706 case R_PPC64_DTPREL16_HI
:
14707 case R_PPC64_DTPREL16_HA
:
14708 case R_PPC64_DTPREL16_DS
:
14709 case R_PPC64_DTPREL16_LO_DS
:
14710 case R_PPC64_DTPREL16_HIGH
:
14711 case R_PPC64_DTPREL16_HIGHA
:
14712 case R_PPC64_DTPREL16_HIGHER
:
14713 case R_PPC64_DTPREL16_HIGHERA
:
14714 case R_PPC64_DTPREL16_HIGHEST
:
14715 case R_PPC64_DTPREL16_HIGHESTA
:
14716 if (htab
->elf
.tls_sec
!= NULL
)
14717 addend
-= htab
->elf
.tls_sec
->vma
+ DTP_OFFSET
;
14720 case R_PPC64_ADDR64_LOCAL
:
14721 addend
+= PPC64_LOCAL_ENTRY_OFFSET (h
!= NULL
14726 case R_PPC64_DTPMOD64
:
14731 case R_PPC64_TPREL64
:
14732 if (htab
->elf
.tls_sec
!= NULL
)
14733 addend
-= htab
->elf
.tls_sec
->vma
+ TP_OFFSET
;
14736 case R_PPC64_DTPREL64
:
14737 if (htab
->elf
.tls_sec
!= NULL
)
14738 addend
-= htab
->elf
.tls_sec
->vma
+ DTP_OFFSET
;
14739 /* Fall through. */
14741 /* Relocations that may need to be propagated if this is a
14743 case R_PPC64_REL30
:
14744 case R_PPC64_REL32
:
14745 case R_PPC64_REL64
:
14746 case R_PPC64_ADDR14
:
14747 case R_PPC64_ADDR14_BRNTAKEN
:
14748 case R_PPC64_ADDR14_BRTAKEN
:
14749 case R_PPC64_ADDR16
:
14750 case R_PPC64_ADDR16_DS
:
14751 case R_PPC64_ADDR16_HA
:
14752 case R_PPC64_ADDR16_HI
:
14753 case R_PPC64_ADDR16_HIGH
:
14754 case R_PPC64_ADDR16_HIGHA
:
14755 case R_PPC64_ADDR16_HIGHER
:
14756 case R_PPC64_ADDR16_HIGHERA
:
14757 case R_PPC64_ADDR16_HIGHEST
:
14758 case R_PPC64_ADDR16_HIGHESTA
:
14759 case R_PPC64_ADDR16_LO
:
14760 case R_PPC64_ADDR16_LO_DS
:
14761 case R_PPC64_ADDR24
:
14762 case R_PPC64_ADDR32
:
14763 case R_PPC64_ADDR64
:
14764 case R_PPC64_UADDR16
:
14765 case R_PPC64_UADDR32
:
14766 case R_PPC64_UADDR64
:
14768 if ((input_section
->flags
& SEC_ALLOC
) == 0)
14771 if (NO_OPD_RELOCS
&& is_opd
)
14774 if (bfd_link_pic (info
)
14775 ? ((h
!= NULL
&& pc_dynrelocs (h
))
14776 || must_be_dyn_reloc (info
, r_type
))
14778 ? h
->dyn_relocs
!= NULL
14779 : ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
))
14781 bfd_boolean skip
, relocate
;
14785 /* When generating a dynamic object, these relocations
14786 are copied into the output file to be resolved at run
14792 out_off
= _bfd_elf_section_offset (output_bfd
, info
,
14793 input_section
, rel
->r_offset
);
14794 if (out_off
== (bfd_vma
) -1)
14796 else if (out_off
== (bfd_vma
) -2)
14797 skip
= TRUE
, relocate
= TRUE
;
14798 out_off
+= (input_section
->output_section
->vma
14799 + input_section
->output_offset
);
14800 outrel
.r_offset
= out_off
;
14801 outrel
.r_addend
= rel
->r_addend
;
14803 /* Optimize unaligned reloc use. */
14804 if ((r_type
== R_PPC64_ADDR64
&& (out_off
& 7) != 0)
14805 || (r_type
== R_PPC64_UADDR64
&& (out_off
& 7) == 0))
14806 r_type
^= R_PPC64_ADDR64
^ R_PPC64_UADDR64
;
14807 else if ((r_type
== R_PPC64_ADDR32
&& (out_off
& 3) != 0)
14808 || (r_type
== R_PPC64_UADDR32
&& (out_off
& 3) == 0))
14809 r_type
^= R_PPC64_ADDR32
^ R_PPC64_UADDR32
;
14810 else if ((r_type
== R_PPC64_ADDR16
&& (out_off
& 1) != 0)
14811 || (r_type
== R_PPC64_UADDR16
&& (out_off
& 1) == 0))
14812 r_type
^= R_PPC64_ADDR16
^ R_PPC64_UADDR16
;
14815 memset (&outrel
, 0, sizeof outrel
);
14816 else if (!SYMBOL_REFERENCES_LOCAL (info
, &h
->elf
)
14818 && r_type
!= R_PPC64_TOC
)
14820 BFD_ASSERT (h
->elf
.dynindx
!= -1);
14821 outrel
.r_info
= ELF64_R_INFO (h
->elf
.dynindx
, r_type
);
14825 /* This symbol is local, or marked to become local,
14826 or this is an opd section reloc which must point
14827 at a local function. */
14828 outrel
.r_addend
+= relocation
;
14829 if (r_type
== R_PPC64_ADDR64
|| r_type
== R_PPC64_TOC
)
14831 if (is_opd
&& h
!= NULL
)
14833 /* Lie about opd entries. This case occurs
14834 when building shared libraries and we
14835 reference a function in another shared
14836 lib. The same thing happens for a weak
14837 definition in an application that's
14838 overridden by a strong definition in a
14839 shared lib. (I believe this is a generic
14840 bug in binutils handling of weak syms.)
14841 In these cases we won't use the opd
14842 entry in this lib. */
14843 unresolved_reloc
= FALSE
;
14846 && r_type
== R_PPC64_ADDR64
14848 ? h
->elf
.type
== STT_GNU_IFUNC
14849 : ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
))
14850 outrel
.r_info
= ELF64_R_INFO (0, R_PPC64_IRELATIVE
);
14853 outrel
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
14855 /* We need to relocate .opd contents for ld.so.
14856 Prelink also wants simple and consistent rules
14857 for relocs. This make all RELATIVE relocs have
14858 *r_offset equal to r_addend. */
14867 ? h
->elf
.type
== STT_GNU_IFUNC
14868 : ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
)
14870 info
->callbacks
->einfo
14871 /* xgettext:c-format */
14872 (_("%P: %H: %s for indirect "
14873 "function `%T' unsupported\n"),
14874 input_bfd
, input_section
, rel
->r_offset
,
14875 ppc64_elf_howto_table
[r_type
]->name
,
14879 else if (r_symndx
== STN_UNDEF
|| bfd_is_abs_section (sec
))
14881 else if (sec
== NULL
|| sec
->owner
== NULL
)
14883 bfd_set_error (bfd_error_bad_value
);
14890 osec
= sec
->output_section
;
14891 indx
= elf_section_data (osec
)->dynindx
;
14895 if ((osec
->flags
& SEC_READONLY
) == 0
14896 && htab
->elf
.data_index_section
!= NULL
)
14897 osec
= htab
->elf
.data_index_section
;
14899 osec
= htab
->elf
.text_index_section
;
14900 indx
= elf_section_data (osec
)->dynindx
;
14902 BFD_ASSERT (indx
!= 0);
14904 /* We are turning this relocation into one
14905 against a section symbol, so subtract out
14906 the output section's address but not the
14907 offset of the input section in the output
14909 outrel
.r_addend
-= osec
->vma
;
14912 outrel
.r_info
= ELF64_R_INFO (indx
, r_type
);
14916 sreloc
= elf_section_data (input_section
)->sreloc
;
14918 ? h
->elf
.type
== STT_GNU_IFUNC
14919 : ELF_ST_TYPE (sym
->st_info
) == STT_GNU_IFUNC
)
14920 sreloc
= htab
->elf
.irelplt
;
14921 if (sreloc
== NULL
)
14924 if (sreloc
->reloc_count
* sizeof (Elf64_External_Rela
)
14927 loc
= sreloc
->contents
;
14928 loc
+= sreloc
->reloc_count
++ * sizeof (Elf64_External_Rela
);
14929 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
14931 /* If this reloc is against an external symbol, it will
14932 be computed at runtime, so there's no need to do
14933 anything now. However, for the sake of prelink ensure
14934 that the section contents are a known value. */
14937 unresolved_reloc
= FALSE
;
14938 /* The value chosen here is quite arbitrary as ld.so
14939 ignores section contents except for the special
14940 case of .opd where the contents might be accessed
14941 before relocation. Choose zero, as that won't
14942 cause reloc overflow. */
14945 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14946 to improve backward compatibility with older
14948 if (r_type
== R_PPC64_ADDR64
)
14949 addend
= outrel
.r_addend
;
14950 /* Adjust pc_relative relocs to have zero in *r_offset. */
14951 else if (ppc64_elf_howto_table
[r_type
]->pc_relative
)
14952 addend
= (input_section
->output_section
->vma
14953 + input_section
->output_offset
14960 case R_PPC64_GLOB_DAT
:
14961 case R_PPC64_JMP_SLOT
:
14962 case R_PPC64_JMP_IREL
:
14963 case R_PPC64_RELATIVE
:
14964 /* We shouldn't ever see these dynamic relocs in relocatable
14966 /* Fall through. */
14968 case R_PPC64_PLTGOT16
:
14969 case R_PPC64_PLTGOT16_DS
:
14970 case R_PPC64_PLTGOT16_HA
:
14971 case R_PPC64_PLTGOT16_HI
:
14972 case R_PPC64_PLTGOT16_LO
:
14973 case R_PPC64_PLTGOT16_LO_DS
:
14974 case R_PPC64_PLTREL32
:
14975 case R_PPC64_PLTREL64
:
14976 /* These ones haven't been implemented yet. */
14978 info
->callbacks
->einfo
14979 /* xgettext:c-format */
14980 (_("%P: %B: %s is not supported for `%T'\n"),
14982 ppc64_elf_howto_table
[r_type
]->name
, sym_name
);
14984 bfd_set_error (bfd_error_invalid_operation
);
14989 /* Multi-instruction sequences that access the TOC can be
14990 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14991 to nop; addi rb,r2,x; */
14997 case R_PPC64_GOT_TLSLD16_HI
:
14998 case R_PPC64_GOT_TLSGD16_HI
:
14999 case R_PPC64_GOT_TPREL16_HI
:
15000 case R_PPC64_GOT_DTPREL16_HI
:
15001 case R_PPC64_GOT16_HI
:
15002 case R_PPC64_TOC16_HI
:
15003 /* These relocs would only be useful if building up an
15004 offset to later add to r2, perhaps in an indexed
15005 addressing mode instruction. Don't try to optimize.
15006 Unfortunately, the possibility of someone building up an
15007 offset like this or even with the HA relocs, means that
15008 we need to check the high insn when optimizing the low
15012 case R_PPC64_GOT_TLSLD16_HA
:
15013 case R_PPC64_GOT_TLSGD16_HA
:
15014 case R_PPC64_GOT_TPREL16_HA
:
15015 case R_PPC64_GOT_DTPREL16_HA
:
15016 case R_PPC64_GOT16_HA
:
15017 case R_PPC64_TOC16_HA
:
15018 if (htab
->do_toc_opt
&& relocation
+ addend
+ 0x8000 < 0x10000
15019 && !ppc64_elf_tdata (input_bfd
)->unexpected_toc_insn
)
15021 bfd_byte
*p
= contents
+ (rel
->r_offset
& ~3);
15022 bfd_put_32 (input_bfd
, NOP
, p
);
15026 case R_PPC64_GOT_TLSLD16_LO
:
15027 case R_PPC64_GOT_TLSGD16_LO
:
15028 case R_PPC64_GOT_TPREL16_LO_DS
:
15029 case R_PPC64_GOT_DTPREL16_LO_DS
:
15030 case R_PPC64_GOT16_LO
:
15031 case R_PPC64_GOT16_LO_DS
:
15032 case R_PPC64_TOC16_LO
:
15033 case R_PPC64_TOC16_LO_DS
:
15034 if (htab
->do_toc_opt
&& relocation
+ addend
+ 0x8000 < 0x10000
15035 && !ppc64_elf_tdata (input_bfd
)->unexpected_toc_insn
)
15037 bfd_byte
*p
= contents
+ (rel
->r_offset
& ~3);
15038 insn
= bfd_get_32 (input_bfd
, p
);
15039 if ((insn
& (0x3f << 26)) == 12u << 26 /* addic */)
15041 /* Transform addic to addi when we change reg. */
15042 insn
&= ~((0x3f << 26) | (0x1f << 16));
15043 insn
|= (14u << 26) | (2 << 16);
15047 insn
&= ~(0x1f << 16);
15050 bfd_put_32 (input_bfd
, insn
, p
);
15055 /* Do any further special processing. */
15056 howto
= ppc64_elf_howto_table
[(int) r_type
];
15062 case R_PPC64_REL16_HA
:
15063 case R_PPC64_REL16DX_HA
:
15064 case R_PPC64_ADDR16_HA
:
15065 case R_PPC64_ADDR16_HIGHA
:
15066 case R_PPC64_ADDR16_HIGHERA
:
15067 case R_PPC64_ADDR16_HIGHESTA
:
15068 case R_PPC64_TOC16_HA
:
15069 case R_PPC64_SECTOFF_HA
:
15070 case R_PPC64_TPREL16_HA
:
15071 case R_PPC64_TPREL16_HIGHA
:
15072 case R_PPC64_TPREL16_HIGHERA
:
15073 case R_PPC64_TPREL16_HIGHESTA
:
15074 case R_PPC64_DTPREL16_HA
:
15075 case R_PPC64_DTPREL16_HIGHA
:
15076 case R_PPC64_DTPREL16_HIGHERA
:
15077 case R_PPC64_DTPREL16_HIGHESTA
:
15078 /* It's just possible that this symbol is a weak symbol
15079 that's not actually defined anywhere. In that case,
15080 'sec' would be NULL, and we should leave the symbol
15081 alone (it will be set to zero elsewhere in the link). */
15084 /* Fall through. */
15086 case R_PPC64_GOT16_HA
:
15087 case R_PPC64_PLTGOT16_HA
:
15088 case R_PPC64_PLT16_HA
:
15089 case R_PPC64_GOT_TLSGD16_HA
:
15090 case R_PPC64_GOT_TLSLD16_HA
:
15091 case R_PPC64_GOT_TPREL16_HA
:
15092 case R_PPC64_GOT_DTPREL16_HA
:
15093 /* Add 0x10000 if sign bit in 0:15 is set.
15094 Bits 0:15 are not used. */
15098 case R_PPC64_ADDR16_DS
:
15099 case R_PPC64_ADDR16_LO_DS
:
15100 case R_PPC64_GOT16_DS
:
15101 case R_PPC64_GOT16_LO_DS
:
15102 case R_PPC64_PLT16_LO_DS
:
15103 case R_PPC64_SECTOFF_DS
:
15104 case R_PPC64_SECTOFF_LO_DS
:
15105 case R_PPC64_TOC16_DS
:
15106 case R_PPC64_TOC16_LO_DS
:
15107 case R_PPC64_PLTGOT16_DS
:
15108 case R_PPC64_PLTGOT16_LO_DS
:
15109 case R_PPC64_GOT_TPREL16_DS
:
15110 case R_PPC64_GOT_TPREL16_LO_DS
:
15111 case R_PPC64_GOT_DTPREL16_DS
:
15112 case R_PPC64_GOT_DTPREL16_LO_DS
:
15113 case R_PPC64_TPREL16_DS
:
15114 case R_PPC64_TPREL16_LO_DS
:
15115 case R_PPC64_DTPREL16_DS
:
15116 case R_PPC64_DTPREL16_LO_DS
:
15117 insn
= bfd_get_32 (input_bfd
, contents
+ (rel
->r_offset
& ~3));
15119 /* If this reloc is against an lq, lxv, or stxv insn, then
15120 the value must be a multiple of 16. This is somewhat of
15121 a hack, but the "correct" way to do this by defining _DQ
15122 forms of all the _DS relocs bloats all reloc switches in
15123 this file. It doesn't make much sense to use these
15124 relocs in data, so testing the insn should be safe. */
15125 if ((insn
& (0x3f << 26)) == (56u << 26)
15126 || ((insn
& (0x3f << 26)) == (61u << 26) && (insn
& 3) == 1))
15128 relocation
+= addend
;
15129 addend
= insn
& (mask
^ 3);
15130 if ((relocation
& mask
) != 0)
15132 relocation
^= relocation
& mask
;
15133 info
->callbacks
->einfo
15134 /* xgettext:c-format */
15135 (_("%P: %H: error: %s not a multiple of %u\n"),
15136 input_bfd
, input_section
, rel
->r_offset
,
15139 bfd_set_error (bfd_error_bad_value
);
15146 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
15147 because such sections are not SEC_ALLOC and thus ld.so will
15148 not process them. */
15149 if (unresolved_reloc
15150 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
15151 && h
->elf
.def_dynamic
)
15152 && _bfd_elf_section_offset (output_bfd
, info
, input_section
,
15153 rel
->r_offset
) != (bfd_vma
) -1)
15155 info
->callbacks
->einfo
15156 /* xgettext:c-format */
15157 (_("%P: %H: unresolvable %s against `%T'\n"),
15158 input_bfd
, input_section
, rel
->r_offset
,
15160 h
->elf
.root
.root
.string
);
15164 /* 16-bit fields in insns mostly have signed values, but a
15165 few insns have 16-bit unsigned values. Really, we should
15166 have different reloc types. */
15167 if (howto
->complain_on_overflow
!= complain_overflow_dont
15168 && howto
->dst_mask
== 0xffff
15169 && (input_section
->flags
& SEC_CODE
) != 0)
15171 enum complain_overflow complain
= complain_overflow_signed
;
15173 insn
= bfd_get_32 (input_bfd
, contents
+ (rel
->r_offset
& ~3));
15174 if ((insn
& (0x3f << 26)) == 10u << 26 /* cmpli */)
15175 complain
= complain_overflow_bitfield
;
15176 else if (howto
->rightshift
== 0
15177 ? ((insn
& (0x3f << 26)) == 28u << 26 /* andi */
15178 || (insn
& (0x3f << 26)) == 24u << 26 /* ori */
15179 || (insn
& (0x3f << 26)) == 26u << 26 /* xori */)
15180 : ((insn
& (0x3f << 26)) == 29u << 26 /* andis */
15181 || (insn
& (0x3f << 26)) == 25u << 26 /* oris */
15182 || (insn
& (0x3f << 26)) == 27u << 26 /* xoris */))
15183 complain
= complain_overflow_unsigned
;
15184 if (howto
->complain_on_overflow
!= complain
)
15186 alt_howto
= *howto
;
15187 alt_howto
.complain_on_overflow
= complain
;
15188 howto
= &alt_howto
;
15192 if (r_type
== R_PPC64_REL16DX_HA
)
15194 /* Split field reloc isn't handled by _bfd_final_link_relocate. */
15195 if (rel
->r_offset
+ 4 > input_section
->size
)
15196 r
= bfd_reloc_outofrange
;
15199 relocation
+= addend
;
15200 relocation
-= (rel
->r_offset
15201 + input_section
->output_offset
15202 + input_section
->output_section
->vma
);
15203 relocation
= (bfd_signed_vma
) relocation
>> 16;
15204 insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
15206 insn
|= (relocation
& 0xffc1) | ((relocation
& 0x3e) << 15);
15207 bfd_put_32 (input_bfd
, insn
, contents
+ rel
->r_offset
);
15209 if (relocation
+ 0x8000 > 0xffff)
15210 r
= bfd_reloc_overflow
;
15214 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
, contents
,
15215 rel
->r_offset
, relocation
, addend
);
15217 if (r
!= bfd_reloc_ok
)
15219 char *more_info
= NULL
;
15220 const char *reloc_name
= howto
->name
;
15222 if (reloc_dest
!= DEST_NORMAL
)
15224 more_info
= bfd_malloc (strlen (reloc_name
) + 8);
15225 if (more_info
!= NULL
)
15227 strcpy (more_info
, reloc_name
);
15228 strcat (more_info
, (reloc_dest
== DEST_OPD
15229 ? " (OPD)" : " (stub)"));
15230 reloc_name
= more_info
;
15234 if (r
== bfd_reloc_overflow
)
15236 /* On code like "if (foo) foo();" don't report overflow
15237 on a branch to zero when foo is undefined. */
15239 && (reloc_dest
== DEST_STUB
15241 && (h
->elf
.root
.type
== bfd_link_hash_undefweak
15242 || h
->elf
.root
.type
== bfd_link_hash_undefined
)
15243 && is_branch_reloc (r_type
))))
15244 info
->callbacks
->reloc_overflow (info
, &h
->elf
.root
,
15245 sym_name
, reloc_name
,
15247 input_bfd
, input_section
,
15252 info
->callbacks
->einfo
15253 /* xgettext:c-format */
15254 (_("%P: %H: %s against `%T': error %d\n"),
15255 input_bfd
, input_section
, rel
->r_offset
,
15256 reloc_name
, sym_name
, (int) r
);
15259 if (more_info
!= NULL
)
15269 Elf_Internal_Shdr
*rel_hdr
;
15270 size_t deleted
= rel
- wrel
;
15272 rel_hdr
= _bfd_elf_single_rel_hdr (input_section
->output_section
);
15273 rel_hdr
->sh_size
-= rel_hdr
->sh_entsize
* deleted
;
15274 if (rel_hdr
->sh_size
== 0)
15276 /* It is too late to remove an empty reloc section. Leave
15278 ??? What is wrong with an empty section??? */
15279 rel_hdr
->sh_size
= rel_hdr
->sh_entsize
;
15282 rel_hdr
= _bfd_elf_single_rel_hdr (input_section
);
15283 rel_hdr
->sh_size
-= rel_hdr
->sh_entsize
* deleted
;
15284 input_section
->reloc_count
-= deleted
;
15287 /* If we're emitting relocations, then shortly after this function
15288 returns, reloc offsets and addends for this section will be
15289 adjusted. Worse, reloc symbol indices will be for the output
15290 file rather than the input. Save a copy of the relocs for
15291 opd_entry_value. */
15292 if (is_opd
&& (info
->emitrelocations
|| bfd_link_relocatable (info
)))
15295 amt
= input_section
->reloc_count
* sizeof (Elf_Internal_Rela
);
15296 rel
= bfd_alloc (input_bfd
, amt
);
15297 BFD_ASSERT (ppc64_elf_tdata (input_bfd
)->opd
.relocs
== NULL
);
15298 ppc64_elf_tdata (input_bfd
)->opd
.relocs
= rel
;
15301 memcpy (rel
, relocs
, amt
);
15306 /* Adjust the value of any local symbols in opd sections. */
15309 ppc64_elf_output_symbol_hook (struct bfd_link_info
*info
,
15310 const char *name ATTRIBUTE_UNUSED
,
15311 Elf_Internal_Sym
*elfsym
,
15312 asection
*input_sec
,
15313 struct elf_link_hash_entry
*h
)
15315 struct _opd_sec_data
*opd
;
15322 opd
= get_opd_info (input_sec
);
15323 if (opd
== NULL
|| opd
->adjust
== NULL
)
15326 value
= elfsym
->st_value
- input_sec
->output_offset
;
15327 if (!bfd_link_relocatable (info
))
15328 value
-= input_sec
->output_section
->vma
;
15330 adjust
= opd
->adjust
[OPD_NDX (value
)];
15334 elfsym
->st_value
+= adjust
;
15338 /* Finish up dynamic symbol handling. We set the contents of various
15339 dynamic sections here. */
15342 ppc64_elf_finish_dynamic_symbol (bfd
*output_bfd
,
15343 struct bfd_link_info
*info
,
15344 struct elf_link_hash_entry
*h
,
15345 Elf_Internal_Sym
*sym ATTRIBUTE_UNUSED
)
15347 struct ppc_link_hash_table
*htab
;
15348 struct plt_entry
*ent
;
15349 Elf_Internal_Rela rela
;
15352 htab
= ppc_hash_table (info
);
15356 for (ent
= h
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
15357 if (ent
->plt
.offset
!= (bfd_vma
) -1)
15359 /* This symbol has an entry in the procedure linkage
15360 table. Set it up. */
15361 if (!htab
->elf
.dynamic_sections_created
15362 || h
->dynindx
== -1)
15364 BFD_ASSERT (h
->type
== STT_GNU_IFUNC
15366 && (h
->root
.type
== bfd_link_hash_defined
15367 || h
->root
.type
== bfd_link_hash_defweak
));
15368 rela
.r_offset
= (htab
->elf
.iplt
->output_section
->vma
15369 + htab
->elf
.iplt
->output_offset
15370 + ent
->plt
.offset
);
15372 rela
.r_info
= ELF64_R_INFO (0, R_PPC64_JMP_IREL
);
15374 rela
.r_info
= ELF64_R_INFO (0, R_PPC64_IRELATIVE
);
15375 rela
.r_addend
= (h
->root
.u
.def
.value
15376 + h
->root
.u
.def
.section
->output_offset
15377 + h
->root
.u
.def
.section
->output_section
->vma
15379 loc
= (htab
->elf
.irelplt
->contents
15380 + (htab
->elf
.irelplt
->reloc_count
++
15381 * sizeof (Elf64_External_Rela
)));
15385 rela
.r_offset
= (htab
->elf
.splt
->output_section
->vma
15386 + htab
->elf
.splt
->output_offset
15387 + ent
->plt
.offset
);
15388 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_PPC64_JMP_SLOT
);
15389 rela
.r_addend
= ent
->addend
;
15390 loc
= (htab
->elf
.srelplt
->contents
15391 + ((ent
->plt
.offset
- PLT_INITIAL_ENTRY_SIZE (htab
))
15392 / PLT_ENTRY_SIZE (htab
) * sizeof (Elf64_External_Rela
)));
15394 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
15396 if (!htab
->opd_abi
)
15398 if (!h
->def_regular
)
15400 /* Mark the symbol as undefined, rather than as
15401 defined in glink. Leave the value if there were
15402 any relocations where pointer equality matters
15403 (this is a clue for the dynamic linker, to make
15404 function pointer comparisons work between an
15405 application and shared library), otherwise set it
15407 sym
->st_shndx
= SHN_UNDEF
;
15408 if (!h
->pointer_equality_needed
)
15410 else if (!h
->ref_regular_nonweak
)
15412 /* This breaks function pointer comparisons, but
15413 that is better than breaking tests for a NULL
15414 function pointer. */
15423 /* This symbol needs a copy reloc. Set it up. */
15425 if (h
->dynindx
== -1
15426 || (h
->root
.type
!= bfd_link_hash_defined
15427 && h
->root
.type
!= bfd_link_hash_defweak
)
15428 || htab
->elf
.srelbss
== NULL
)
15431 rela
.r_offset
= (h
->root
.u
.def
.value
15432 + h
->root
.u
.def
.section
->output_section
->vma
15433 + h
->root
.u
.def
.section
->output_offset
);
15434 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_PPC64_COPY
);
15436 loc
= htab
->elf
.srelbss
->contents
;
15437 loc
+= htab
->elf
.srelbss
->reloc_count
++ * sizeof (Elf64_External_Rela
);
15438 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
15444 /* Used to decide how to sort relocs in an optimal manner for the
15445 dynamic linker, before writing them out. */
15447 static enum elf_reloc_type_class
15448 ppc64_elf_reloc_type_class (const struct bfd_link_info
*info
,
15449 const asection
*rel_sec
,
15450 const Elf_Internal_Rela
*rela
)
15452 enum elf_ppc64_reloc_type r_type
;
15453 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
15455 if (rel_sec
== htab
->elf
.irelplt
)
15456 return reloc_class_ifunc
;
15458 r_type
= ELF64_R_TYPE (rela
->r_info
);
15461 case R_PPC64_RELATIVE
:
15462 return reloc_class_relative
;
15463 case R_PPC64_JMP_SLOT
:
15464 return reloc_class_plt
;
15466 return reloc_class_copy
;
15468 return reloc_class_normal
;
15472 /* Finish up the dynamic sections. */
15475 ppc64_elf_finish_dynamic_sections (bfd
*output_bfd
,
15476 struct bfd_link_info
*info
)
15478 struct ppc_link_hash_table
*htab
;
15482 htab
= ppc_hash_table (info
);
15486 dynobj
= htab
->elf
.dynobj
;
15487 sdyn
= bfd_get_linker_section (dynobj
, ".dynamic");
15489 if (htab
->elf
.dynamic_sections_created
)
15491 Elf64_External_Dyn
*dyncon
, *dynconend
;
15493 if (sdyn
== NULL
|| htab
->elf
.sgot
== NULL
)
15496 dyncon
= (Elf64_External_Dyn
*) sdyn
->contents
;
15497 dynconend
= (Elf64_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
15498 for (; dyncon
< dynconend
; dyncon
++)
15500 Elf_Internal_Dyn dyn
;
15503 bfd_elf64_swap_dyn_in (dynobj
, dyncon
, &dyn
);
15510 case DT_PPC64_GLINK
:
15512 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
15513 /* We stupidly defined DT_PPC64_GLINK to be the start
15514 of glink rather than the first entry point, which is
15515 what ld.so needs, and now have a bigger stub to
15516 support automatic multiple TOCs. */
15517 dyn
.d_un
.d_ptr
+= GLINK_CALL_STUB_SIZE
- 8 * 4;
15521 s
= bfd_get_section_by_name (output_bfd
, ".opd");
15524 dyn
.d_un
.d_ptr
= s
->vma
;
15528 if (htab
->do_multi_toc
&& htab
->multi_toc_needed
)
15529 dyn
.d_un
.d_val
|= PPC64_OPT_MULTI_TOC
;
15532 case DT_PPC64_OPDSZ
:
15533 s
= bfd_get_section_by_name (output_bfd
, ".opd");
15536 dyn
.d_un
.d_val
= s
->size
;
15540 s
= htab
->elf
.splt
;
15541 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
15545 s
= htab
->elf
.srelplt
;
15546 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
15550 dyn
.d_un
.d_val
= htab
->elf
.srelplt
->size
;
15554 bfd_elf64_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
15558 if (htab
->elf
.sgot
!= NULL
&& htab
->elf
.sgot
->size
!= 0)
15560 /* Fill in the first entry in the global offset table.
15561 We use it to hold the link-time TOCbase. */
15562 bfd_put_64 (output_bfd
,
15563 elf_gp (output_bfd
) + TOC_BASE_OFF
,
15564 htab
->elf
.sgot
->contents
);
15566 /* Set .got entry size. */
15567 elf_section_data (htab
->elf
.sgot
->output_section
)->this_hdr
.sh_entsize
= 8;
15570 if (htab
->elf
.splt
!= NULL
&& htab
->elf
.splt
->size
!= 0)
15572 /* Set .plt entry size. */
15573 elf_section_data (htab
->elf
.splt
->output_section
)->this_hdr
.sh_entsize
15574 = PLT_ENTRY_SIZE (htab
);
15577 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
15578 brlt ourselves if emitrelocations. */
15579 if (htab
->brlt
!= NULL
15580 && htab
->brlt
->reloc_count
!= 0
15581 && !_bfd_elf_link_output_relocs (output_bfd
,
15583 elf_section_data (htab
->brlt
)->rela
.hdr
,
15584 elf_section_data (htab
->brlt
)->relocs
,
15588 if (htab
->glink
!= NULL
15589 && htab
->glink
->reloc_count
!= 0
15590 && !_bfd_elf_link_output_relocs (output_bfd
,
15592 elf_section_data (htab
->glink
)->rela
.hdr
,
15593 elf_section_data (htab
->glink
)->relocs
,
15597 if (htab
->glink_eh_frame
!= NULL
15598 && htab
->glink_eh_frame
->size
!= 0)
15602 asection
*stub_sec
;
15604 p
= htab
->glink_eh_frame
->contents
+ sizeof (glink_eh_frame_cie
);
15605 for (stub_sec
= htab
->params
->stub_bfd
->sections
;
15607 stub_sec
= stub_sec
->next
)
15608 if ((stub_sec
->flags
& SEC_LINKER_CREATED
) == 0)
15614 /* Offset to stub section. */
15615 val
= (stub_sec
->output_section
->vma
15616 + stub_sec
->output_offset
);
15617 val
-= (htab
->glink_eh_frame
->output_section
->vma
15618 + htab
->glink_eh_frame
->output_offset
15619 + (p
- htab
->glink_eh_frame
->contents
));
15620 if (val
+ 0x80000000 > 0xffffffff)
15622 info
->callbacks
->einfo
15623 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15627 bfd_put_32 (dynobj
, val
, p
);
15629 /* stub section size. */
15631 /* Augmentation. */
15636 if (htab
->glink
!= NULL
&& htab
->glink
->size
!= 0)
15642 /* Offset to .glink. */
15643 val
= (htab
->glink
->output_section
->vma
15644 + htab
->glink
->output_offset
15646 val
-= (htab
->glink_eh_frame
->output_section
->vma
15647 + htab
->glink_eh_frame
->output_offset
15648 + (p
- htab
->glink_eh_frame
->contents
));
15649 if (val
+ 0x80000000 > 0xffffffff)
15651 info
->callbacks
->einfo
15652 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15653 htab
->glink
->name
);
15656 bfd_put_32 (dynobj
, val
, p
);
15660 /* Augmentation. */
15666 if (htab
->glink_eh_frame
->sec_info_type
== SEC_INFO_TYPE_EH_FRAME
15667 && !_bfd_elf_write_section_eh_frame (output_bfd
, info
,
15668 htab
->glink_eh_frame
,
15669 htab
->glink_eh_frame
->contents
))
15673 /* We need to handle writing out multiple GOT sections ourselves,
15674 since we didn't add them to DYNOBJ. We know dynobj is the first
15676 while ((dynobj
= dynobj
->link
.next
) != NULL
)
15680 if (!is_ppc64_elf (dynobj
))
15683 s
= ppc64_elf_tdata (dynobj
)->got
;
15686 && s
->output_section
!= bfd_abs_section_ptr
15687 && !bfd_set_section_contents (output_bfd
, s
->output_section
,
15688 s
->contents
, s
->output_offset
,
15691 s
= ppc64_elf_tdata (dynobj
)->relgot
;
15694 && s
->output_section
!= bfd_abs_section_ptr
15695 && !bfd_set_section_contents (output_bfd
, s
->output_section
,
15696 s
->contents
, s
->output_offset
,
15704 #include "elf64-target.h"
15706 /* FreeBSD support */
15708 #undef TARGET_LITTLE_SYM
15709 #undef TARGET_LITTLE_NAME
15711 #undef TARGET_BIG_SYM
15712 #define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
15713 #undef TARGET_BIG_NAME
15714 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15717 #define ELF_OSABI ELFOSABI_FREEBSD
15720 #define elf64_bed elf64_powerpc_fbsd_bed
15722 #include "elf64-target.h"