1 /* PowerPC64-specific support for 64-bit ELF. 2 Copyright (C) 1999-2020 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. 6 7 This file is part of BFD, the Binary File Descriptor library. 8 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. 13 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. 18 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. */ 22 23 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 */ 27 28 #include "sysdep.h" 29 #include <stdarg.h> 30 #include "bfd.h" 31 #include "bfdlink.h" 32 #include "libbfd.h" 33 #include "elf-bfd.h" 34 #include "elf/ppc64.h" 35 #include "elf64-ppc.h" 36 #include "dwarf2.h" 37 38 /* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */ 39 #define OCTETS_PER_BYTE(ABFD, SEC) 1 40 41 static bfd_reloc_status_type ppc64_elf_ha_reloc 42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 43 static bfd_reloc_status_type ppc64_elf_branch_reloc 44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 45 static bfd_reloc_status_type ppc64_elf_brtaken_reloc 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 47 static bfd_reloc_status_type ppc64_elf_sectoff_reloc 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 49 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 51 static bfd_reloc_status_type ppc64_elf_toc_reloc 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 53 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 55 static bfd_reloc_status_type ppc64_elf_toc64_reloc 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 57 static bfd_reloc_status_type ppc64_elf_prefix_reloc 58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 59 static bfd_reloc_status_type ppc64_elf_unhandled_reloc 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 61 static bfd_vma opd_entry_value 62 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean); 63 64 #define TARGET_LITTLE_SYM powerpc_elf64_le_vec 65 #define TARGET_LITTLE_NAME "elf64-powerpcle" 66 #define TARGET_BIG_SYM powerpc_elf64_vec 67 #define TARGET_BIG_NAME "elf64-powerpc" 68 #define ELF_ARCH bfd_arch_powerpc 69 #define ELF_TARGET_ID PPC64_ELF_DATA 70 #define ELF_MACHINE_CODE EM_PPC64 71 #define ELF_MAXPAGESIZE 0x10000 72 #define ELF_COMMONPAGESIZE 0x1000 73 #define ELF_RELROPAGESIZE ELF_MAXPAGESIZE 74 #define elf_info_to_howto ppc64_elf_info_to_howto 75 76 #define elf_backend_want_got_sym 0 77 #define elf_backend_want_plt_sym 0 78 #define elf_backend_plt_alignment 3 79 #define elf_backend_plt_not_loaded 1 80 #define elf_backend_got_header_size 8 81 #define elf_backend_want_dynrelro 1 82 #define elf_backend_can_gc_sections 1 83 #define elf_backend_can_refcount 1 84 #define elf_backend_rela_normal 1 85 #define elf_backend_dtrel_excludes_plt 1 86 #define elf_backend_default_execstack 0 87 88 #define bfd_elf64_mkobject ppc64_elf_mkobject 89 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup 90 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup 91 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data 92 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data 93 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook 94 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create 95 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab 96 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms 97 #define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections 98 99 #define elf_backend_object_p ppc64_elf_object_p 100 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus 101 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo 102 #define elf_backend_write_core_note ppc64_elf_write_core_note 103 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections 104 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol 105 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook 106 #define elf_backend_check_directives ppc64_elf_before_check_relocs 107 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed 108 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup 109 #define elf_backend_check_relocs ppc64_elf_check_relocs 110 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible 111 #define elf_backend_gc_keep ppc64_elf_gc_keep 112 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref 113 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook 114 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol 115 #define elf_backend_hide_symbol ppc64_elf_hide_symbol 116 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym 117 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust 118 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections 119 #define elf_backend_hash_symbol ppc64_elf_hash_symbol 120 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections 121 #define elf_backend_action_discarded ppc64_elf_action_discarded 122 #define elf_backend_relocate_section ppc64_elf_relocate_section 123 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol 124 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class 125 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections 126 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook 127 #define elf_backend_special_sections ppc64_elf_special_sections 128 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute 129 #define elf_backend_merge_symbol ppc64_elf_merge_symbol 130 #define elf_backend_get_reloc_section bfd_get_section_by_name 131 132 /* The name of the dynamic interpreter. This is put in the .interp 133 section. */ 134 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" 135 136 /* The size in bytes of an entry in the procedure linkage table. */ 137 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8) 138 #define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8) 139 140 /* The initial size of the plt reserved for the dynamic linker. */ 141 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16) 142 143 /* Offsets to some stack save slots. */ 144 #define STK_LR 16 145 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24) 146 /* This one is dodgy. ELFv2 does not have a linker word, so use the 147 CR save slot. Used only by optimised __tls_get_addr call stub, 148 relying on __tls_get_addr_opt not saving CR.. */ 149 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8) 150 151 /* TOC base pointers offset from start of TOC. */ 152 #define TOC_BASE_OFF 0x8000 153 /* TOC base alignment. */ 154 #define TOC_BASE_ALIGN 256 155 156 /* Offset of tp and dtp pointers from start of TLS block. */ 157 #define TP_OFFSET 0x7000 158 #define DTP_OFFSET 0x8000 159 160 /* .plt call stub instructions. The normal stub is like this, but 161 sometimes the .plt entry crosses a 64k boundary and we need to 162 insert an addi to adjust r11. */ 163 #define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */ 164 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */ 165 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */ 166 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */ 167 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */ 168 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */ 169 #define BCTR 0x4e800420 /* bctr */ 170 171 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */ 172 #define ADDI_R12_R11 0x398b0000 /* addi %r12,%r11,off@l */ 173 #define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,off@l */ 174 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */ 175 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */ 176 177 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */ 178 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */ 179 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */ 180 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */ 181 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */ 182 #define BNECTR 0x4ca20420 /* bnectr+ */ 183 #define BNECTR_P4 0x4ce20420 /* bnectr+ */ 184 185 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */ 186 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */ 187 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */ 188 189 #define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */ 190 #define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */ 191 #define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */ 192 193 #define LI_R11_0 0x39600000 /* li %r11,0 */ 194 #define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */ 195 #define LIS_R11 0x3d600000 /* lis %r11,xxx@ha */ 196 #define LIS_R12 0x3d800000 /* lis %r12,xxx@ha */ 197 #define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */ 198 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */ 199 #define ADDIS_R12_R11 0x3d8b0000 /* addis %r12,%r11,xxx@ha */ 200 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */ 201 #define ORIS_R12_R12_0 0x658c0000 /* oris %r12,%r12,xxx@hi */ 202 #define ORI_R11_R11_0 0x616b0000 /* ori %r11,%r11,xxx@l */ 203 #define ORI_R12_R12_0 0x618c0000 /* ori %r12,%r12,xxx@l */ 204 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */ 205 #define SLDI_R11_R11_34 0x796b1746 /* sldi %r11,%r11,34 */ 206 #define SLDI_R12_R12_32 0x799c07c6 /* sldi %r12,%r12,32 */ 207 #define LDX_R12_R11_R12 0x7d8b602a /* ldx %r12,%r11,%r12 */ 208 #define ADD_R12_R11_R12 0x7d8b6214 /* add %r12,%r11,%r12 */ 209 #define PADDI_R12_PC 0x0610000039800000ULL 210 #define PLD_R12_PC 0x04100000e5800000ULL 211 #define PNOP 0x0700000000000000ULL 212 213 /* __glink_PLTresolve stub instructions. We enter with the index in R0. */ 214 #define GLINK_PLTRESOLVE_SIZE(htab) \ 215 (8u + (htab->opd_abi ? 11 * 4 : 14 * 4)) 216 /* 0: */ 217 /* .quad plt0-1f */ 218 /* __glink: */ 219 #define MFLR_R12 0x7d8802a6 /* mflr %12 */ 220 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */ 221 /* 1: */ 222 #define MFLR_R11 0x7d6802a6 /* mflr %11 */ 223 /* ld %2,(0b-1b)(%11) */ 224 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */ 225 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */ 226 /* ld %12,0(%11) */ 227 /* ld %2,8(%11) */ 228 /* mtctr %12 */ 229 /* ld %11,16(%11) */ 230 /* bctr */ 231 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */ 232 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */ 233 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */ 234 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */ 235 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */ 236 237 /* Pad with this. */ 238 #define NOP 0x60000000 239 240 /* Some other nops. */ 241 #define CROR_151515 0x4def7b82 242 #define CROR_313131 0x4ffffb82 243 244 /* .glink entries for the first 32k functions are two instructions. */ 245 #define LI_R0_0 0x38000000 /* li %r0,0 */ 246 #define B_DOT 0x48000000 /* b . */ 247 248 /* After that, we need two instructions to load the index, followed by 249 a branch. */ 250 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */ 251 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */ 252 253 /* Instructions used by the save and restore reg functions. */ 254 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */ 255 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */ 256 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */ 257 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */ 258 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */ 259 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */ 260 #define LI_R12_0 0x39800000 /* li %r12,0 */ 261 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */ 262 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */ 263 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */ 264 #define BLR 0x4e800020 /* blr */ 265 266 /* Since .opd is an array of descriptors and each entry will end up 267 with identical R_PPC64_RELATIVE relocs, there is really no need to 268 propagate .opd relocs; The dynamic linker should be taught to 269 relocate .opd without reloc entries. */ 270 #ifndef NO_OPD_RELOCS 271 #define NO_OPD_RELOCS 0 272 #endif 273 274 #ifndef ARRAY_SIZE 275 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) 276 #endif 277 278 static inline int 279 abiversion (bfd *abfd) 280 { 281 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI; 282 } 283 284 static inline void 285 set_abiversion (bfd *abfd, int ver) 286 { 287 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI; 288 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI; 289 } 290 291 /* Relocation HOWTO's. */ 292 /* Like other ELF RELA targets that don't apply multiple 293 field-altering relocations to the same localation, src_mask is 294 always zero and pcrel_offset is the same as pc_relative. 295 PowerPC can always use a zero bitpos, even when the field is not at 296 the LSB. For example, a REL24 could use rightshift=2, bisize=24 297 and bitpos=2 which matches the ABI description, or as we do here, 298 rightshift=0, bitsize=26 and bitpos=0. */ 299 #define HOW(type, size, bitsize, mask, rightshift, pc_relative, \ 300 complain, special_func) \ 301 HOWTO (type, rightshift, size, bitsize, pc_relative, 0, \ 302 complain_overflow_ ## complain, special_func, \ 303 #type, FALSE, 0, mask, pc_relative) 304 305 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max]; 306 307 static reloc_howto_type ppc64_elf_howto_raw[] = 308 { 309 /* This reloc does nothing. */ 310 HOW (R_PPC64_NONE, 3, 0, 0, 0, FALSE, dont, 311 bfd_elf_generic_reloc), 312 313 /* A standard 32 bit relocation. */ 314 HOW (R_PPC64_ADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield, 315 bfd_elf_generic_reloc), 316 317 /* An absolute 26 bit branch; the lower two bits must be zero. 318 FIXME: we don't check that, we just clear them. */ 319 HOW (R_PPC64_ADDR24, 2, 26, 0x03fffffc, 0, FALSE, bitfield, 320 bfd_elf_generic_reloc), 321 322 /* A standard 16 bit relocation. */ 323 HOW (R_PPC64_ADDR16, 1, 16, 0xffff, 0, FALSE, bitfield, 324 bfd_elf_generic_reloc), 325 326 /* A 16 bit relocation without overflow. */ 327 HOW (R_PPC64_ADDR16_LO, 1, 16, 0xffff, 0, FALSE, dont, 328 bfd_elf_generic_reloc), 329 330 /* Bits 16-31 of an address. */ 331 HOW (R_PPC64_ADDR16_HI, 1, 16, 0xffff, 16, FALSE, signed, 332 bfd_elf_generic_reloc), 333 334 /* Bits 16-31 of an address, plus 1 if the contents of the low 16 335 bits, treated as a signed number, is negative. */ 336 HOW (R_PPC64_ADDR16_HA, 1, 16, 0xffff, 16, FALSE, signed, 337 ppc64_elf_ha_reloc), 338 339 /* An absolute 16 bit branch; the lower two bits must be zero. 340 FIXME: we don't check that, we just clear them. */ 341 HOW (R_PPC64_ADDR14, 2, 16, 0x0000fffc, 0, FALSE, signed, 342 ppc64_elf_branch_reloc), 343 344 /* An absolute 16 bit branch, for which bit 10 should be set to 345 indicate that the branch is expected to be taken. The lower two 346 bits must be zero. */ 347 HOW (R_PPC64_ADDR14_BRTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed, 348 ppc64_elf_brtaken_reloc), 349 350 /* An absolute 16 bit branch, for which bit 10 should be set to 351 indicate that the branch is not expected to be taken. The lower 352 two bits must be zero. */ 353 HOW (R_PPC64_ADDR14_BRNTAKEN, 2, 16, 0x0000fffc, 0, FALSE, signed, 354 ppc64_elf_brtaken_reloc), 355 356 /* A relative 26 bit branch; the lower two bits must be zero. */ 357 HOW (R_PPC64_REL24, 2, 26, 0x03fffffc, 0, TRUE, signed, 358 ppc64_elf_branch_reloc), 359 360 /* A variant of R_PPC64_REL24, used when r2 is not the toc pointer. */ 361 HOW (R_PPC64_REL24_NOTOC, 2, 26, 0x03fffffc, 0, TRUE, signed, 362 ppc64_elf_branch_reloc), 363 364 /* A relative 16 bit branch; the lower two bits must be zero. */ 365 HOW (R_PPC64_REL14, 2, 16, 0x0000fffc, 0, TRUE, signed, 366 ppc64_elf_branch_reloc), 367 368 /* A relative 16 bit branch. Bit 10 should be set to indicate that 369 the branch is expected to be taken. The lower two bits must be 370 zero. */ 371 HOW (R_PPC64_REL14_BRTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed, 372 ppc64_elf_brtaken_reloc), 373 374 /* A relative 16 bit branch. Bit 10 should be set to indicate that 375 the branch is not expected to be taken. The lower two bits must 376 be zero. */ 377 HOW (R_PPC64_REL14_BRNTAKEN, 2, 16, 0x0000fffc, 0, TRUE, signed, 378 ppc64_elf_brtaken_reloc), 379 380 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the 381 symbol. */ 382 HOW (R_PPC64_GOT16, 1, 16, 0xffff, 0, FALSE, signed, 383 ppc64_elf_unhandled_reloc), 384 385 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for 386 the symbol. */ 387 HOW (R_PPC64_GOT16_LO, 1, 16, 0xffff, 0, FALSE, dont, 388 ppc64_elf_unhandled_reloc), 389 390 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for 391 the symbol. */ 392 HOW (R_PPC64_GOT16_HI, 1, 16, 0xffff, 16, FALSE, signed, 393 ppc64_elf_unhandled_reloc), 394 395 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for 396 the symbol. */ 397 HOW (R_PPC64_GOT16_HA, 1, 16, 0xffff, 16, FALSE, signed, 398 ppc64_elf_unhandled_reloc), 399 400 /* This is used only by the dynamic linker. The symbol should exist 401 both in the object being run and in some shared library. The 402 dynamic linker copies the data addressed by the symbol from the 403 shared library into the object, because the object being 404 run has to have the data at some particular address. */ 405 HOW (R_PPC64_COPY, 0, 0, 0, 0, FALSE, dont, 406 ppc64_elf_unhandled_reloc), 407 408 /* Like R_PPC64_ADDR64, but used when setting global offset table 409 entries. */ 410 HOW (R_PPC64_GLOB_DAT, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 411 ppc64_elf_unhandled_reloc), 412 413 /* Created by the link editor. Marks a procedure linkage table 414 entry for a symbol. */ 415 HOW (R_PPC64_JMP_SLOT, 0, 0, 0, 0, FALSE, dont, 416 ppc64_elf_unhandled_reloc), 417 418 /* Used only by the dynamic linker. When the object is run, this 419 doubleword64 is set to the load address of the object, plus the 420 addend. */ 421 HOW (R_PPC64_RELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 422 bfd_elf_generic_reloc), 423 424 /* Like R_PPC64_ADDR32, but may be unaligned. */ 425 HOW (R_PPC64_UADDR32, 2, 32, 0xffffffff, 0, FALSE, bitfield, 426 bfd_elf_generic_reloc), 427 428 /* Like R_PPC64_ADDR16, but may be unaligned. */ 429 HOW (R_PPC64_UADDR16, 1, 16, 0xffff, 0, FALSE, bitfield, 430 bfd_elf_generic_reloc), 431 432 /* 32-bit PC relative. */ 433 HOW (R_PPC64_REL32, 2, 32, 0xffffffff, 0, TRUE, signed, 434 bfd_elf_generic_reloc), 435 436 /* 32-bit relocation to the symbol's procedure linkage table. */ 437 HOW (R_PPC64_PLT32, 2, 32, 0xffffffff, 0, FALSE, bitfield, 438 ppc64_elf_unhandled_reloc), 439 440 /* 32-bit PC relative relocation to the symbol's procedure linkage table. 441 FIXME: R_PPC64_PLTREL32 not supported. */ 442 HOW (R_PPC64_PLTREL32, 2, 32, 0xffffffff, 0, TRUE, signed, 443 ppc64_elf_unhandled_reloc), 444 445 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for 446 the symbol. */ 447 HOW (R_PPC64_PLT16_LO, 1, 16, 0xffff, 0, FALSE, dont, 448 ppc64_elf_unhandled_reloc), 449 450 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for 451 the symbol. */ 452 HOW (R_PPC64_PLT16_HI, 1, 16, 0xffff, 16, FALSE, signed, 453 ppc64_elf_unhandled_reloc), 454 455 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for 456 the symbol. */ 457 HOW (R_PPC64_PLT16_HA, 1, 16, 0xffff, 16, FALSE, signed, 458 ppc64_elf_unhandled_reloc), 459 460 /* 16-bit section relative relocation. */ 461 HOW (R_PPC64_SECTOFF, 1, 16, 0xffff, 0, FALSE, signed, 462 ppc64_elf_sectoff_reloc), 463 464 /* Like R_PPC64_SECTOFF, but no overflow warning. */ 465 HOW (R_PPC64_SECTOFF_LO, 1, 16, 0xffff, 0, FALSE, dont, 466 ppc64_elf_sectoff_reloc), 467 468 /* 16-bit upper half section relative relocation. */ 469 HOW (R_PPC64_SECTOFF_HI, 1, 16, 0xffff, 16, FALSE, signed, 470 ppc64_elf_sectoff_reloc), 471 472 /* 16-bit upper half adjusted section relative relocation. */ 473 HOW (R_PPC64_SECTOFF_HA, 1, 16, 0xffff, 16, FALSE, signed, 474 ppc64_elf_sectoff_ha_reloc), 475 476 /* Like R_PPC64_REL24 without touching the two least significant bits. */ 477 HOW (R_PPC64_REL30, 2, 30, 0xfffffffc, 2, TRUE, dont, 478 bfd_elf_generic_reloc), 479 480 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */ 481 482 /* A standard 64-bit relocation. */ 483 HOW (R_PPC64_ADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 484 bfd_elf_generic_reloc), 485 486 /* The bits 32-47 of an address. */ 487 HOW (R_PPC64_ADDR16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont, 488 bfd_elf_generic_reloc), 489 490 /* The bits 32-47 of an address, plus 1 if the contents of the low 491 16 bits, treated as a signed number, is negative. */ 492 HOW (R_PPC64_ADDR16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont, 493 ppc64_elf_ha_reloc), 494 495 /* The bits 48-63 of an address. */ 496 HOW (R_PPC64_ADDR16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont, 497 bfd_elf_generic_reloc), 498 499 /* The bits 48-63 of an address, plus 1 if the contents of the low 500 16 bits, treated as a signed number, is negative. */ 501 HOW (R_PPC64_ADDR16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont, 502 ppc64_elf_ha_reloc), 503 504 /* Like ADDR64, but may be unaligned. */ 505 HOW (R_PPC64_UADDR64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 506 bfd_elf_generic_reloc), 507 508 /* 64-bit relative relocation. */ 509 HOW (R_PPC64_REL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont, 510 bfd_elf_generic_reloc), 511 512 /* 64-bit relocation to the symbol's procedure linkage table. */ 513 HOW (R_PPC64_PLT64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 514 ppc64_elf_unhandled_reloc), 515 516 /* 64-bit PC relative relocation to the symbol's procedure linkage 517 table. */ 518 /* FIXME: R_PPC64_PLTREL64 not supported. */ 519 HOW (R_PPC64_PLTREL64, 4, 64, 0xffffffffffffffffULL, 0, TRUE, dont, 520 ppc64_elf_unhandled_reloc), 521 522 /* 16 bit TOC-relative relocation. */ 523 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */ 524 HOW (R_PPC64_TOC16, 1, 16, 0xffff, 0, FALSE, signed, 525 ppc64_elf_toc_reloc), 526 527 /* 16 bit TOC-relative relocation without overflow. */ 528 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */ 529 HOW (R_PPC64_TOC16_LO, 1, 16, 0xffff, 0, FALSE, dont, 530 ppc64_elf_toc_reloc), 531 532 /* 16 bit TOC-relative relocation, high 16 bits. */ 533 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */ 534 HOW (R_PPC64_TOC16_HI, 1, 16, 0xffff, 16, FALSE, signed, 535 ppc64_elf_toc_reloc), 536 537 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the 538 contents of the low 16 bits, treated as a signed number, is 539 negative. */ 540 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */ 541 HOW (R_PPC64_TOC16_HA, 1, 16, 0xffff, 16, FALSE, signed, 542 ppc64_elf_toc_ha_reloc), 543 544 /* 64-bit relocation; insert value of TOC base (.TOC.). */ 545 /* R_PPC64_TOC 51 doubleword64 .TOC. */ 546 HOW (R_PPC64_TOC, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 547 ppc64_elf_toc64_reloc), 548 549 /* Like R_PPC64_GOT16, but also informs the link editor that the 550 value to relocate may (!) refer to a PLT entry which the link 551 editor (a) may replace with the symbol value. If the link editor 552 is unable to fully resolve the symbol, it may (b) create a PLT 553 entry and store the address to the new PLT entry in the GOT. 554 This permits lazy resolution of function symbols at run time. 555 The link editor may also skip all of this and just (c) emit a 556 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */ 557 /* FIXME: R_PPC64_PLTGOT16 not implemented. */ 558 HOW (R_PPC64_PLTGOT16, 1, 16, 0xffff, 0, FALSE,signed, 559 ppc64_elf_unhandled_reloc), 560 561 /* Like R_PPC64_PLTGOT16, but without overflow. */ 562 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */ 563 HOW (R_PPC64_PLTGOT16_LO, 1, 16, 0xffff, 0, FALSE, dont, 564 ppc64_elf_unhandled_reloc), 565 566 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */ 567 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */ 568 HOW (R_PPC64_PLTGOT16_HI, 1, 16, 0xffff, 16, FALSE, signed, 569 ppc64_elf_unhandled_reloc), 570 571 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus 572 1 if the contents of the low 16 bits, treated as a signed number, 573 is negative. */ 574 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */ 575 HOW (R_PPC64_PLTGOT16_HA, 1, 16, 0xffff, 16, FALSE, signed, 576 ppc64_elf_unhandled_reloc), 577 578 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */ 579 HOW (R_PPC64_ADDR16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 580 bfd_elf_generic_reloc), 581 582 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */ 583 HOW (R_PPC64_ADDR16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 584 bfd_elf_generic_reloc), 585 586 /* Like R_PPC64_GOT16, but for instructions with a DS field. */ 587 HOW (R_PPC64_GOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 588 ppc64_elf_unhandled_reloc), 589 590 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */ 591 HOW (R_PPC64_GOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 592 ppc64_elf_unhandled_reloc), 593 594 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */ 595 HOW (R_PPC64_PLT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 596 ppc64_elf_unhandled_reloc), 597 598 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */ 599 HOW (R_PPC64_SECTOFF_DS, 1, 16, 0xfffc, 0, FALSE, signed, 600 ppc64_elf_sectoff_reloc), 601 602 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */ 603 HOW (R_PPC64_SECTOFF_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 604 ppc64_elf_sectoff_reloc), 605 606 /* Like R_PPC64_TOC16, but for instructions with a DS field. */ 607 HOW (R_PPC64_TOC16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 608 ppc64_elf_toc_reloc), 609 610 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */ 611 HOW (R_PPC64_TOC16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 612 ppc64_elf_toc_reloc), 613 614 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */ 615 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */ 616 HOW (R_PPC64_PLTGOT16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 617 ppc64_elf_unhandled_reloc), 618 619 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */ 620 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */ 621 HOW (R_PPC64_PLTGOT16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 622 ppc64_elf_unhandled_reloc), 623 624 /* Marker relocs for TLS. */ 625 HOW (R_PPC64_TLS, 2, 32, 0, 0, FALSE, dont, 626 bfd_elf_generic_reloc), 627 628 HOW (R_PPC64_TLSGD, 2, 32, 0, 0, FALSE, dont, 629 bfd_elf_generic_reloc), 630 631 HOW (R_PPC64_TLSLD, 2, 32, 0, 0, FALSE, dont, 632 bfd_elf_generic_reloc), 633 634 /* Marker reloc for optimizing r2 save in prologue rather than on 635 each plt call stub. */ 636 HOW (R_PPC64_TOCSAVE, 2, 32, 0, 0, FALSE, dont, 637 bfd_elf_generic_reloc), 638 639 /* Marker relocs on inline plt call instructions. */ 640 HOW (R_PPC64_PLTSEQ, 2, 32, 0, 0, FALSE, dont, 641 bfd_elf_generic_reloc), 642 643 HOW (R_PPC64_PLTCALL, 2, 32, 0, 0, FALSE, dont, 644 bfd_elf_generic_reloc), 645 646 /* Computes the load module index of the load module that contains the 647 definition of its TLS sym. */ 648 HOW (R_PPC64_DTPMOD64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 649 ppc64_elf_unhandled_reloc), 650 651 /* Computes a dtv-relative displacement, the difference between the value 652 of sym+add and the base address of the thread-local storage block that 653 contains the definition of sym, minus 0x8000. */ 654 HOW (R_PPC64_DTPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 655 ppc64_elf_unhandled_reloc), 656 657 /* A 16 bit dtprel reloc. */ 658 HOW (R_PPC64_DTPREL16, 1, 16, 0xffff, 0, FALSE, signed, 659 ppc64_elf_unhandled_reloc), 660 661 /* Like DTPREL16, but no overflow. */ 662 HOW (R_PPC64_DTPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont, 663 ppc64_elf_unhandled_reloc), 664 665 /* Like DTPREL16_LO, but next higher group of 16 bits. */ 666 HOW (R_PPC64_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed, 667 ppc64_elf_unhandled_reloc), 668 669 /* Like DTPREL16_HI, but adjust for low 16 bits. */ 670 HOW (R_PPC64_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed, 671 ppc64_elf_unhandled_reloc), 672 673 /* Like DTPREL16_HI, but next higher group of 16 bits. */ 674 HOW (R_PPC64_DTPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont, 675 ppc64_elf_unhandled_reloc), 676 677 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */ 678 HOW (R_PPC64_DTPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont, 679 ppc64_elf_unhandled_reloc), 680 681 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */ 682 HOW (R_PPC64_DTPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont, 683 ppc64_elf_unhandled_reloc), 684 685 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */ 686 HOW (R_PPC64_DTPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont, 687 ppc64_elf_unhandled_reloc), 688 689 /* Like DTPREL16, but for insns with a DS field. */ 690 HOW (R_PPC64_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 691 ppc64_elf_unhandled_reloc), 692 693 /* Like DTPREL16_DS, but no overflow. */ 694 HOW (R_PPC64_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 695 ppc64_elf_unhandled_reloc), 696 697 /* Computes a tp-relative displacement, the difference between the value of 698 sym+add and the value of the thread pointer (r13). */ 699 HOW (R_PPC64_TPREL64, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 700 ppc64_elf_unhandled_reloc), 701 702 /* A 16 bit tprel reloc. */ 703 HOW (R_PPC64_TPREL16, 1, 16, 0xffff, 0, FALSE, signed, 704 ppc64_elf_unhandled_reloc), 705 706 /* Like TPREL16, but no overflow. */ 707 HOW (R_PPC64_TPREL16_LO, 1, 16, 0xffff, 0, FALSE, dont, 708 ppc64_elf_unhandled_reloc), 709 710 /* Like TPREL16_LO, but next higher group of 16 bits. */ 711 HOW (R_PPC64_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed, 712 ppc64_elf_unhandled_reloc), 713 714 /* Like TPREL16_HI, but adjust for low 16 bits. */ 715 HOW (R_PPC64_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed, 716 ppc64_elf_unhandled_reloc), 717 718 /* Like TPREL16_HI, but next higher group of 16 bits. */ 719 HOW (R_PPC64_TPREL16_HIGHER, 1, 16, 0xffff, 32, FALSE, dont, 720 ppc64_elf_unhandled_reloc), 721 722 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */ 723 HOW (R_PPC64_TPREL16_HIGHERA, 1, 16, 0xffff, 32, FALSE, dont, 724 ppc64_elf_unhandled_reloc), 725 726 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */ 727 HOW (R_PPC64_TPREL16_HIGHEST, 1, 16, 0xffff, 48, FALSE, dont, 728 ppc64_elf_unhandled_reloc), 729 730 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */ 731 HOW (R_PPC64_TPREL16_HIGHESTA, 1, 16, 0xffff, 48, FALSE, dont, 732 ppc64_elf_unhandled_reloc), 733 734 /* Like TPREL16, but for insns with a DS field. */ 735 HOW (R_PPC64_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 736 ppc64_elf_unhandled_reloc), 737 738 /* Like TPREL16_DS, but no overflow. */ 739 HOW (R_PPC64_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 740 ppc64_elf_unhandled_reloc), 741 742 /* Allocates two contiguous entries in the GOT to hold a tls_index structure, 743 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset 744 to the first entry relative to the TOC base (r2). */ 745 HOW (R_PPC64_GOT_TLSGD16, 1, 16, 0xffff, 0, FALSE, signed, 746 ppc64_elf_unhandled_reloc), 747 748 /* Like GOT_TLSGD16, but no overflow. */ 749 HOW (R_PPC64_GOT_TLSGD16_LO, 1, 16, 0xffff, 0, FALSE, dont, 750 ppc64_elf_unhandled_reloc), 751 752 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */ 753 HOW (R_PPC64_GOT_TLSGD16_HI, 1, 16, 0xffff, 16, FALSE, signed, 754 ppc64_elf_unhandled_reloc), 755 756 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */ 757 HOW (R_PPC64_GOT_TLSGD16_HA, 1, 16, 0xffff, 16, FALSE, signed, 758 ppc64_elf_unhandled_reloc), 759 760 /* Allocates two contiguous entries in the GOT to hold a tls_index structure, 761 with values (sym+add)@dtpmod and zero, and computes the offset to the 762 first entry relative to the TOC base (r2). */ 763 HOW (R_PPC64_GOT_TLSLD16, 1, 16, 0xffff, 0, FALSE, signed, 764 ppc64_elf_unhandled_reloc), 765 766 /* Like GOT_TLSLD16, but no overflow. */ 767 HOW (R_PPC64_GOT_TLSLD16_LO, 1, 16, 0xffff, 0, FALSE, dont, 768 ppc64_elf_unhandled_reloc), 769 770 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */ 771 HOW (R_PPC64_GOT_TLSLD16_HI, 1, 16, 0xffff, 16, FALSE, signed, 772 ppc64_elf_unhandled_reloc), 773 774 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */ 775 HOW (R_PPC64_GOT_TLSLD16_HA, 1, 16, 0xffff, 16, FALSE, signed, 776 ppc64_elf_unhandled_reloc), 777 778 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes 779 the offset to the entry relative to the TOC base (r2). */ 780 HOW (R_PPC64_GOT_DTPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 781 ppc64_elf_unhandled_reloc), 782 783 /* Like GOT_DTPREL16_DS, but no overflow. */ 784 HOW (R_PPC64_GOT_DTPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 785 ppc64_elf_unhandled_reloc), 786 787 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */ 788 HOW (R_PPC64_GOT_DTPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed, 789 ppc64_elf_unhandled_reloc), 790 791 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */ 792 HOW (R_PPC64_GOT_DTPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed, 793 ppc64_elf_unhandled_reloc), 794 795 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the 796 offset to the entry relative to the TOC base (r2). */ 797 HOW (R_PPC64_GOT_TPREL16_DS, 1, 16, 0xfffc, 0, FALSE, signed, 798 ppc64_elf_unhandled_reloc), 799 800 /* Like GOT_TPREL16_DS, but no overflow. */ 801 HOW (R_PPC64_GOT_TPREL16_LO_DS, 1, 16, 0xfffc, 0, FALSE, dont, 802 ppc64_elf_unhandled_reloc), 803 804 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */ 805 HOW (R_PPC64_GOT_TPREL16_HI, 1, 16, 0xffff, 16, FALSE, signed, 806 ppc64_elf_unhandled_reloc), 807 808 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */ 809 HOW (R_PPC64_GOT_TPREL16_HA, 1, 16, 0xffff, 16, FALSE, signed, 810 ppc64_elf_unhandled_reloc), 811 812 HOW (R_PPC64_JMP_IREL, 0, 0, 0, 0, FALSE, dont, 813 ppc64_elf_unhandled_reloc), 814 815 HOW (R_PPC64_IRELATIVE, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 816 bfd_elf_generic_reloc), 817 818 /* A 16 bit relative relocation. */ 819 HOW (R_PPC64_REL16, 1, 16, 0xffff, 0, TRUE, signed, 820 bfd_elf_generic_reloc), 821 822 /* A 16 bit relative relocation without overflow. */ 823 HOW (R_PPC64_REL16_LO, 1, 16, 0xffff, 0, TRUE, dont, 824 bfd_elf_generic_reloc), 825 826 /* The high order 16 bits of a relative address. */ 827 HOW (R_PPC64_REL16_HI, 1, 16, 0xffff, 16, TRUE, signed, 828 bfd_elf_generic_reloc), 829 830 /* The high order 16 bits of a relative address, plus 1 if the contents of 831 the low 16 bits, treated as a signed number, is negative. */ 832 HOW (R_PPC64_REL16_HA, 1, 16, 0xffff, 16, TRUE, signed, 833 ppc64_elf_ha_reloc), 834 835 HOW (R_PPC64_REL16_HIGH, 1, 16, 0xffff, 16, TRUE, dont, 836 bfd_elf_generic_reloc), 837 838 HOW (R_PPC64_REL16_HIGHA, 1, 16, 0xffff, 16, TRUE, dont, 839 ppc64_elf_ha_reloc), 840 841 HOW (R_PPC64_REL16_HIGHER, 1, 16, 0xffff, 32, TRUE, dont, 842 bfd_elf_generic_reloc), 843 844 HOW (R_PPC64_REL16_HIGHERA, 1, 16, 0xffff, 32, TRUE, dont, 845 ppc64_elf_ha_reloc), 846 847 HOW (R_PPC64_REL16_HIGHEST, 1, 16, 0xffff, 48, TRUE, dont, 848 bfd_elf_generic_reloc), 849 850 HOW (R_PPC64_REL16_HIGHESTA, 1, 16, 0xffff, 48, TRUE, dont, 851 ppc64_elf_ha_reloc), 852 853 /* Like R_PPC64_REL16_HA but for split field in addpcis. */ 854 HOW (R_PPC64_REL16DX_HA, 2, 16, 0x1fffc1, 16, TRUE, signed, 855 ppc64_elf_ha_reloc), 856 857 /* A split-field reloc for addpcis, non-relative (gas internal use only). */ 858 HOW (R_PPC64_16DX_HA, 2, 16, 0x1fffc1, 16, FALSE, signed, 859 ppc64_elf_ha_reloc), 860 861 /* Like R_PPC64_ADDR16_HI, but no overflow. */ 862 HOW (R_PPC64_ADDR16_HIGH, 1, 16, 0xffff, 16, FALSE, dont, 863 bfd_elf_generic_reloc), 864 865 /* Like R_PPC64_ADDR16_HA, but no overflow. */ 866 HOW (R_PPC64_ADDR16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont, 867 ppc64_elf_ha_reloc), 868 869 /* Like R_PPC64_DTPREL16_HI, but no overflow. */ 870 HOW (R_PPC64_DTPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont, 871 ppc64_elf_unhandled_reloc), 872 873 /* Like R_PPC64_DTPREL16_HA, but no overflow. */ 874 HOW (R_PPC64_DTPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont, 875 ppc64_elf_unhandled_reloc), 876 877 /* Like R_PPC64_TPREL16_HI, but no overflow. */ 878 HOW (R_PPC64_TPREL16_HIGH, 1, 16, 0xffff, 16, FALSE, dont, 879 ppc64_elf_unhandled_reloc), 880 881 /* Like R_PPC64_TPREL16_HA, but no overflow. */ 882 HOW (R_PPC64_TPREL16_HIGHA, 1, 16, 0xffff, 16, FALSE, dont, 883 ppc64_elf_unhandled_reloc), 884 885 /* Marker reloc on ELFv2 large-model function entry. */ 886 HOW (R_PPC64_ENTRY, 2, 32, 0, 0, FALSE, dont, 887 bfd_elf_generic_reloc), 888 889 /* Like ADDR64, but use local entry point of function. */ 890 HOW (R_PPC64_ADDR64_LOCAL, 4, 64, 0xffffffffffffffffULL, 0, FALSE, dont, 891 bfd_elf_generic_reloc), 892 893 HOW (R_PPC64_PLTSEQ_NOTOC, 2, 32, 0, 0, FALSE, dont, 894 bfd_elf_generic_reloc), 895 896 HOW (R_PPC64_PLTCALL_NOTOC, 2, 32, 0, 0, FALSE, dont, 897 bfd_elf_generic_reloc), 898 899 HOW (R_PPC64_PCREL_OPT, 2, 32, 0, 0, FALSE, dont, 900 bfd_elf_generic_reloc), 901 902 HOW (R_PPC64_D34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed, 903 ppc64_elf_prefix_reloc), 904 905 HOW (R_PPC64_D34_LO, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, dont, 906 ppc64_elf_prefix_reloc), 907 908 HOW (R_PPC64_D34_HI30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont, 909 ppc64_elf_prefix_reloc), 910 911 HOW (R_PPC64_D34_HA30, 4, 34, 0x3ffff0000ffffULL, 34, FALSE, dont, 912 ppc64_elf_prefix_reloc), 913 914 HOW (R_PPC64_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 915 ppc64_elf_prefix_reloc), 916 917 HOW (R_PPC64_GOT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 918 ppc64_elf_unhandled_reloc), 919 920 HOW (R_PPC64_PLT_PCREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 921 ppc64_elf_unhandled_reloc), 922 923 HOW (R_PPC64_PLT_PCREL34_NOTOC, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 924 ppc64_elf_unhandled_reloc), 925 926 HOW (R_PPC64_TPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed, 927 ppc64_elf_unhandled_reloc), 928 929 HOW (R_PPC64_DTPREL34, 4, 34, 0x3ffff0000ffffULL, 0, FALSE, signed, 930 ppc64_elf_unhandled_reloc), 931 932 HOW (R_PPC64_GOT_TLSGD34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 933 ppc64_elf_unhandled_reloc), 934 935 HOW (R_PPC64_GOT_TLSLD34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 936 ppc64_elf_unhandled_reloc), 937 938 HOW (R_PPC64_GOT_TPREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 939 ppc64_elf_unhandled_reloc), 940 941 HOW (R_PPC64_GOT_DTPREL34, 4, 34, 0x3ffff0000ffffULL, 0, TRUE, signed, 942 ppc64_elf_unhandled_reloc), 943 944 HOW (R_PPC64_ADDR16_HIGHER34, 1, 16, 0xffff, 34, FALSE, dont, 945 bfd_elf_generic_reloc), 946 947 HOW (R_PPC64_ADDR16_HIGHERA34, 1, 16, 0xffff, 34, FALSE, dont, 948 ppc64_elf_ha_reloc), 949 950 HOW (R_PPC64_ADDR16_HIGHEST34, 1, 16, 0xffff, 50, FALSE, dont, 951 bfd_elf_generic_reloc), 952 953 HOW (R_PPC64_ADDR16_HIGHESTA34, 1, 16, 0xffff, 50, FALSE, dont, 954 ppc64_elf_ha_reloc), 955 956 HOW (R_PPC64_REL16_HIGHER34, 1, 16, 0xffff, 34, TRUE, dont, 957 bfd_elf_generic_reloc), 958 959 HOW (R_PPC64_REL16_HIGHERA34, 1, 16, 0xffff, 34, TRUE, dont, 960 ppc64_elf_ha_reloc), 961 962 HOW (R_PPC64_REL16_HIGHEST34, 1, 16, 0xffff, 50, TRUE, dont, 963 bfd_elf_generic_reloc), 964 965 HOW (R_PPC64_REL16_HIGHESTA34, 1, 16, 0xffff, 50, TRUE, dont, 966 ppc64_elf_ha_reloc), 967 968 HOW (R_PPC64_D28, 4, 28, 0xfff0000ffffULL, 0, FALSE, signed, 969 ppc64_elf_prefix_reloc), 970 971 HOW (R_PPC64_PCREL28, 4, 28, 0xfff0000ffffULL, 0, TRUE, signed, 972 ppc64_elf_prefix_reloc), 973 974 /* GNU extension to record C++ vtable hierarchy. */ 975 HOW (R_PPC64_GNU_VTINHERIT, 0, 0, 0, 0, FALSE, dont, 976 NULL), 977 978 /* GNU extension to record C++ vtable member usage. */ 979 HOW (R_PPC64_GNU_VTENTRY, 0, 0, 0, 0, FALSE, dont, 980 NULL), 981 }; 982 983 984 /* Initialize the ppc64_elf_howto_table, so that linear accesses can 985 be done. */ 986 987 static void 988 ppc_howto_init (void) 989 { 990 unsigned int i, type; 991 992 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++) 993 { 994 type = ppc64_elf_howto_raw[i].type; 995 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table)); 996 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i]; 997 } 998 } 999 1000 static reloc_howto_type * 1001 ppc64_elf_reloc_type_lookup (bfd *abfd, 1002 bfd_reloc_code_real_type code) 1003 { 1004 enum elf_ppc64_reloc_type r = R_PPC64_NONE; 1005 1006 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 1007 /* Initialize howto table if needed. */ 1008 ppc_howto_init (); 1009 1010 switch (code) 1011 { 1012 default: 1013 /* xgettext:c-format */ 1014 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, 1015 (int) code); 1016 bfd_set_error (bfd_error_bad_value); 1017 return NULL; 1018 1019 case BFD_RELOC_NONE: r = R_PPC64_NONE; 1020 break; 1021 case BFD_RELOC_32: r = R_PPC64_ADDR32; 1022 break; 1023 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24; 1024 break; 1025 case BFD_RELOC_16: r = R_PPC64_ADDR16; 1026 break; 1027 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO; 1028 break; 1029 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI; 1030 break; 1031 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH; 1032 break; 1033 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA; 1034 break; 1035 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA; 1036 break; 1037 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14; 1038 break; 1039 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN; 1040 break; 1041 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN; 1042 break; 1043 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24; 1044 break; 1045 case BFD_RELOC_PPC64_REL24_NOTOC: r = R_PPC64_REL24_NOTOC; 1046 break; 1047 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14; 1048 break; 1049 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN; 1050 break; 1051 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN; 1052 break; 1053 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16; 1054 break; 1055 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO; 1056 break; 1057 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI; 1058 break; 1059 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA; 1060 break; 1061 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY; 1062 break; 1063 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT; 1064 break; 1065 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32; 1066 break; 1067 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32; 1068 break; 1069 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32; 1070 break; 1071 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO; 1072 break; 1073 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI; 1074 break; 1075 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA; 1076 break; 1077 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF; 1078 break; 1079 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO; 1080 break; 1081 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI; 1082 break; 1083 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA; 1084 break; 1085 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64; 1086 break; 1087 case BFD_RELOC_64: r = R_PPC64_ADDR64; 1088 break; 1089 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER; 1090 break; 1091 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA; 1092 break; 1093 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST; 1094 break; 1095 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA; 1096 break; 1097 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64; 1098 break; 1099 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64; 1100 break; 1101 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64; 1102 break; 1103 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16; 1104 break; 1105 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO; 1106 break; 1107 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI; 1108 break; 1109 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA; 1110 break; 1111 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC; 1112 break; 1113 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16; 1114 break; 1115 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO; 1116 break; 1117 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI; 1118 break; 1119 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA; 1120 break; 1121 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS; 1122 break; 1123 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS; 1124 break; 1125 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS; 1126 break; 1127 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS; 1128 break; 1129 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS; 1130 break; 1131 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS; 1132 break; 1133 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS; 1134 break; 1135 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS; 1136 break; 1137 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS; 1138 break; 1139 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS; 1140 break; 1141 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS; 1142 break; 1143 case BFD_RELOC_PPC64_TLS_PCREL: 1144 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS; 1145 break; 1146 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD; 1147 break; 1148 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD; 1149 break; 1150 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64; 1151 break; 1152 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16; 1153 break; 1154 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO; 1155 break; 1156 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI; 1157 break; 1158 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH; 1159 break; 1160 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA; 1161 break; 1162 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA; 1163 break; 1164 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64; 1165 break; 1166 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16; 1167 break; 1168 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO; 1169 break; 1170 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI; 1171 break; 1172 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH; 1173 break; 1174 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA; 1175 break; 1176 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA; 1177 break; 1178 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64; 1179 break; 1180 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16; 1181 break; 1182 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO; 1183 break; 1184 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI; 1185 break; 1186 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA; 1187 break; 1188 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16; 1189 break; 1190 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO; 1191 break; 1192 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI; 1193 break; 1194 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA; 1195 break; 1196 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS; 1197 break; 1198 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS; 1199 break; 1200 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI; 1201 break; 1202 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA; 1203 break; 1204 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS; 1205 break; 1206 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS; 1207 break; 1208 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI; 1209 break; 1210 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA; 1211 break; 1212 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS; 1213 break; 1214 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS; 1215 break; 1216 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER; 1217 break; 1218 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA; 1219 break; 1220 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST; 1221 break; 1222 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA; 1223 break; 1224 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS; 1225 break; 1226 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS; 1227 break; 1228 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER; 1229 break; 1230 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA; 1231 break; 1232 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST; 1233 break; 1234 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA; 1235 break; 1236 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16; 1237 break; 1238 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO; 1239 break; 1240 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI; 1241 break; 1242 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA; 1243 break; 1244 case BFD_RELOC_PPC64_REL16_HIGH: r = R_PPC64_REL16_HIGH; 1245 break; 1246 case BFD_RELOC_PPC64_REL16_HIGHA: r = R_PPC64_REL16_HIGHA; 1247 break; 1248 case BFD_RELOC_PPC64_REL16_HIGHER: r = R_PPC64_REL16_HIGHER; 1249 break; 1250 case BFD_RELOC_PPC64_REL16_HIGHERA: r = R_PPC64_REL16_HIGHERA; 1251 break; 1252 case BFD_RELOC_PPC64_REL16_HIGHEST: r = R_PPC64_REL16_HIGHEST; 1253 break; 1254 case BFD_RELOC_PPC64_REL16_HIGHESTA: r = R_PPC64_REL16_HIGHESTA; 1255 break; 1256 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA; 1257 break; 1258 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA; 1259 break; 1260 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY; 1261 break; 1262 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL; 1263 break; 1264 case BFD_RELOC_PPC64_D34: r = R_PPC64_D34; 1265 break; 1266 case BFD_RELOC_PPC64_D34_LO: r = R_PPC64_D34_LO; 1267 break; 1268 case BFD_RELOC_PPC64_D34_HI30: r = R_PPC64_D34_HI30; 1269 break; 1270 case BFD_RELOC_PPC64_D34_HA30: r = R_PPC64_D34_HA30; 1271 break; 1272 case BFD_RELOC_PPC64_PCREL34: r = R_PPC64_PCREL34; 1273 break; 1274 case BFD_RELOC_PPC64_GOT_PCREL34: r = R_PPC64_GOT_PCREL34; 1275 break; 1276 case BFD_RELOC_PPC64_PLT_PCREL34: r = R_PPC64_PLT_PCREL34; 1277 break; 1278 case BFD_RELOC_PPC64_TPREL34: r = R_PPC64_TPREL34; 1279 break; 1280 case BFD_RELOC_PPC64_DTPREL34: r = R_PPC64_DTPREL34; 1281 break; 1282 case BFD_RELOC_PPC64_GOT_TLSGD34: r = R_PPC64_GOT_TLSGD34; 1283 break; 1284 case BFD_RELOC_PPC64_GOT_TLSLD34: r = R_PPC64_GOT_TLSLD34; 1285 break; 1286 case BFD_RELOC_PPC64_GOT_TPREL34: r = R_PPC64_GOT_TPREL34; 1287 break; 1288 case BFD_RELOC_PPC64_GOT_DTPREL34: r = R_PPC64_GOT_DTPREL34; 1289 break; 1290 case BFD_RELOC_PPC64_ADDR16_HIGHER34: r = R_PPC64_ADDR16_HIGHER34; 1291 break; 1292 case BFD_RELOC_PPC64_ADDR16_HIGHERA34: r = R_PPC64_ADDR16_HIGHERA34; 1293 break; 1294 case BFD_RELOC_PPC64_ADDR16_HIGHEST34: r = R_PPC64_ADDR16_HIGHEST34; 1295 break; 1296 case BFD_RELOC_PPC64_ADDR16_HIGHESTA34: r = R_PPC64_ADDR16_HIGHESTA34; 1297 break; 1298 case BFD_RELOC_PPC64_REL16_HIGHER34: r = R_PPC64_REL16_HIGHER34; 1299 break; 1300 case BFD_RELOC_PPC64_REL16_HIGHERA34: r = R_PPC64_REL16_HIGHERA34; 1301 break; 1302 case BFD_RELOC_PPC64_REL16_HIGHEST34: r = R_PPC64_REL16_HIGHEST34; 1303 break; 1304 case BFD_RELOC_PPC64_REL16_HIGHESTA34: r = R_PPC64_REL16_HIGHESTA34; 1305 break; 1306 case BFD_RELOC_PPC64_D28: r = R_PPC64_D28; 1307 break; 1308 case BFD_RELOC_PPC64_PCREL28: r = R_PPC64_PCREL28; 1309 break; 1310 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT; 1311 break; 1312 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY; 1313 break; 1314 } 1315 1316 return ppc64_elf_howto_table[r]; 1317 }; 1318 1319 static reloc_howto_type * 1320 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 1321 const char *r_name) 1322 { 1323 unsigned int i; 1324 1325 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++) 1326 if (ppc64_elf_howto_raw[i].name != NULL 1327 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0) 1328 return &ppc64_elf_howto_raw[i]; 1329 1330 return NULL; 1331 } 1332 1333 /* Set the howto pointer for a PowerPC ELF reloc. */ 1334 1335 static bfd_boolean 1336 ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, 1337 Elf_Internal_Rela *dst) 1338 { 1339 unsigned int type; 1340 1341 /* Initialize howto table if needed. */ 1342 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 1343 ppc_howto_init (); 1344 1345 type = ELF64_R_TYPE (dst->r_info); 1346 if (type >= ARRAY_SIZE (ppc64_elf_howto_table)) 1347 { 1348 /* xgettext:c-format */ 1349 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 1350 abfd, type); 1351 bfd_set_error (bfd_error_bad_value); 1352 return FALSE; 1353 } 1354 cache_ptr->howto = ppc64_elf_howto_table[type]; 1355 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL) 1356 { 1357 /* xgettext:c-format */ 1358 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 1359 abfd, type); 1360 bfd_set_error (bfd_error_bad_value); 1361 return FALSE; 1362 } 1363 1364 return TRUE; 1365 } 1366 1367 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */ 1368 1369 static bfd_reloc_status_type 1370 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1371 void *data, asection *input_section, 1372 bfd *output_bfd, char **error_message) 1373 { 1374 enum elf_ppc64_reloc_type r_type; 1375 long insn; 1376 bfd_size_type octets; 1377 bfd_vma value; 1378 1379 /* If this is a relocatable link (output_bfd test tells us), just 1380 call the generic function. Any adjustment will be done at final 1381 link time. */ 1382 if (output_bfd != NULL) 1383 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1384 input_section, output_bfd, error_message); 1385 1386 /* Adjust the addend for sign extension of the low 16 (or 34) bits. 1387 We won't actually be using the low bits, so trashing them 1388 doesn't matter. */ 1389 r_type = reloc_entry->howto->type; 1390 if (r_type == R_PPC64_ADDR16_HIGHERA34 1391 || r_type == R_PPC64_ADDR16_HIGHESTA34 1392 || r_type == R_PPC64_REL16_HIGHERA34 1393 || r_type == R_PPC64_REL16_HIGHESTA34) 1394 reloc_entry->addend += 1ULL << 33; 1395 else 1396 reloc_entry->addend += 1U << 15; 1397 if (r_type != R_PPC64_REL16DX_HA) 1398 return bfd_reloc_continue; 1399 1400 value = 0; 1401 if (!bfd_is_com_section (symbol->section)) 1402 value = symbol->value; 1403 value += (reloc_entry->addend 1404 + symbol->section->output_offset 1405 + symbol->section->output_section->vma); 1406 value -= (reloc_entry->address 1407 + input_section->output_offset 1408 + input_section->output_section->vma); 1409 value = (bfd_signed_vma) value >> 16; 1410 1411 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section); 1412 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets); 1413 insn &= ~0x1fffc1; 1414 insn |= (value & 0xffc1) | ((value & 0x3e) << 15); 1415 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets); 1416 if (value + 0x8000 > 0xffff) 1417 return bfd_reloc_overflow; 1418 return bfd_reloc_ok; 1419 } 1420 1421 static bfd_reloc_status_type 1422 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1423 void *data, asection *input_section, 1424 bfd *output_bfd, char **error_message) 1425 { 1426 if (output_bfd != NULL) 1427 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1428 input_section, output_bfd, error_message); 1429 1430 if (strcmp (symbol->section->name, ".opd") == 0 1431 && (symbol->section->owner->flags & DYNAMIC) == 0) 1432 { 1433 bfd_vma dest = opd_entry_value (symbol->section, 1434 symbol->value + reloc_entry->addend, 1435 NULL, NULL, FALSE); 1436 if (dest != (bfd_vma) -1) 1437 reloc_entry->addend = dest - (symbol->value 1438 + symbol->section->output_section->vma 1439 + symbol->section->output_offset); 1440 } 1441 else 1442 { 1443 elf_symbol_type *elfsym = (elf_symbol_type *) symbol; 1444 1445 if (symbol->section->owner != abfd 1446 && symbol->section->owner != NULL 1447 && abiversion (symbol->section->owner) >= 2) 1448 { 1449 unsigned int i; 1450 1451 for (i = 0; i < symbol->section->owner->symcount; ++i) 1452 { 1453 asymbol *symdef = symbol->section->owner->outsymbols[i]; 1454 1455 if (strcmp (symdef->name, symbol->name) == 0) 1456 { 1457 elfsym = (elf_symbol_type *) symdef; 1458 break; 1459 } 1460 } 1461 } 1462 reloc_entry->addend 1463 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other); 1464 } 1465 return bfd_reloc_continue; 1466 } 1467 1468 static bfd_reloc_status_type 1469 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1470 void *data, asection *input_section, 1471 bfd *output_bfd, char **error_message) 1472 { 1473 long insn; 1474 enum elf_ppc64_reloc_type r_type; 1475 bfd_size_type octets; 1476 /* Assume 'at' branch hints. */ 1477 bfd_boolean is_isa_v2 = TRUE; 1478 1479 /* If this is a relocatable link (output_bfd test tells us), just 1480 call the generic function. Any adjustment will be done at final 1481 link time. */ 1482 if (output_bfd != NULL) 1483 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1484 input_section, output_bfd, error_message); 1485 1486 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section); 1487 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets); 1488 insn &= ~(0x01 << 21); 1489 r_type = reloc_entry->howto->type; 1490 if (r_type == R_PPC64_ADDR14_BRTAKEN 1491 || r_type == R_PPC64_REL14_BRTAKEN) 1492 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */ 1493 1494 if (is_isa_v2) 1495 { 1496 /* Set 'a' bit. This is 0b00010 in BO field for branch 1497 on CR(BI) insns (BO == 001at or 011at), and 0b01000 1498 for branch on CTR insns (BO == 1a00t or 1a01t). */ 1499 if ((insn & (0x14 << 21)) == (0x04 << 21)) 1500 insn |= 0x02 << 21; 1501 else if ((insn & (0x14 << 21)) == (0x10 << 21)) 1502 insn |= 0x08 << 21; 1503 else 1504 goto out; 1505 } 1506 else 1507 { 1508 bfd_vma target = 0; 1509 bfd_vma from; 1510 1511 if (!bfd_is_com_section (symbol->section)) 1512 target = symbol->value; 1513 target += symbol->section->output_section->vma; 1514 target += symbol->section->output_offset; 1515 target += reloc_entry->addend; 1516 1517 from = (reloc_entry->address 1518 + input_section->output_offset 1519 + input_section->output_section->vma); 1520 1521 /* Invert 'y' bit if not the default. */ 1522 if ((bfd_signed_vma) (target - from) < 0) 1523 insn ^= 0x01 << 21; 1524 } 1525 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets); 1526 out: 1527 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data, 1528 input_section, output_bfd, error_message); 1529 } 1530 1531 static bfd_reloc_status_type 1532 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1533 void *data, asection *input_section, 1534 bfd *output_bfd, char **error_message) 1535 { 1536 /* If this is a relocatable link (output_bfd test tells us), just 1537 call the generic function. Any adjustment will be done at final 1538 link time. */ 1539 if (output_bfd != NULL) 1540 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1541 input_section, output_bfd, error_message); 1542 1543 /* Subtract the symbol section base address. */ 1544 reloc_entry->addend -= symbol->section->output_section->vma; 1545 return bfd_reloc_continue; 1546 } 1547 1548 static bfd_reloc_status_type 1549 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1550 void *data, asection *input_section, 1551 bfd *output_bfd, char **error_message) 1552 { 1553 /* If this is a relocatable link (output_bfd test tells us), just 1554 call the generic function. Any adjustment will be done at final 1555 link time. */ 1556 if (output_bfd != NULL) 1557 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1558 input_section, output_bfd, error_message); 1559 1560 /* Subtract the symbol section base address. */ 1561 reloc_entry->addend -= symbol->section->output_section->vma; 1562 1563 /* Adjust the addend for sign extension of the low 16 bits. */ 1564 reloc_entry->addend += 0x8000; 1565 return bfd_reloc_continue; 1566 } 1567 1568 static bfd_reloc_status_type 1569 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1570 void *data, asection *input_section, 1571 bfd *output_bfd, char **error_message) 1572 { 1573 bfd_vma TOCstart; 1574 1575 /* If this is a relocatable link (output_bfd test tells us), just 1576 call the generic function. Any adjustment will be done at final 1577 link time. */ 1578 if (output_bfd != NULL) 1579 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1580 input_section, output_bfd, error_message); 1581 1582 TOCstart = _bfd_get_gp_value (input_section->output_section->owner); 1583 if (TOCstart == 0) 1584 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner); 1585 1586 /* Subtract the TOC base address. */ 1587 reloc_entry->addend -= TOCstart + TOC_BASE_OFF; 1588 return bfd_reloc_continue; 1589 } 1590 1591 static bfd_reloc_status_type 1592 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1593 void *data, asection *input_section, 1594 bfd *output_bfd, char **error_message) 1595 { 1596 bfd_vma TOCstart; 1597 1598 /* If this is a relocatable link (output_bfd test tells us), just 1599 call the generic function. Any adjustment will be done at final 1600 link time. */ 1601 if (output_bfd != NULL) 1602 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1603 input_section, output_bfd, error_message); 1604 1605 TOCstart = _bfd_get_gp_value (input_section->output_section->owner); 1606 if (TOCstart == 0) 1607 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner); 1608 1609 /* Subtract the TOC base address. */ 1610 reloc_entry->addend -= TOCstart + TOC_BASE_OFF; 1611 1612 /* Adjust the addend for sign extension of the low 16 bits. */ 1613 reloc_entry->addend += 0x8000; 1614 return bfd_reloc_continue; 1615 } 1616 1617 static bfd_reloc_status_type 1618 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1619 void *data, asection *input_section, 1620 bfd *output_bfd, char **error_message) 1621 { 1622 bfd_vma TOCstart; 1623 bfd_size_type octets; 1624 1625 /* If this is a relocatable link (output_bfd test tells us), just 1626 call the generic function. Any adjustment will be done at final 1627 link time. */ 1628 if (output_bfd != NULL) 1629 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1630 input_section, output_bfd, error_message); 1631 1632 TOCstart = _bfd_get_gp_value (input_section->output_section->owner); 1633 if (TOCstart == 0) 1634 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner); 1635 1636 octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section); 1637 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets); 1638 return bfd_reloc_ok; 1639 } 1640 1641 static bfd_reloc_status_type 1642 ppc64_elf_prefix_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1643 void *data, asection *input_section, 1644 bfd *output_bfd, char **error_message) 1645 { 1646 uint64_t insn; 1647 bfd_vma targ; 1648 1649 if (output_bfd != NULL) 1650 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1651 input_section, output_bfd, error_message); 1652 1653 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); 1654 insn <<= 32; 1655 insn |= bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address + 4); 1656 1657 targ = (symbol->section->output_section->vma 1658 + symbol->section->output_offset 1659 + reloc_entry->addend); 1660 if (!bfd_is_com_section (symbol->section)) 1661 targ += symbol->value; 1662 if (reloc_entry->howto->type == R_PPC64_D34_HA30) 1663 targ += 1ULL << 33; 1664 if (reloc_entry->howto->pc_relative) 1665 { 1666 bfd_vma from = (reloc_entry->address 1667 + input_section->output_offset 1668 + input_section->output_section->vma); 1669 targ -=from; 1670 } 1671 targ >>= reloc_entry->howto->rightshift; 1672 insn &= ~reloc_entry->howto->dst_mask; 1673 insn |= ((targ << 16) | (targ & 0xffff)) & reloc_entry->howto->dst_mask; 1674 bfd_put_32 (abfd, insn >> 32, (bfd_byte *) data + reloc_entry->address); 1675 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address + 4); 1676 if (reloc_entry->howto->complain_on_overflow == complain_overflow_signed 1677 && (targ + (1ULL << (reloc_entry->howto->bitsize - 1)) 1678 >= 1ULL << reloc_entry->howto->bitsize)) 1679 return bfd_reloc_overflow; 1680 return bfd_reloc_ok; 1681 } 1682 1683 static bfd_reloc_status_type 1684 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1685 void *data, asection *input_section, 1686 bfd *output_bfd, char **error_message) 1687 { 1688 /* If this is a relocatable link (output_bfd test tells us), just 1689 call the generic function. Any adjustment will be done at final 1690 link time. */ 1691 if (output_bfd != NULL) 1692 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1693 input_section, output_bfd, error_message); 1694 1695 if (error_message != NULL) 1696 { 1697 static char buf[60]; 1698 sprintf (buf, "generic linker can't handle %s", 1699 reloc_entry->howto->name); 1700 *error_message = buf; 1701 } 1702 return bfd_reloc_dangerous; 1703 } 1704 1705 /* Track GOT entries needed for a given symbol. We might need more 1706 than one got entry per symbol. */ 1707 struct got_entry 1708 { 1709 struct got_entry *next; 1710 1711 /* The symbol addend that we'll be placing in the GOT. */ 1712 bfd_vma addend; 1713 1714 /* Unlike other ELF targets, we use separate GOT entries for the same 1715 symbol referenced from different input files. This is to support 1716 automatic multiple TOC/GOT sections, where the TOC base can vary 1717 from one input file to another. After partitioning into TOC groups 1718 we merge entries within the group. 1719 1720 Point to the BFD owning this GOT entry. */ 1721 bfd *owner; 1722 1723 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD, 1724 TLS_TPREL or TLS_DTPREL for tls entries. */ 1725 unsigned char tls_type; 1726 1727 /* Non-zero if got.ent points to real entry. */ 1728 unsigned char is_indirect; 1729 1730 /* Reference count until size_dynamic_sections, GOT offset thereafter. */ 1731 union 1732 { 1733 bfd_signed_vma refcount; 1734 bfd_vma offset; 1735 struct got_entry *ent; 1736 } got; 1737 }; 1738 1739 /* The same for PLT. */ 1740 struct plt_entry 1741 { 1742 struct plt_entry *next; 1743 1744 bfd_vma addend; 1745 1746 union 1747 { 1748 bfd_signed_vma refcount; 1749 bfd_vma offset; 1750 } plt; 1751 }; 1752 1753 struct ppc64_elf_obj_tdata 1754 { 1755 struct elf_obj_tdata elf; 1756 1757 /* Shortcuts to dynamic linker sections. */ 1758 asection *got; 1759 asection *relgot; 1760 1761 /* Used during garbage collection. We attach global symbols defined 1762 on removed .opd entries to this section so that the sym is removed. */ 1763 asection *deleted_section; 1764 1765 /* TLS local dynamic got entry handling. Support for multiple GOT 1766 sections means we potentially need one of these for each input bfd. */ 1767 struct got_entry tlsld_got; 1768 1769 union 1770 { 1771 /* A copy of relocs before they are modified for --emit-relocs. */ 1772 Elf_Internal_Rela *relocs; 1773 1774 /* Section contents. */ 1775 bfd_byte *contents; 1776 } opd; 1777 1778 /* Nonzero if this bfd has small toc/got relocs, ie. that expect 1779 the reloc to be in the range -32768 to 32767. */ 1780 unsigned int has_small_toc_reloc : 1; 1781 1782 /* Set if toc/got ha relocs detected not using r2, or lo reloc 1783 instruction not one we handle. */ 1784 unsigned int unexpected_toc_insn : 1; 1785 1786 /* Set if PLT/GOT/TOC relocs that can be optimised are present in 1787 this file. */ 1788 unsigned int has_optrel : 1; 1789 }; 1790 1791 #define ppc64_elf_tdata(bfd) \ 1792 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any) 1793 1794 #define ppc64_tlsld_got(bfd) \ 1795 (&ppc64_elf_tdata (bfd)->tlsld_got) 1796 1797 #define is_ppc64_elf(bfd) \ 1798 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ 1799 && elf_object_id (bfd) == PPC64_ELF_DATA) 1800 1801 /* Override the generic function because we store some extras. */ 1802 1803 static bfd_boolean 1804 ppc64_elf_mkobject (bfd *abfd) 1805 { 1806 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata), 1807 PPC64_ELF_DATA); 1808 } 1809 1810 /* Fix bad default arch selected for a 64 bit input bfd when the 1811 default is 32 bit. Also select arch based on apuinfo. */ 1812 1813 static bfd_boolean 1814 ppc64_elf_object_p (bfd *abfd) 1815 { 1816 if (!abfd->arch_info->the_default) 1817 return TRUE; 1818 1819 if (abfd->arch_info->bits_per_word == 32) 1820 { 1821 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd); 1822 1823 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64) 1824 { 1825 /* Relies on arch after 32 bit default being 64 bit default. */ 1826 abfd->arch_info = abfd->arch_info->next; 1827 BFD_ASSERT (abfd->arch_info->bits_per_word == 64); 1828 } 1829 } 1830 return _bfd_elf_ppc_set_arch (abfd); 1831 } 1832 1833 /* Support for core dump NOTE sections. */ 1834 1835 static bfd_boolean 1836 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 1837 { 1838 size_t offset, size; 1839 1840 if (note->descsz != 504) 1841 return FALSE; 1842 1843 /* pr_cursig */ 1844 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 1845 1846 /* pr_pid */ 1847 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32); 1848 1849 /* pr_reg */ 1850 offset = 112; 1851 size = 384; 1852 1853 /* Make a ".reg/999" section. */ 1854 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 1855 size, note->descpos + offset); 1856 } 1857 1858 static bfd_boolean 1859 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 1860 { 1861 if (note->descsz != 136) 1862 return FALSE; 1863 1864 elf_tdata (abfd)->core->pid 1865 = bfd_get_32 (abfd, note->descdata + 24); 1866 elf_tdata (abfd)->core->program 1867 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16); 1868 elf_tdata (abfd)->core->command 1869 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80); 1870 1871 return TRUE; 1872 } 1873 1874 static char * 1875 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, 1876 ...) 1877 { 1878 switch (note_type) 1879 { 1880 default: 1881 return NULL; 1882 1883 case NT_PRPSINFO: 1884 { 1885 char data[136] ATTRIBUTE_NONSTRING; 1886 va_list ap; 1887 1888 va_start (ap, note_type); 1889 memset (data, 0, sizeof (data)); 1890 strncpy (data + 40, va_arg (ap, const char *), 16); 1891 #if GCC_VERSION == 8000 || GCC_VERSION == 8001 1892 DIAGNOSTIC_PUSH; 1893 /* GCC 8.0 and 8.1 warn about 80 equals destination size with 1894 -Wstringop-truncation: 1895 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643 1896 */ 1897 DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION; 1898 #endif 1899 strncpy (data + 56, va_arg (ap, const char *), 80); 1900 #if GCC_VERSION == 8000 || GCC_VERSION == 8001 1901 DIAGNOSTIC_POP; 1902 #endif 1903 va_end (ap); 1904 return elfcore_write_note (abfd, buf, bufsiz, 1905 "CORE", note_type, data, sizeof (data)); 1906 } 1907 1908 case NT_PRSTATUS: 1909 { 1910 char data[504]; 1911 va_list ap; 1912 long pid; 1913 int cursig; 1914 const void *greg; 1915 1916 va_start (ap, note_type); 1917 memset (data, 0, 112); 1918 pid = va_arg (ap, long); 1919 bfd_put_32 (abfd, pid, data + 32); 1920 cursig = va_arg (ap, int); 1921 bfd_put_16 (abfd, cursig, data + 12); 1922 greg = va_arg (ap, const void *); 1923 memcpy (data + 112, greg, 384); 1924 memset (data + 496, 0, 8); 1925 va_end (ap); 1926 return elfcore_write_note (abfd, buf, bufsiz, 1927 "CORE", note_type, data, sizeof (data)); 1928 } 1929 } 1930 } 1931 1932 /* Add extra PPC sections. */ 1933 1934 static const struct bfd_elf_special_section ppc64_elf_special_sections[] = 1935 { 1936 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 }, 1937 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE }, 1938 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, 1939 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, 1940 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, 1941 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE }, 1942 { NULL, 0, 0, 0, 0 } 1943 }; 1944 1945 enum _ppc64_sec_type { 1946 sec_normal = 0, 1947 sec_opd = 1, 1948 sec_toc = 2 1949 }; 1950 1951 struct _ppc64_elf_section_data 1952 { 1953 struct bfd_elf_section_data elf; 1954 1955 union 1956 { 1957 /* An array with one entry for each opd function descriptor, 1958 and some spares since opd entries may be either 16 or 24 bytes. */ 1959 #define OPD_NDX(OFF) ((OFF) >> 4) 1960 struct _opd_sec_data 1961 { 1962 /* Points to the function code section for local opd entries. */ 1963 asection **func_sec; 1964 1965 /* After editing .opd, adjust references to opd local syms. */ 1966 long *adjust; 1967 } opd; 1968 1969 /* An array for toc sections, indexed by offset/8. */ 1970 struct _toc_sec_data 1971 { 1972 /* Specifies the relocation symbol index used at a given toc offset. */ 1973 unsigned *symndx; 1974 1975 /* And the relocation addend. */ 1976 bfd_vma *add; 1977 } toc; 1978 } u; 1979 1980 enum _ppc64_sec_type sec_type:2; 1981 1982 /* Flag set when small branches are detected. Used to 1983 select suitable defaults for the stub group size. */ 1984 unsigned int has_14bit_branch:1; 1985 1986 /* Flag set when PLTCALL relocs are detected. */ 1987 unsigned int has_pltcall:1; 1988 1989 /* Flag set when section has PLT/GOT/TOC relocations that can be 1990 optimised. */ 1991 unsigned int has_optrel:1; 1992 }; 1993 1994 #define ppc64_elf_section_data(sec) \ 1995 ((struct _ppc64_elf_section_data *) elf_section_data (sec)) 1996 1997 static bfd_boolean 1998 ppc64_elf_new_section_hook (bfd *abfd, asection *sec) 1999 { 2000 if (!sec->used_by_bfd) 2001 { 2002 struct _ppc64_elf_section_data *sdata; 2003 bfd_size_type amt = sizeof (*sdata); 2004 2005 sdata = bfd_zalloc (abfd, amt); 2006 if (sdata == NULL) 2007 return FALSE; 2008 sec->used_by_bfd = sdata; 2009 } 2010 2011 return _bfd_elf_new_section_hook (abfd, sec); 2012 } 2013 2014 static struct _opd_sec_data * 2015 get_opd_info (asection * sec) 2016 { 2017 if (sec != NULL 2018 && ppc64_elf_section_data (sec) != NULL 2019 && ppc64_elf_section_data (sec)->sec_type == sec_opd) 2020 return &ppc64_elf_section_data (sec)->u.opd; 2021 return NULL; 2022 } 2023 2024 /* Parameters for the qsort hook. */ 2025 static bfd_boolean synthetic_relocatable; 2026 static asection *synthetic_opd; 2027 2028 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */ 2029 2030 static int 2031 compare_symbols (const void *ap, const void *bp) 2032 { 2033 const asymbol *a = *(const asymbol **) ap; 2034 const asymbol *b = *(const asymbol **) bp; 2035 2036 /* Section symbols first. */ 2037 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM)) 2038 return -1; 2039 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM)) 2040 return 1; 2041 2042 /* then .opd symbols. */ 2043 if (synthetic_opd != NULL) 2044 { 2045 if (strcmp (a->section->name, ".opd") == 0 2046 && strcmp (b->section->name, ".opd") != 0) 2047 return -1; 2048 if (strcmp (a->section->name, ".opd") != 0 2049 && strcmp (b->section->name, ".opd") == 0) 2050 return 1; 2051 } 2052 2053 /* then other code symbols. */ 2054 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)) 2055 == (SEC_CODE | SEC_ALLOC)) 2056 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)) 2057 != (SEC_CODE | SEC_ALLOC))) 2058 return -1; 2059 2060 if (((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)) 2061 != (SEC_CODE | SEC_ALLOC)) 2062 && ((b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL)) 2063 == (SEC_CODE | SEC_ALLOC))) 2064 return 1; 2065 2066 if (synthetic_relocatable) 2067 { 2068 if (a->section->id < b->section->id) 2069 return -1; 2070 2071 if (a->section->id > b->section->id) 2072 return 1; 2073 } 2074 2075 if (a->value + a->section->vma < b->value + b->section->vma) 2076 return -1; 2077 2078 if (a->value + a->section->vma > b->value + b->section->vma) 2079 return 1; 2080 2081 /* For syms with the same value, prefer strong dynamic global function 2082 syms over other syms. */ 2083 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0) 2084 return -1; 2085 2086 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0) 2087 return 1; 2088 2089 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0) 2090 return -1; 2091 2092 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0) 2093 return 1; 2094 2095 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0) 2096 return -1; 2097 2098 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0) 2099 return 1; 2100 2101 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0) 2102 return -1; 2103 2104 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0) 2105 return 1; 2106 2107 /* Finally, sort on where the symbol is in memory. The symbols will 2108 be in at most two malloc'd blocks, one for static syms, one for 2109 dynamic syms, and we distinguish the two blocks above by testing 2110 BSF_DYNAMIC. Since we are sorting the symbol pointers which were 2111 originally in the same order as the symbols (and we're not 2112 sorting the symbols themselves), this ensures a stable sort. */ 2113 if (a < b) 2114 return -1; 2115 if (a > b) 2116 return 1; 2117 return 0; 2118 } 2119 2120 /* Search SYMS for a symbol of the given VALUE. */ 2121 2122 static asymbol * 2123 sym_exists_at (asymbol **syms, size_t lo, size_t hi, unsigned int id, 2124 bfd_vma value) 2125 { 2126 size_t mid; 2127 2128 if (id == (unsigned) -1) 2129 { 2130 while (lo < hi) 2131 { 2132 mid = (lo + hi) >> 1; 2133 if (syms[mid]->value + syms[mid]->section->vma < value) 2134 lo = mid + 1; 2135 else if (syms[mid]->value + syms[mid]->section->vma > value) 2136 hi = mid; 2137 else 2138 return syms[mid]; 2139 } 2140 } 2141 else 2142 { 2143 while (lo < hi) 2144 { 2145 mid = (lo + hi) >> 1; 2146 if (syms[mid]->section->id < id) 2147 lo = mid + 1; 2148 else if (syms[mid]->section->id > id) 2149 hi = mid; 2150 else if (syms[mid]->value < value) 2151 lo = mid + 1; 2152 else if (syms[mid]->value > value) 2153 hi = mid; 2154 else 2155 return syms[mid]; 2156 } 2157 } 2158 return NULL; 2159 } 2160 2161 static bfd_boolean 2162 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr) 2163 { 2164 bfd_vma vma = *(bfd_vma *) ptr; 2165 return ((section->flags & SEC_ALLOC) != 0 2166 && section->vma <= vma 2167 && vma < section->vma + section->size); 2168 } 2169 2170 /* Create synthetic symbols, effectively restoring "dot-symbol" function 2171 entry syms. Also generate @plt symbols for the glink branch table. 2172 Returns count of synthetic symbols in RET or -1 on error. */ 2173 2174 static long 2175 ppc64_elf_get_synthetic_symtab (bfd *abfd, 2176 long static_count, asymbol **static_syms, 2177 long dyn_count, asymbol **dyn_syms, 2178 asymbol **ret) 2179 { 2180 asymbol *s; 2181 size_t i, j, count; 2182 char *names; 2183 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend; 2184 asection *opd = NULL; 2185 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0; 2186 asymbol **syms; 2187 int abi = abiversion (abfd); 2188 2189 *ret = NULL; 2190 2191 if (abi < 2) 2192 { 2193 opd = bfd_get_section_by_name (abfd, ".opd"); 2194 if (opd == NULL && abi == 1) 2195 return 0; 2196 } 2197 2198 syms = NULL; 2199 codesecsym = 0; 2200 codesecsymend = 0; 2201 secsymend = 0; 2202 opdsymend = 0; 2203 symcount = 0; 2204 if (opd != NULL) 2205 { 2206 symcount = static_count; 2207 if (!relocatable) 2208 symcount += dyn_count; 2209 if (symcount == 0) 2210 return 0; 2211 2212 syms = bfd_malloc ((symcount + 1) * sizeof (*syms)); 2213 if (syms == NULL) 2214 return -1; 2215 2216 if (!relocatable && static_count != 0 && dyn_count != 0) 2217 { 2218 /* Use both symbol tables. */ 2219 memcpy (syms, static_syms, static_count * sizeof (*syms)); 2220 memcpy (syms + static_count, dyn_syms, 2221 (dyn_count + 1) * sizeof (*syms)); 2222 } 2223 else if (!relocatable && static_count == 0) 2224 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms)); 2225 else 2226 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms)); 2227 2228 /* Trim uninteresting symbols. Interesting symbols are section, 2229 function, and notype symbols. */ 2230 for (i = 0, j = 0; i < symcount; ++i) 2231 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL 2232 | BSF_RELC | BSF_SRELC)) == 0) 2233 syms[j++] = syms[i]; 2234 symcount = j; 2235 2236 synthetic_relocatable = relocatable; 2237 synthetic_opd = opd; 2238 qsort (syms, symcount, sizeof (*syms), compare_symbols); 2239 2240 if (!relocatable && symcount > 1) 2241 { 2242 /* Trim duplicate syms, since we may have merged the normal 2243 and dynamic symbols. Actually, we only care about syms 2244 that have different values, so trim any with the same 2245 value. Don't consider ifunc and ifunc resolver symbols 2246 duplicates however, because GDB wants to know whether a 2247 text symbol is an ifunc resolver. */ 2248 for (i = 1, j = 1; i < symcount; ++i) 2249 { 2250 const asymbol *s0 = syms[i - 1]; 2251 const asymbol *s1 = syms[i]; 2252 2253 if ((s0->value + s0->section->vma 2254 != s1->value + s1->section->vma) 2255 || ((s0->flags & BSF_GNU_INDIRECT_FUNCTION) 2256 != (s1->flags & BSF_GNU_INDIRECT_FUNCTION))) 2257 syms[j++] = syms[i]; 2258 } 2259 symcount = j; 2260 } 2261 2262 i = 0; 2263 /* Note that here and in compare_symbols we can't compare opd and 2264 sym->section directly. With separate debug info files, the 2265 symbols will be extracted from the debug file while abfd passed 2266 to this function is the real binary. */ 2267 if (strcmp (syms[i]->section->name, ".opd") == 0) 2268 ++i; 2269 codesecsym = i; 2270 2271 for (; i < symcount; ++i) 2272 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC 2273 | SEC_THREAD_LOCAL)) 2274 != (SEC_CODE | SEC_ALLOC)) 2275 || (syms[i]->flags & BSF_SECTION_SYM) == 0) 2276 break; 2277 codesecsymend = i; 2278 2279 for (; i < symcount; ++i) 2280 if ((syms[i]->flags & BSF_SECTION_SYM) == 0) 2281 break; 2282 secsymend = i; 2283 2284 for (; i < symcount; ++i) 2285 if (strcmp (syms[i]->section->name, ".opd") != 0) 2286 break; 2287 opdsymend = i; 2288 2289 for (; i < symcount; ++i) 2290 if (((syms[i]->section->flags 2291 & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))) 2292 != (SEC_CODE | SEC_ALLOC)) 2293 break; 2294 symcount = i; 2295 } 2296 count = 0; 2297 2298 if (relocatable) 2299 { 2300 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean); 2301 arelent *r; 2302 size_t size; 2303 size_t relcount; 2304 2305 if (opdsymend == secsymend) 2306 goto done; 2307 2308 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table; 2309 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0; 2310 if (relcount == 0) 2311 goto done; 2312 2313 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE)) 2314 { 2315 count = -1; 2316 goto done; 2317 } 2318 2319 size = 0; 2320 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i) 2321 { 2322 asymbol *sym; 2323 2324 while (r < opd->relocation + relcount 2325 && r->address < syms[i]->value + opd->vma) 2326 ++r; 2327 2328 if (r == opd->relocation + relcount) 2329 break; 2330 2331 if (r->address != syms[i]->value + opd->vma) 2332 continue; 2333 2334 if (r->howto->type != R_PPC64_ADDR64) 2335 continue; 2336 2337 sym = *r->sym_ptr_ptr; 2338 if (!sym_exists_at (syms, opdsymend, symcount, 2339 sym->section->id, sym->value + r->addend)) 2340 { 2341 ++count; 2342 size += sizeof (asymbol); 2343 size += strlen (syms[i]->name) + 2; 2344 } 2345 } 2346 2347 if (size == 0) 2348 goto done; 2349 s = *ret = bfd_malloc (size); 2350 if (s == NULL) 2351 { 2352 count = -1; 2353 goto done; 2354 } 2355 2356 names = (char *) (s + count); 2357 2358 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i) 2359 { 2360 asymbol *sym; 2361 2362 while (r < opd->relocation + relcount 2363 && r->address < syms[i]->value + opd->vma) 2364 ++r; 2365 2366 if (r == opd->relocation + relcount) 2367 break; 2368 2369 if (r->address != syms[i]->value + opd->vma) 2370 continue; 2371 2372 if (r->howto->type != R_PPC64_ADDR64) 2373 continue; 2374 2375 sym = *r->sym_ptr_ptr; 2376 if (!sym_exists_at (syms, opdsymend, symcount, 2377 sym->section->id, sym->value + r->addend)) 2378 { 2379 size_t len; 2380 2381 *s = *syms[i]; 2382 s->flags |= BSF_SYNTHETIC; 2383 s->section = sym->section; 2384 s->value = sym->value + r->addend; 2385 s->name = names; 2386 *names++ = '.'; 2387 len = strlen (syms[i]->name); 2388 memcpy (names, syms[i]->name, len + 1); 2389 names += len + 1; 2390 /* Have udata.p point back to the original symbol this 2391 synthetic symbol was derived from. */ 2392 s->udata.p = syms[i]; 2393 s++; 2394 } 2395 } 2396 } 2397 else 2398 { 2399 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean); 2400 bfd_byte *contents = NULL; 2401 size_t size; 2402 size_t plt_count = 0; 2403 bfd_vma glink_vma = 0, resolv_vma = 0; 2404 asection *dynamic, *glink = NULL, *relplt = NULL; 2405 arelent *p; 2406 2407 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents)) 2408 { 2409 free_contents_and_exit_err: 2410 count = -1; 2411 free_contents_and_exit: 2412 if (contents) 2413 free (contents); 2414 goto done; 2415 } 2416 2417 size = 0; 2418 for (i = secsymend; i < opdsymend; ++i) 2419 { 2420 bfd_vma ent; 2421 2422 /* Ignore bogus symbols. */ 2423 if (syms[i]->value > opd->size - 8) 2424 continue; 2425 2426 ent = bfd_get_64 (abfd, contents + syms[i]->value); 2427 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent)) 2428 { 2429 ++count; 2430 size += sizeof (asymbol); 2431 size += strlen (syms[i]->name) + 2; 2432 } 2433 } 2434 2435 /* Get start of .glink stubs from DT_PPC64_GLINK. */ 2436 if (dyn_count != 0 2437 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL) 2438 { 2439 bfd_byte *dynbuf, *extdyn, *extdynend; 2440 size_t extdynsize; 2441 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *); 2442 2443 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf)) 2444 goto free_contents_and_exit_err; 2445 2446 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn; 2447 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in; 2448 2449 extdyn = dynbuf; 2450 extdynend = extdyn + dynamic->size; 2451 for (; extdyn < extdynend; extdyn += extdynsize) 2452 { 2453 Elf_Internal_Dyn dyn; 2454 (*swap_dyn_in) (abfd, extdyn, &dyn); 2455 2456 if (dyn.d_tag == DT_NULL) 2457 break; 2458 2459 if (dyn.d_tag == DT_PPC64_GLINK) 2460 { 2461 /* The first glink stub starts at DT_PPC64_GLINK plus 32. 2462 See comment in ppc64_elf_finish_dynamic_sections. */ 2463 glink_vma = dyn.d_un.d_val + 8 * 4; 2464 /* The .glink section usually does not survive the final 2465 link; search for the section (usually .text) where the 2466 glink stubs now reside. */ 2467 glink = bfd_sections_find_if (abfd, section_covers_vma, 2468 &glink_vma); 2469 break; 2470 } 2471 } 2472 2473 free (dynbuf); 2474 } 2475 2476 if (glink != NULL) 2477 { 2478 /* Determine __glink trampoline by reading the relative branch 2479 from the first glink stub. */ 2480 bfd_byte buf[4]; 2481 unsigned int off = 0; 2482 2483 while (bfd_get_section_contents (abfd, glink, buf, 2484 glink_vma + off - glink->vma, 4)) 2485 { 2486 unsigned int insn = bfd_get_32 (abfd, buf); 2487 insn ^= B_DOT; 2488 if ((insn & ~0x3fffffc) == 0) 2489 { 2490 resolv_vma 2491 = glink_vma + off + (insn ^ 0x2000000) - 0x2000000; 2492 break; 2493 } 2494 off += 4; 2495 if (off > 4) 2496 break; 2497 } 2498 2499 if (resolv_vma) 2500 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve"); 2501 2502 relplt = bfd_get_section_by_name (abfd, ".rela.plt"); 2503 if (relplt != NULL) 2504 { 2505 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table; 2506 if (!(*slurp_relocs) (abfd, relplt, dyn_syms, TRUE)) 2507 goto free_contents_and_exit_err; 2508 2509 plt_count = relplt->size / sizeof (Elf64_External_Rela); 2510 size += plt_count * sizeof (asymbol); 2511 2512 p = relplt->relocation; 2513 for (i = 0; i < plt_count; i++, p++) 2514 { 2515 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt"); 2516 if (p->addend != 0) 2517 size += sizeof ("+0x") - 1 + 16; 2518 } 2519 } 2520 } 2521 2522 if (size == 0) 2523 goto free_contents_and_exit; 2524 s = *ret = bfd_malloc (size); 2525 if (s == NULL) 2526 goto free_contents_and_exit_err; 2527 2528 names = (char *) (s + count + plt_count + (resolv_vma != 0)); 2529 2530 for (i = secsymend; i < opdsymend; ++i) 2531 { 2532 bfd_vma ent; 2533 2534 if (syms[i]->value > opd->size - 8) 2535 continue; 2536 2537 ent = bfd_get_64 (abfd, contents + syms[i]->value); 2538 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent)) 2539 { 2540 size_t lo, hi; 2541 size_t len; 2542 asection *sec = abfd->sections; 2543 2544 *s = *syms[i]; 2545 lo = codesecsym; 2546 hi = codesecsymend; 2547 while (lo < hi) 2548 { 2549 size_t mid = (lo + hi) >> 1; 2550 if (syms[mid]->section->vma < ent) 2551 lo = mid + 1; 2552 else if (syms[mid]->section->vma > ent) 2553 hi = mid; 2554 else 2555 { 2556 sec = syms[mid]->section; 2557 break; 2558 } 2559 } 2560 2561 if (lo >= hi && lo > codesecsym) 2562 sec = syms[lo - 1]->section; 2563 2564 for (; sec != NULL; sec = sec->next) 2565 { 2566 if (sec->vma > ent) 2567 break; 2568 /* SEC_LOAD may not be set if SEC is from a separate debug 2569 info file. */ 2570 if ((sec->flags & SEC_ALLOC) == 0) 2571 break; 2572 if ((sec->flags & SEC_CODE) != 0) 2573 s->section = sec; 2574 } 2575 s->flags |= BSF_SYNTHETIC; 2576 s->value = ent - s->section->vma; 2577 s->name = names; 2578 *names++ = '.'; 2579 len = strlen (syms[i]->name); 2580 memcpy (names, syms[i]->name, len + 1); 2581 names += len + 1; 2582 /* Have udata.p point back to the original symbol this 2583 synthetic symbol was derived from. */ 2584 s->udata.p = syms[i]; 2585 s++; 2586 } 2587 } 2588 free (contents); 2589 2590 if (glink != NULL && relplt != NULL) 2591 { 2592 if (resolv_vma) 2593 { 2594 /* Add a symbol for the main glink trampoline. */ 2595 memset (s, 0, sizeof *s); 2596 s->the_bfd = abfd; 2597 s->flags = BSF_GLOBAL | BSF_SYNTHETIC; 2598 s->section = glink; 2599 s->value = resolv_vma - glink->vma; 2600 s->name = names; 2601 memcpy (names, "__glink_PLTresolve", 2602 sizeof ("__glink_PLTresolve")); 2603 names += sizeof ("__glink_PLTresolve"); 2604 s++; 2605 count++; 2606 } 2607 2608 /* FIXME: It would be very much nicer to put sym@plt on the 2609 stub rather than on the glink branch table entry. The 2610 objdump disassembler would then use a sensible symbol 2611 name on plt calls. The difficulty in doing so is 2612 a) finding the stubs, and, 2613 b) matching stubs against plt entries, and, 2614 c) there can be multiple stubs for a given plt entry. 2615 2616 Solving (a) could be done by code scanning, but older 2617 ppc64 binaries used different stubs to current code. 2618 (b) is the tricky one since you need to known the toc 2619 pointer for at least one function that uses a pic stub to 2620 be able to calculate the plt address referenced. 2621 (c) means gdb would need to set multiple breakpoints (or 2622 find the glink branch itself) when setting breakpoints 2623 for pending shared library loads. */ 2624 p = relplt->relocation; 2625 for (i = 0; i < plt_count; i++, p++) 2626 { 2627 size_t len; 2628 2629 *s = **p->sym_ptr_ptr; 2630 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since 2631 we are defining a symbol, ensure one of them is set. */ 2632 if ((s->flags & BSF_LOCAL) == 0) 2633 s->flags |= BSF_GLOBAL; 2634 s->flags |= BSF_SYNTHETIC; 2635 s->section = glink; 2636 s->value = glink_vma - glink->vma; 2637 s->name = names; 2638 s->udata.p = NULL; 2639 len = strlen ((*p->sym_ptr_ptr)->name); 2640 memcpy (names, (*p->sym_ptr_ptr)->name, len); 2641 names += len; 2642 if (p->addend != 0) 2643 { 2644 memcpy (names, "+0x", sizeof ("+0x") - 1); 2645 names += sizeof ("+0x") - 1; 2646 bfd_sprintf_vma (abfd, names, p->addend); 2647 names += strlen (names); 2648 } 2649 memcpy (names, "@plt", sizeof ("@plt")); 2650 names += sizeof ("@plt"); 2651 s++; 2652 if (abi < 2) 2653 { 2654 glink_vma += 8; 2655 if (i >= 0x8000) 2656 glink_vma += 4; 2657 } 2658 else 2659 glink_vma += 4; 2660 } 2661 count += plt_count; 2662 } 2663 } 2664 2665 done: 2666 free (syms); 2667 return count; 2668 } 2669 2670 /* The following functions are specific to the ELF linker, while 2671 functions above are used generally. Those named ppc64_elf_* are 2672 called by the main ELF linker code. They appear in this file more 2673 or less in the order in which they are called. eg. 2674 ppc64_elf_check_relocs is called early in the link process, 2675 ppc64_elf_finish_dynamic_sections is one of the last functions 2676 called. 2677 2678 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that 2679 functions have both a function code symbol and a function descriptor 2680 symbol. A call to foo in a relocatable object file looks like: 2681 2682 . .text 2683 . x: 2684 . bl .foo 2685 . nop 2686 2687 The function definition in another object file might be: 2688 2689 . .section .opd 2690 . foo: .quad .foo 2691 . .quad .TOC.@tocbase 2692 . .quad 0 2693 . 2694 . .text 2695 . .foo: blr 2696 2697 When the linker resolves the call during a static link, the branch 2698 unsurprisingly just goes to .foo and the .opd information is unused. 2699 If the function definition is in a shared library, things are a little 2700 different: The call goes via a plt call stub, the opd information gets 2701 copied to the plt, and the linker patches the nop. 2702 2703 . x: 2704 . bl .foo_stub 2705 . ld 2,40(1) 2706 . 2707 . 2708 . .foo_stub: 2709 . std 2,40(1) # in practice, the call stub 2710 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but 2711 . addi 11,11,Lfoo@toc@l # this is the general idea 2712 . ld 12,0(11) 2713 . ld 2,8(11) 2714 . mtctr 12 2715 . ld 11,16(11) 2716 . bctr 2717 . 2718 . .section .plt 2719 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo) 2720 2721 The "reloc ()" notation is supposed to indicate that the linker emits 2722 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd 2723 copying. 2724 2725 What are the difficulties here? Well, firstly, the relocations 2726 examined by the linker in check_relocs are against the function code 2727 sym .foo, while the dynamic relocation in the plt is emitted against 2728 the function descriptor symbol, foo. Somewhere along the line, we need 2729 to carefully copy dynamic link information from one symbol to the other. 2730 Secondly, the generic part of the elf linker will make .foo a dynamic 2731 symbol as is normal for most other backends. We need foo dynamic 2732 instead, at least for an application final link. However, when 2733 creating a shared library containing foo, we need to have both symbols 2734 dynamic so that references to .foo are satisfied during the early 2735 stages of linking. Otherwise the linker might decide to pull in a 2736 definition from some other object, eg. a static library. 2737 2738 Update: As of August 2004, we support a new convention. Function 2739 calls may use the function descriptor symbol, ie. "bl foo". This 2740 behaves exactly as "bl .foo". */ 2741 2742 /* Of those relocs that might be copied as dynamic relocs, this 2743 function selects those that must be copied when linking a shared 2744 library or PIE, even when the symbol is local. */ 2745 2746 static int 2747 must_be_dyn_reloc (struct bfd_link_info *info, 2748 enum elf_ppc64_reloc_type r_type) 2749 { 2750 switch (r_type) 2751 { 2752 default: 2753 /* Only relative relocs can be resolved when the object load 2754 address isn't fixed. DTPREL64 is excluded because the 2755 dynamic linker needs to differentiate global dynamic from 2756 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */ 2757 return 1; 2758 2759 case R_PPC64_REL32: 2760 case R_PPC64_REL64: 2761 case R_PPC64_REL30: 2762 case R_PPC64_TOC16: 2763 case R_PPC64_TOC16_DS: 2764 case R_PPC64_TOC16_LO: 2765 case R_PPC64_TOC16_HI: 2766 case R_PPC64_TOC16_HA: 2767 case R_PPC64_TOC16_LO_DS: 2768 return 0; 2769 2770 case R_PPC64_TPREL16: 2771 case R_PPC64_TPREL16_LO: 2772 case R_PPC64_TPREL16_HI: 2773 case R_PPC64_TPREL16_HA: 2774 case R_PPC64_TPREL16_DS: 2775 case R_PPC64_TPREL16_LO_DS: 2776 case R_PPC64_TPREL16_HIGH: 2777 case R_PPC64_TPREL16_HIGHA: 2778 case R_PPC64_TPREL16_HIGHER: 2779 case R_PPC64_TPREL16_HIGHERA: 2780 case R_PPC64_TPREL16_HIGHEST: 2781 case R_PPC64_TPREL16_HIGHESTA: 2782 case R_PPC64_TPREL64: 2783 case R_PPC64_TPREL34: 2784 /* These relocations are relative but in a shared library the 2785 linker doesn't know the thread pointer base. */ 2786 return bfd_link_dll (info); 2787 } 2788 } 2789 2790 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid 2791 copying dynamic variables from a shared lib into an app's .dynbss 2792 section, and instead use a dynamic relocation to point into the 2793 shared lib. With code that gcc generates it is vital that this be 2794 enabled; In the PowerPC64 ELFv1 ABI the address of a function is 2795 actually the address of a function descriptor which resides in the 2796 .opd section. gcc uses the descriptor directly rather than going 2797 via the GOT as some other ABIs do, which means that initialized 2798 function pointers reference the descriptor. Thus, a function 2799 pointer initialized to the address of a function in a shared 2800 library will either require a .dynbss copy and a copy reloc, or a 2801 dynamic reloc. Using a .dynbss copy redefines the function 2802 descriptor symbol to point to the copy. This presents a problem as 2803 a PLT entry for that function is also initialized from the function 2804 descriptor symbol and the copy may not be initialized first. */ 2805 #define ELIMINATE_COPY_RELOCS 1 2806 2807 /* Section name for stubs is the associated section name plus this 2808 string. */ 2809 #define STUB_SUFFIX ".stub" 2810 2811 /* Linker stubs. 2812 ppc_stub_long_branch: 2813 Used when a 14 bit branch (or even a 24 bit branch) can't reach its 2814 destination, but a 24 bit branch in a stub section will reach. 2815 . b dest 2816 2817 ppc_stub_plt_branch: 2818 Similar to the above, but a 24 bit branch in the stub section won't 2819 reach its destination. 2820 . addis %r11,%r2,xxx@toc@ha 2821 . ld %r12,xxx@toc@l(%r11) 2822 . mtctr %r12 2823 . bctr 2824 2825 ppc_stub_plt_call: 2826 Used to call a function in a shared library. If it so happens that 2827 the plt entry referenced crosses a 64k boundary, then an extra 2828 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr". 2829 ppc_stub_plt_call_r2save starts with "std %r2,40(%r1)". 2830 . addis %r11,%r2,xxx@toc@ha 2831 . ld %r12,xxx+0@toc@l(%r11) 2832 . mtctr %r12 2833 . ld %r2,xxx+8@toc@l(%r11) 2834 . ld %r11,xxx+16@toc@l(%r11) 2835 . bctr 2836 2837 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional 2838 code to adjust the value and save r2 to support multiple toc sections. 2839 A ppc_stub_long_branch with an r2 offset looks like: 2840 . std %r2,40(%r1) 2841 . addis %r2,%r2,off@ha 2842 . addi %r2,%r2,off@l 2843 . b dest 2844 2845 A ppc_stub_plt_branch with an r2 offset looks like: 2846 . std %r2,40(%r1) 2847 . addis %r11,%r2,xxx@toc@ha 2848 . ld %r12,xxx@toc@l(%r11) 2849 . addis %r2,%r2,off@ha 2850 . addi %r2,%r2,off@l 2851 . mtctr %r12 2852 . bctr 2853 2854 All of the above stubs are shown as their ELFv1 variants. ELFv2 2855 variants exist too, simpler for plt calls since a new toc pointer 2856 and static chain are not loaded by the stub. In addition, ELFv2 2857 has some more complex stubs to handle calls marked with NOTOC 2858 relocs from functions where r2 is not a valid toc pointer. These 2859 come in two flavours, the ones shown below, and _both variants that 2860 start with "std %r2,24(%r1)" to save r2 in the unlikely event that 2861 one call is from a function where r2 is used as the toc pointer but 2862 needs a toc adjusting stub for small-model multi-toc, and another 2863 call is from a function where r2 is not valid. 2864 ppc_stub_long_branch_notoc: 2865 . mflr %r12 2866 . bcl 20,31,1f 2867 . 1: 2868 . mflr %r11 2869 . mtlr %r12 2870 . addis %r12,%r11,dest-1b@ha 2871 . addi %r12,%r12,dest-1b@l 2872 . b dest 2873 2874 ppc_stub_plt_branch_notoc: 2875 . mflr %r12 2876 . bcl 20,31,1f 2877 . 1: 2878 . mflr %r11 2879 . mtlr %r12 2880 . lis %r12,xxx-1b@highest 2881 . ori %r12,%r12,xxx-1b@higher 2882 . sldi %r12,%r12,32 2883 . oris %r12,%r12,xxx-1b@high 2884 . ori %r12,%r12,xxx-1b@l 2885 . add %r12,%r11,%r12 2886 . mtctr %r12 2887 . bctr 2888 2889 ppc_stub_plt_call_notoc: 2890 . mflr %r12 2891 . bcl 20,31,1f 2892 . 1: 2893 . mflr %r11 2894 . mtlr %r12 2895 . lis %r12,xxx-1b@highest 2896 . ori %r12,%r12,xxx-1b@higher 2897 . sldi %r12,%r12,32 2898 . oris %r12,%r12,xxx-1b@high 2899 . ori %r12,%r12,xxx-1b@l 2900 . ldx %r12,%r11,%r12 2901 . mtctr %r12 2902 . bctr 2903 2904 There are also ELFv1 powerxx variants of these stubs. 2905 ppc_stub_long_branch_notoc: 2906 . pla %r12,dest@pcrel 2907 . b dest 2908 ppc_stub_plt_branch_notoc: 2909 . lis %r11,(dest-1f)@highesta34 2910 . ori %r11,%r11,(dest-1f)@highera34 2911 . sldi %r11,%r11,34 2912 . 1: pla %r12,dest@pcrel 2913 . add %r12,%r11,%r12 2914 . mtctr %r12 2915 . bctr 2916 ppc_stub_plt_call_notoc: 2917 . lis %r11,(xxx-1f)@highesta34 2918 . ori %r11,%r11,(xxx-1f)@highera34 2919 . sldi %r11,%r11,34 2920 . 1: pla %r12,xxx@pcrel 2921 . ldx %r12,%r11,%r12 2922 . mtctr %r12 2923 . bctr 2924 2925 In cases where the high instructions would add zero, they are 2926 omitted and following instructions modified in some cases. 2927 For example, a powerxx ppc_stub_plt_call_notoc might simplify down 2928 to 2929 . pld %r12,xxx@pcrel 2930 . mtctr %r12 2931 . bctr 2932 2933 For a given stub group (a set of sections all using the same toc 2934 pointer value) there will be just one stub type used for any 2935 particular function symbol. For example, if printf is called from 2936 code with the tocsave optimization (ie. r2 saved in function 2937 prologue) and therefore calls use a ppc_stub_plt_call linkage stub, 2938 and from other code without the tocsave optimization requiring a 2939 ppc_stub_plt_call_r2save linkage stub, a single stub of the latter 2940 type will be created. Calls with the tocsave optimization will 2941 enter this stub after the instruction saving r2. A similar 2942 situation exists when calls are marked with R_PPC64_REL24_NOTOC 2943 relocations. These require a ppc_stub_plt_call_notoc linkage stub 2944 to call an external function like printf. If other calls to printf 2945 require a ppc_stub_plt_call linkage stub then a single 2946 ppc_stub_plt_call_notoc linkage stub will be used for both types of 2947 call. If other calls to printf require a ppc_stub_plt_call_r2save 2948 linkage stub then a single ppc_stub_plt_call_both linkage stub will 2949 be created and calls not requiring r2 to be saved will enter the 2950 stub after the r2 save instruction. There is an analogous 2951 hierarchy of long branch and plt branch stubs for local call 2952 linkage. */ 2953 2954 enum ppc_stub_type 2955 { 2956 ppc_stub_none, 2957 ppc_stub_long_branch, 2958 ppc_stub_long_branch_r2off, 2959 ppc_stub_long_branch_notoc, 2960 ppc_stub_long_branch_both, /* r2off and notoc variants both needed. */ 2961 ppc_stub_plt_branch, 2962 ppc_stub_plt_branch_r2off, 2963 ppc_stub_plt_branch_notoc, 2964 ppc_stub_plt_branch_both, 2965 ppc_stub_plt_call, 2966 ppc_stub_plt_call_r2save, 2967 ppc_stub_plt_call_notoc, 2968 ppc_stub_plt_call_both, 2969 ppc_stub_global_entry, 2970 ppc_stub_save_res 2971 }; 2972 2973 /* Information on stub grouping. */ 2974 struct map_stub 2975 { 2976 /* The stub section. */ 2977 asection *stub_sec; 2978 /* This is the section to which stubs in the group will be attached. */ 2979 asection *link_sec; 2980 /* Next group. */ 2981 struct map_stub *next; 2982 /* Whether to emit a copy of register save/restore functions in this 2983 group. */ 2984 int needs_save_res; 2985 /* Current offset within stubs after the insn restoring lr in a 2986 _notoc or _both stub using bcl for pc-relative addressing, or 2987 after the insn restoring lr in a __tls_get_addr_opt plt stub. */ 2988 unsigned int lr_restore; 2989 /* Accumulated size of EH info emitted to describe return address 2990 if stubs modify lr. Does not include 17 byte FDE header. */ 2991 unsigned int eh_size; 2992 /* Offset in glink_eh_frame to the start of EH info for this group. */ 2993 unsigned int eh_base; 2994 }; 2995 2996 struct ppc_stub_hash_entry 2997 { 2998 /* Base hash table entry structure. */ 2999 struct bfd_hash_entry root; 3000 3001 enum ppc_stub_type stub_type; 3002 3003 /* Group information. */ 3004 struct map_stub *group; 3005 3006 /* Offset within stub_sec of the beginning of this stub. */ 3007 bfd_vma stub_offset; 3008 3009 /* Given the symbol's value and its section we can determine its final 3010 value when building the stubs (so the stub knows where to jump. */ 3011 bfd_vma target_value; 3012 asection *target_section; 3013 3014 /* The symbol table entry, if any, that this was derived from. */ 3015 struct ppc_link_hash_entry *h; 3016 struct plt_entry *plt_ent; 3017 3018 /* Symbol type. */ 3019 unsigned char symtype; 3020 3021 /* Symbol st_other. */ 3022 unsigned char other; 3023 }; 3024 3025 struct ppc_branch_hash_entry 3026 { 3027 /* Base hash table entry structure. */ 3028 struct bfd_hash_entry root; 3029 3030 /* Offset within branch lookup table. */ 3031 unsigned int offset; 3032 3033 /* Generation marker. */ 3034 unsigned int iter; 3035 }; 3036 3037 /* Used to track dynamic relocations for local symbols. */ 3038 struct ppc_dyn_relocs 3039 { 3040 struct ppc_dyn_relocs *next; 3041 3042 /* The input section of the reloc. */ 3043 asection *sec; 3044 3045 /* Total number of relocs copied for the input section. */ 3046 unsigned int count : 31; 3047 3048 /* Whether this entry is for STT_GNU_IFUNC symbols. */ 3049 unsigned int ifunc : 1; 3050 }; 3051 3052 struct ppc_link_hash_entry 3053 { 3054 struct elf_link_hash_entry elf; 3055 3056 union 3057 { 3058 /* A pointer to the most recently used stub hash entry against this 3059 symbol. */ 3060 struct ppc_stub_hash_entry *stub_cache; 3061 3062 /* A pointer to the next symbol starting with a '.' */ 3063 struct ppc_link_hash_entry *next_dot_sym; 3064 } u; 3065 3066 /* Track dynamic relocs copied for this symbol. */ 3067 struct elf_dyn_relocs *dyn_relocs; 3068 3069 /* Link between function code and descriptor symbols. */ 3070 struct ppc_link_hash_entry *oh; 3071 3072 /* Flag function code and descriptor symbols. */ 3073 unsigned int is_func:1; 3074 unsigned int is_func_descriptor:1; 3075 unsigned int fake:1; 3076 3077 /* Whether global opd/toc sym has been adjusted or not. 3078 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag 3079 should be set for all globals defined in any opd/toc section. */ 3080 unsigned int adjust_done:1; 3081 3082 /* Set if this is an out-of-line register save/restore function, 3083 with non-standard calling convention. */ 3084 unsigned int save_res:1; 3085 3086 /* Set if a duplicate symbol with non-zero localentry is detected, 3087 even when the duplicate symbol does not provide a definition. */ 3088 unsigned int non_zero_localentry:1; 3089 3090 /* Contexts in which symbol is used in the GOT (or TOC). 3091 Bits are or'd into the mask as the corresponding relocs are 3092 encountered during check_relocs, with TLS_TLS being set when any 3093 of the other TLS bits are set. tls_optimize clears bits when 3094 optimizing to indicate the corresponding GOT entry type is not 3095 needed. If set, TLS_TLS is never cleared. tls_optimize may also 3096 set TLS_GDIE when a GD reloc turns into an IE one. 3097 These flags are also kept for local symbols. */ 3098 #define TLS_TLS 1 /* Any TLS reloc. */ 3099 #define TLS_GD 2 /* GD reloc. */ 3100 #define TLS_LD 4 /* LD reloc. */ 3101 #define TLS_TPREL 8 /* TPREL reloc, => IE. */ 3102 #define TLS_DTPREL 16 /* DTPREL reloc, => LD. */ 3103 #define TLS_MARK 32 /* __tls_get_addr call marked. */ 3104 #define TLS_GDIE 64 /* GOT TPREL reloc resulting from GD->IE. */ 3105 #define TLS_EXPLICIT 256 /* TOC section TLS reloc, not stored. */ 3106 unsigned char tls_mask; 3107 3108 /* The above field is also used to mark function symbols. In which 3109 case TLS_TLS will be 0. */ 3110 #define PLT_IFUNC 2 /* STT_GNU_IFUNC. */ 3111 #define PLT_KEEP 4 /* inline plt call requires plt entry. */ 3112 #define NON_GOT 256 /* local symbol plt, not stored. */ 3113 }; 3114 3115 /* ppc64 ELF linker hash table. */ 3116 3117 struct ppc_link_hash_table 3118 { 3119 struct elf_link_hash_table elf; 3120 3121 /* The stub hash table. */ 3122 struct bfd_hash_table stub_hash_table; 3123 3124 /* Another hash table for plt_branch stubs. */ 3125 struct bfd_hash_table branch_hash_table; 3126 3127 /* Hash table for function prologue tocsave. */ 3128 htab_t tocsave_htab; 3129 3130 /* Various options and other info passed from the linker. */ 3131 struct ppc64_elf_params *params; 3132 3133 /* The size of sec_info below. */ 3134 unsigned int sec_info_arr_size; 3135 3136 /* Per-section array of extra section info. Done this way rather 3137 than as part of ppc64_elf_section_data so we have the info for 3138 non-ppc64 sections. */ 3139 struct 3140 { 3141 /* Along with elf_gp, specifies the TOC pointer used by this section. */ 3142 bfd_vma toc_off; 3143 3144 union 3145 { 3146 /* The section group that this section belongs to. */ 3147 struct map_stub *group; 3148 /* A temp section list pointer. */ 3149 asection *list; 3150 } u; 3151 } *sec_info; 3152 3153 /* Linked list of groups. */ 3154 struct map_stub *group; 3155 3156 /* Temp used when calculating TOC pointers. */ 3157 bfd_vma toc_curr; 3158 bfd *toc_bfd; 3159 asection *toc_first_sec; 3160 3161 /* Used when adding symbols. */ 3162 struct ppc_link_hash_entry *dot_syms; 3163 3164 /* Shortcuts to get to dynamic linker sections. */ 3165 asection *glink; 3166 asection *global_entry; 3167 asection *sfpr; 3168 asection *pltlocal; 3169 asection *relpltlocal; 3170 asection *brlt; 3171 asection *relbrlt; 3172 asection *glink_eh_frame; 3173 3174 /* Shortcut to .__tls_get_addr and __tls_get_addr. */ 3175 struct ppc_link_hash_entry *tls_get_addr; 3176 struct ppc_link_hash_entry *tls_get_addr_fd; 3177 3178 /* The size of reliplt used by got entry relocs. */ 3179 bfd_size_type got_reli_size; 3180 3181 /* Statistics. */ 3182 unsigned long stub_count[ppc_stub_global_entry]; 3183 3184 /* Number of stubs against global syms. */ 3185 unsigned long stub_globals; 3186 3187 /* Set if we're linking code with function descriptors. */ 3188 unsigned int opd_abi:1; 3189 3190 /* Support for multiple toc sections. */ 3191 unsigned int do_multi_toc:1; 3192 unsigned int multi_toc_needed:1; 3193 unsigned int second_toc_pass:1; 3194 unsigned int do_toc_opt:1; 3195 3196 /* Set if tls optimization is enabled. */ 3197 unsigned int do_tls_opt:1; 3198 3199 /* Set if inline plt calls should be converted to direct calls. */ 3200 unsigned int can_convert_all_inline_plt:1; 3201 3202 /* Set on error. */ 3203 unsigned int stub_error:1; 3204 3205 /* Whether func_desc_adjust needs to be run over symbols. */ 3206 unsigned int need_func_desc_adj:1; 3207 3208 /* Whether there exist local gnu indirect function resolvers, 3209 referenced by dynamic relocations. */ 3210 unsigned int local_ifunc_resolver:1; 3211 unsigned int maybe_local_ifunc_resolver:1; 3212 3213 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */ 3214 unsigned int has_plt_localentry0:1; 3215 3216 /* Whether calls are made via the PLT from NOTOC functions. */ 3217 unsigned int notoc_plt:1; 3218 3219 /* Whether to use powerxx instructions in linkage stubs. */ 3220 unsigned int powerxx_stubs:1; 3221 3222 /* Incremented every time we size stubs. */ 3223 unsigned int stub_iteration; 3224 3225 /* Small local sym cache. */ 3226 struct sym_cache sym_cache; 3227 }; 3228 3229 /* Rename some of the generic section flags to better document how they 3230 are used here. */ 3231 3232 /* Nonzero if this section has TLS related relocations. */ 3233 #define has_tls_reloc sec_flg0 3234 3235 /* Nonzero if this section has a call to __tls_get_addr lacking marker 3236 relocations. */ 3237 #define nomark_tls_get_addr sec_flg1 3238 3239 /* Nonzero if this section has any toc or got relocs. */ 3240 #define has_toc_reloc sec_flg2 3241 3242 /* Nonzero if this section has a call to another section that uses 3243 the toc or got. */ 3244 #define makes_toc_func_call sec_flg3 3245 3246 /* Recursion protection when determining above flag. */ 3247 #define call_check_in_progress sec_flg4 3248 #define call_check_done sec_flg5 3249 3250 /* Get the ppc64 ELF linker hash table from a link_info structure. */ 3251 3252 #define ppc_hash_table(p) \ 3253 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ 3254 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL) 3255 3256 #define ppc_stub_hash_lookup(table, string, create, copy) \ 3257 ((struct ppc_stub_hash_entry *) \ 3258 bfd_hash_lookup ((table), (string), (create), (copy))) 3259 3260 #define ppc_branch_hash_lookup(table, string, create, copy) \ 3261 ((struct ppc_branch_hash_entry *) \ 3262 bfd_hash_lookup ((table), (string), (create), (copy))) 3263 3264 /* Create an entry in the stub hash table. */ 3265 3266 static struct bfd_hash_entry * 3267 stub_hash_newfunc (struct bfd_hash_entry *entry, 3268 struct bfd_hash_table *table, 3269 const char *string) 3270 { 3271 /* Allocate the structure if it has not already been allocated by a 3272 subclass. */ 3273 if (entry == NULL) 3274 { 3275 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry)); 3276 if (entry == NULL) 3277 return entry; 3278 } 3279 3280 /* Call the allocation method of the superclass. */ 3281 entry = bfd_hash_newfunc (entry, table, string); 3282 if (entry != NULL) 3283 { 3284 struct ppc_stub_hash_entry *eh; 3285 3286 /* Initialize the local fields. */ 3287 eh = (struct ppc_stub_hash_entry *) entry; 3288 eh->stub_type = ppc_stub_none; 3289 eh->group = NULL; 3290 eh->stub_offset = 0; 3291 eh->target_value = 0; 3292 eh->target_section = NULL; 3293 eh->h = NULL; 3294 eh->plt_ent = NULL; 3295 eh->other = 0; 3296 } 3297 3298 return entry; 3299 } 3300 3301 /* Create an entry in the branch hash table. */ 3302 3303 static struct bfd_hash_entry * 3304 branch_hash_newfunc (struct bfd_hash_entry *entry, 3305 struct bfd_hash_table *table, 3306 const char *string) 3307 { 3308 /* Allocate the structure if it has not already been allocated by a 3309 subclass. */ 3310 if (entry == NULL) 3311 { 3312 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry)); 3313 if (entry == NULL) 3314 return entry; 3315 } 3316 3317 /* Call the allocation method of the superclass. */ 3318 entry = bfd_hash_newfunc (entry, table, string); 3319 if (entry != NULL) 3320 { 3321 struct ppc_branch_hash_entry *eh; 3322 3323 /* Initialize the local fields. */ 3324 eh = (struct ppc_branch_hash_entry *) entry; 3325 eh->offset = 0; 3326 eh->iter = 0; 3327 } 3328 3329 return entry; 3330 } 3331 3332 /* Create an entry in a ppc64 ELF linker hash table. */ 3333 3334 static struct bfd_hash_entry * 3335 link_hash_newfunc (struct bfd_hash_entry *entry, 3336 struct bfd_hash_table *table, 3337 const char *string) 3338 { 3339 /* Allocate the structure if it has not already been allocated by a 3340 subclass. */ 3341 if (entry == NULL) 3342 { 3343 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry)); 3344 if (entry == NULL) 3345 return entry; 3346 } 3347 3348 /* Call the allocation method of the superclass. */ 3349 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 3350 if (entry != NULL) 3351 { 3352 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry; 3353 3354 memset (&eh->u.stub_cache, 0, 3355 (sizeof (struct ppc_link_hash_entry) 3356 - offsetof (struct ppc_link_hash_entry, u.stub_cache))); 3357 3358 /* When making function calls, old ABI code references function entry 3359 points (dot symbols), while new ABI code references the function 3360 descriptor symbol. We need to make any combination of reference and 3361 definition work together, without breaking archive linking. 3362 3363 For a defined function "foo" and an undefined call to "bar": 3364 An old object defines "foo" and ".foo", references ".bar" (possibly 3365 "bar" too). 3366 A new object defines "foo" and references "bar". 3367 3368 A new object thus has no problem with its undefined symbols being 3369 satisfied by definitions in an old object. On the other hand, the 3370 old object won't have ".bar" satisfied by a new object. 3371 3372 Keep a list of newly added dot-symbols. */ 3373 3374 if (string[0] == '.') 3375 { 3376 struct ppc_link_hash_table *htab; 3377 3378 htab = (struct ppc_link_hash_table *) table; 3379 eh->u.next_dot_sym = htab->dot_syms; 3380 htab->dot_syms = eh; 3381 } 3382 } 3383 3384 return entry; 3385 } 3386 3387 struct tocsave_entry 3388 { 3389 asection *sec; 3390 bfd_vma offset; 3391 }; 3392 3393 static hashval_t 3394 tocsave_htab_hash (const void *p) 3395 { 3396 const struct tocsave_entry *e = (const struct tocsave_entry *) p; 3397 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3; 3398 } 3399 3400 static int 3401 tocsave_htab_eq (const void *p1, const void *p2) 3402 { 3403 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1; 3404 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2; 3405 return e1->sec == e2->sec && e1->offset == e2->offset; 3406 } 3407 3408 /* Destroy a ppc64 ELF linker hash table. */ 3409 3410 static void 3411 ppc64_elf_link_hash_table_free (bfd *obfd) 3412 { 3413 struct ppc_link_hash_table *htab; 3414 3415 htab = (struct ppc_link_hash_table *) obfd->link.hash; 3416 if (htab->tocsave_htab) 3417 htab_delete (htab->tocsave_htab); 3418 bfd_hash_table_free (&htab->branch_hash_table); 3419 bfd_hash_table_free (&htab->stub_hash_table); 3420 _bfd_elf_link_hash_table_free (obfd); 3421 } 3422 3423 /* Create a ppc64 ELF linker hash table. */ 3424 3425 static struct bfd_link_hash_table * 3426 ppc64_elf_link_hash_table_create (bfd *abfd) 3427 { 3428 struct ppc_link_hash_table *htab; 3429 bfd_size_type amt = sizeof (struct ppc_link_hash_table); 3430 3431 htab = bfd_zmalloc (amt); 3432 if (htab == NULL) 3433 return NULL; 3434 3435 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc, 3436 sizeof (struct ppc_link_hash_entry), 3437 PPC64_ELF_DATA)) 3438 { 3439 free (htab); 3440 return NULL; 3441 } 3442 3443 /* Init the stub hash table too. */ 3444 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc, 3445 sizeof (struct ppc_stub_hash_entry))) 3446 { 3447 _bfd_elf_link_hash_table_free (abfd); 3448 return NULL; 3449 } 3450 3451 /* And the branch hash table. */ 3452 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc, 3453 sizeof (struct ppc_branch_hash_entry))) 3454 { 3455 bfd_hash_table_free (&htab->stub_hash_table); 3456 _bfd_elf_link_hash_table_free (abfd); 3457 return NULL; 3458 } 3459 3460 htab->tocsave_htab = htab_try_create (1024, 3461 tocsave_htab_hash, 3462 tocsave_htab_eq, 3463 NULL); 3464 if (htab->tocsave_htab == NULL) 3465 { 3466 ppc64_elf_link_hash_table_free (abfd); 3467 return NULL; 3468 } 3469 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free; 3470 3471 /* Initializing two fields of the union is just cosmetic. We really 3472 only care about glist, but when compiled on a 32-bit host the 3473 bfd_vma fields are larger. Setting the bfd_vma to zero makes 3474 debugger inspection of these fields look nicer. */ 3475 htab->elf.init_got_refcount.refcount = 0; 3476 htab->elf.init_got_refcount.glist = NULL; 3477 htab->elf.init_plt_refcount.refcount = 0; 3478 htab->elf.init_plt_refcount.glist = NULL; 3479 htab->elf.init_got_offset.offset = 0; 3480 htab->elf.init_got_offset.glist = NULL; 3481 htab->elf.init_plt_offset.offset = 0; 3482 htab->elf.init_plt_offset.glist = NULL; 3483 3484 return &htab->elf.root; 3485 } 3486 3487 /* Create sections for linker generated code. */ 3488 3489 static bfd_boolean 3490 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info) 3491 { 3492 struct ppc_link_hash_table *htab; 3493 flagword flags; 3494 3495 htab = ppc_hash_table (info); 3496 3497 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY 3498 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); 3499 if (htab->params->save_restore_funcs) 3500 { 3501 /* Create .sfpr for code to save and restore fp regs. */ 3502 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr", 3503 flags); 3504 if (htab->sfpr == NULL 3505 || !bfd_set_section_alignment (htab->sfpr, 2)) 3506 return FALSE; 3507 } 3508 3509 if (bfd_link_relocatable (info)) 3510 return TRUE; 3511 3512 /* Create .glink for lazy dynamic linking support. */ 3513 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink", 3514 flags); 3515 if (htab->glink == NULL 3516 || !bfd_set_section_alignment (htab->glink, 3)) 3517 return FALSE; 3518 3519 /* The part of .glink used by global entry stubs, separate so that 3520 it can be aligned appropriately without affecting htab->glink. */ 3521 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink", 3522 flags); 3523 if (htab->global_entry == NULL 3524 || !bfd_set_section_alignment (htab->global_entry, 2)) 3525 return FALSE; 3526 3527 if (!info->no_ld_generated_unwind_info) 3528 { 3529 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS 3530 | SEC_IN_MEMORY | SEC_LINKER_CREATED); 3531 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj, 3532 ".eh_frame", 3533 flags); 3534 if (htab->glink_eh_frame == NULL 3535 || !bfd_set_section_alignment (htab->glink_eh_frame, 2)) 3536 return FALSE; 3537 } 3538 3539 flags = SEC_ALLOC | SEC_LINKER_CREATED; 3540 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags); 3541 if (htab->elf.iplt == NULL 3542 || !bfd_set_section_alignment (htab->elf.iplt, 3)) 3543 return FALSE; 3544 3545 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY 3546 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); 3547 htab->elf.irelplt 3548 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags); 3549 if (htab->elf.irelplt == NULL 3550 || !bfd_set_section_alignment (htab->elf.irelplt, 3)) 3551 return FALSE; 3552 3553 /* Create branch lookup table for plt_branch stubs. */ 3554 flags = (SEC_ALLOC | SEC_LOAD 3555 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); 3556 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt", 3557 flags); 3558 if (htab->brlt == NULL 3559 || !bfd_set_section_alignment (htab->brlt, 3)) 3560 return FALSE; 3561 3562 /* Local plt entries, put in .branch_lt but a separate section for 3563 convenience. */ 3564 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt", 3565 flags); 3566 if (htab->pltlocal == NULL 3567 || !bfd_set_section_alignment (htab->pltlocal, 3)) 3568 return FALSE; 3569 3570 if (!bfd_link_pic (info)) 3571 return TRUE; 3572 3573 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY 3574 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); 3575 htab->relbrlt 3576 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags); 3577 if (htab->relbrlt == NULL 3578 || !bfd_set_section_alignment (htab->relbrlt, 3)) 3579 return FALSE; 3580 3581 htab->relpltlocal 3582 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags); 3583 if (htab->relpltlocal == NULL 3584 || !bfd_set_section_alignment (htab->relpltlocal, 3)) 3585 return FALSE; 3586 3587 return TRUE; 3588 } 3589 3590 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */ 3591 3592 bfd_boolean 3593 ppc64_elf_init_stub_bfd (struct bfd_link_info *info, 3594 struct ppc64_elf_params *params) 3595 { 3596 struct ppc_link_hash_table *htab; 3597 3598 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64; 3599 3600 /* Always hook our dynamic sections into the first bfd, which is the 3601 linker created stub bfd. This ensures that the GOT header is at 3602 the start of the output TOC section. */ 3603 htab = ppc_hash_table (info); 3604 htab->elf.dynobj = params->stub_bfd; 3605 htab->params = params; 3606 3607 return create_linkage_sections (htab->elf.dynobj, info); 3608 } 3609 3610 /* Build a name for an entry in the stub hash table. */ 3611 3612 static char * 3613 ppc_stub_name (const asection *input_section, 3614 const asection *sym_sec, 3615 const struct ppc_link_hash_entry *h, 3616 const Elf_Internal_Rela *rel) 3617 { 3618 char *stub_name; 3619 ssize_t len; 3620 3621 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31 3622 offsets from a sym as a branch target? In fact, we could 3623 probably assume the addend is always zero. */ 3624 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend); 3625 3626 if (h) 3627 { 3628 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1; 3629 stub_name = bfd_malloc (len); 3630 if (stub_name == NULL) 3631 return stub_name; 3632 3633 len = sprintf (stub_name, "%08x.%s+%x", 3634 input_section->id & 0xffffffff, 3635 h->elf.root.root.string, 3636 (int) rel->r_addend & 0xffffffff); 3637 } 3638 else 3639 { 3640 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1; 3641 stub_name = bfd_malloc (len); 3642 if (stub_name == NULL) 3643 return stub_name; 3644 3645 len = sprintf (stub_name, "%08x.%x:%x+%x", 3646 input_section->id & 0xffffffff, 3647 sym_sec->id & 0xffffffff, 3648 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff, 3649 (int) rel->r_addend & 0xffffffff); 3650 } 3651 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0') 3652 stub_name[len - 2] = 0; 3653 return stub_name; 3654 } 3655 3656 /* Look up an entry in the stub hash. Stub entries are cached because 3657 creating the stub name takes a bit of time. */ 3658 3659 static struct ppc_stub_hash_entry * 3660 ppc_get_stub_entry (const asection *input_section, 3661 const asection *sym_sec, 3662 struct ppc_link_hash_entry *h, 3663 const Elf_Internal_Rela *rel, 3664 struct ppc_link_hash_table *htab) 3665 { 3666 struct ppc_stub_hash_entry *stub_entry; 3667 struct map_stub *group; 3668 3669 /* If this input section is part of a group of sections sharing one 3670 stub section, then use the id of the first section in the group. 3671 Stub names need to include a section id, as there may well be 3672 more than one stub used to reach say, printf, and we need to 3673 distinguish between them. */ 3674 group = htab->sec_info[input_section->id].u.group; 3675 if (group == NULL) 3676 return NULL; 3677 3678 if (h != NULL && h->u.stub_cache != NULL 3679 && h->u.stub_cache->h == h 3680 && h->u.stub_cache->group == group) 3681 { 3682 stub_entry = h->u.stub_cache; 3683 } 3684 else 3685 { 3686 char *stub_name; 3687 3688 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel); 3689 if (stub_name == NULL) 3690 return NULL; 3691 3692 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, 3693 stub_name, FALSE, FALSE); 3694 if (h != NULL) 3695 h->u.stub_cache = stub_entry; 3696 3697 free (stub_name); 3698 } 3699 3700 return stub_entry; 3701 } 3702 3703 /* Add a new stub entry to the stub hash. Not all fields of the new 3704 stub entry are initialised. */ 3705 3706 static struct ppc_stub_hash_entry * 3707 ppc_add_stub (const char *stub_name, 3708 asection *section, 3709 struct bfd_link_info *info) 3710 { 3711 struct ppc_link_hash_table *htab = ppc_hash_table (info); 3712 struct map_stub *group; 3713 asection *link_sec; 3714 asection *stub_sec; 3715 struct ppc_stub_hash_entry *stub_entry; 3716 3717 group = htab->sec_info[section->id].u.group; 3718 link_sec = group->link_sec; 3719 stub_sec = group->stub_sec; 3720 if (stub_sec == NULL) 3721 { 3722 size_t namelen; 3723 bfd_size_type len; 3724 char *s_name; 3725 3726 namelen = strlen (link_sec->name); 3727 len = namelen + sizeof (STUB_SUFFIX); 3728 s_name = bfd_alloc (htab->params->stub_bfd, len); 3729 if (s_name == NULL) 3730 return NULL; 3731 3732 memcpy (s_name, link_sec->name, namelen); 3733 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX)); 3734 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec); 3735 if (stub_sec == NULL) 3736 return NULL; 3737 group->stub_sec = stub_sec; 3738 } 3739 3740 /* Enter this entry into the linker stub hash table. */ 3741 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name, 3742 TRUE, FALSE); 3743 if (stub_entry == NULL) 3744 { 3745 /* xgettext:c-format */ 3746 _bfd_error_handler (_("%pB: cannot create stub entry %s"), 3747 section->owner, stub_name); 3748 return NULL; 3749 } 3750 3751 stub_entry->group = group; 3752 stub_entry->stub_offset = 0; 3753 return stub_entry; 3754 } 3755 3756 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if 3757 not already done. */ 3758 3759 static bfd_boolean 3760 create_got_section (bfd *abfd, struct bfd_link_info *info) 3761 { 3762 asection *got, *relgot; 3763 flagword flags; 3764 struct ppc_link_hash_table *htab = ppc_hash_table (info); 3765 3766 if (!is_ppc64_elf (abfd)) 3767 return FALSE; 3768 if (htab == NULL) 3769 return FALSE; 3770 3771 if (!htab->elf.sgot 3772 && !_bfd_elf_create_got_section (htab->elf.dynobj, info)) 3773 return FALSE; 3774 3775 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY 3776 | SEC_LINKER_CREATED); 3777 3778 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags); 3779 if (!got 3780 || !bfd_set_section_alignment (got, 3)) 3781 return FALSE; 3782 3783 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got", 3784 flags | SEC_READONLY); 3785 if (!relgot 3786 || !bfd_set_section_alignment (relgot, 3)) 3787 return FALSE; 3788 3789 ppc64_elf_tdata (abfd)->got = got; 3790 ppc64_elf_tdata (abfd)->relgot = relgot; 3791 return TRUE; 3792 } 3793 3794 /* Follow indirect and warning symbol links. */ 3795 3796 static inline struct bfd_link_hash_entry * 3797 follow_link (struct bfd_link_hash_entry *h) 3798 { 3799 while (h->type == bfd_link_hash_indirect 3800 || h->type == bfd_link_hash_warning) 3801 h = h->u.i.link; 3802 return h; 3803 } 3804 3805 static inline struct elf_link_hash_entry * 3806 elf_follow_link (struct elf_link_hash_entry *h) 3807 { 3808 return (struct elf_link_hash_entry *) follow_link (&h->root); 3809 } 3810 3811 static inline struct ppc_link_hash_entry * 3812 ppc_follow_link (struct ppc_link_hash_entry *h) 3813 { 3814 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root); 3815 } 3816 3817 /* Merge PLT info on FROM with that on TO. */ 3818 3819 static void 3820 move_plt_plist (struct ppc_link_hash_entry *from, 3821 struct ppc_link_hash_entry *to) 3822 { 3823 if (from->elf.plt.plist != NULL) 3824 { 3825 if (to->elf.plt.plist != NULL) 3826 { 3827 struct plt_entry **entp; 3828 struct plt_entry *ent; 3829 3830 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; ) 3831 { 3832 struct plt_entry *dent; 3833 3834 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next) 3835 if (dent->addend == ent->addend) 3836 { 3837 dent->plt.refcount += ent->plt.refcount; 3838 *entp = ent->next; 3839 break; 3840 } 3841 if (dent == NULL) 3842 entp = &ent->next; 3843 } 3844 *entp = to->elf.plt.plist; 3845 } 3846 3847 to->elf.plt.plist = from->elf.plt.plist; 3848 from->elf.plt.plist = NULL; 3849 } 3850 } 3851 3852 /* Copy the extra info we tack onto an elf_link_hash_entry. */ 3853 3854 static void 3855 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info, 3856 struct elf_link_hash_entry *dir, 3857 struct elf_link_hash_entry *ind) 3858 { 3859 struct ppc_link_hash_entry *edir, *eind; 3860 3861 edir = (struct ppc_link_hash_entry *) dir; 3862 eind = (struct ppc_link_hash_entry *) ind; 3863 3864 edir->is_func |= eind->is_func; 3865 edir->is_func_descriptor |= eind->is_func_descriptor; 3866 edir->tls_mask |= eind->tls_mask; 3867 if (eind->oh != NULL) 3868 edir->oh = ppc_follow_link (eind->oh); 3869 3870 if (edir->elf.versioned != versioned_hidden) 3871 edir->elf.ref_dynamic |= eind->elf.ref_dynamic; 3872 edir->elf.ref_regular |= eind->elf.ref_regular; 3873 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak; 3874 edir->elf.non_got_ref |= eind->elf.non_got_ref; 3875 edir->elf.needs_plt |= eind->elf.needs_plt; 3876 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed; 3877 3878 /* If we were called to copy over info for a weak sym, don't copy 3879 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs 3880 in order to simplify readonly_dynrelocs and save a field in the 3881 symbol hash entry, but that means dyn_relocs can't be used in any 3882 tests about a specific symbol, or affect other symbol flags which 3883 are then tested. */ 3884 if (eind->elf.root.type != bfd_link_hash_indirect) 3885 return; 3886 3887 /* Copy over any dynamic relocs we may have on the indirect sym. */ 3888 if (eind->dyn_relocs != NULL) 3889 { 3890 if (edir->dyn_relocs != NULL) 3891 { 3892 struct elf_dyn_relocs **pp; 3893 struct elf_dyn_relocs *p; 3894 3895 /* Add reloc counts against the indirect sym to the direct sym 3896 list. Merge any entries against the same section. */ 3897 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 3898 { 3899 struct elf_dyn_relocs *q; 3900 3901 for (q = edir->dyn_relocs; q != NULL; q = q->next) 3902 if (q->sec == p->sec) 3903 { 3904 q->pc_count += p->pc_count; 3905 q->count += p->count; 3906 *pp = p->next; 3907 break; 3908 } 3909 if (q == NULL) 3910 pp = &p->next; 3911 } 3912 *pp = edir->dyn_relocs; 3913 } 3914 3915 edir->dyn_relocs = eind->dyn_relocs; 3916 eind->dyn_relocs = NULL; 3917 } 3918 3919 /* Copy over got entries that we may have already seen to the 3920 symbol which just became indirect. */ 3921 if (eind->elf.got.glist != NULL) 3922 { 3923 if (edir->elf.got.glist != NULL) 3924 { 3925 struct got_entry **entp; 3926 struct got_entry *ent; 3927 3928 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; ) 3929 { 3930 struct got_entry *dent; 3931 3932 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next) 3933 if (dent->addend == ent->addend 3934 && dent->owner == ent->owner 3935 && dent->tls_type == ent->tls_type) 3936 { 3937 dent->got.refcount += ent->got.refcount; 3938 *entp = ent->next; 3939 break; 3940 } 3941 if (dent == NULL) 3942 entp = &ent->next; 3943 } 3944 *entp = edir->elf.got.glist; 3945 } 3946 3947 edir->elf.got.glist = eind->elf.got.glist; 3948 eind->elf.got.glist = NULL; 3949 } 3950 3951 /* And plt entries. */ 3952 move_plt_plist (eind, edir); 3953 3954 if (eind->elf.dynindx != -1) 3955 { 3956 if (edir->elf.dynindx != -1) 3957 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr, 3958 edir->elf.dynstr_index); 3959 edir->elf.dynindx = eind->elf.dynindx; 3960 edir->elf.dynstr_index = eind->elf.dynstr_index; 3961 eind->elf.dynindx = -1; 3962 eind->elf.dynstr_index = 0; 3963 } 3964 } 3965 3966 /* Find the function descriptor hash entry from the given function code 3967 hash entry FH. Link the entries via their OH fields. */ 3968 3969 static struct ppc_link_hash_entry * 3970 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab) 3971 { 3972 struct ppc_link_hash_entry *fdh = fh->oh; 3973 3974 if (fdh == NULL) 3975 { 3976 const char *fd_name = fh->elf.root.root.string + 1; 3977 3978 fdh = (struct ppc_link_hash_entry *) 3979 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE); 3980 if (fdh == NULL) 3981 return fdh; 3982 3983 fdh->is_func_descriptor = 1; 3984 fdh->oh = fh; 3985 fh->is_func = 1; 3986 fh->oh = fdh; 3987 } 3988 3989 fdh = ppc_follow_link (fdh); 3990 fdh->is_func_descriptor = 1; 3991 fdh->oh = fh; 3992 return fdh; 3993 } 3994 3995 /* Make a fake function descriptor sym for the undefined code sym FH. */ 3996 3997 static struct ppc_link_hash_entry * 3998 make_fdh (struct bfd_link_info *info, 3999 struct ppc_link_hash_entry *fh) 4000 { 4001 bfd *abfd = fh->elf.root.u.undef.abfd; 4002 struct bfd_link_hash_entry *bh = NULL; 4003 struct ppc_link_hash_entry *fdh; 4004 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak 4005 ? BSF_WEAK 4006 : BSF_GLOBAL); 4007 4008 if (!_bfd_generic_link_add_one_symbol (info, abfd, 4009 fh->elf.root.root.string + 1, 4010 flags, bfd_und_section_ptr, 0, 4011 NULL, FALSE, FALSE, &bh)) 4012 return NULL; 4013 4014 fdh = (struct ppc_link_hash_entry *) bh; 4015 fdh->elf.non_elf = 0; 4016 fdh->fake = 1; 4017 fdh->is_func_descriptor = 1; 4018 fdh->oh = fh; 4019 fh->is_func = 1; 4020 fh->oh = fdh; 4021 return fdh; 4022 } 4023 4024 /* Fix function descriptor symbols defined in .opd sections to be 4025 function type. */ 4026 4027 static bfd_boolean 4028 ppc64_elf_add_symbol_hook (bfd *ibfd, 4029 struct bfd_link_info *info, 4030 Elf_Internal_Sym *isym, 4031 const char **name, 4032 flagword *flags ATTRIBUTE_UNUSED, 4033 asection **sec, 4034 bfd_vma *value) 4035 { 4036 if (*sec != NULL 4037 && strcmp ((*sec)->name, ".opd") == 0) 4038 { 4039 asection *code_sec; 4040 4041 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC 4042 || ELF_ST_TYPE (isym->st_info) == STT_FUNC)) 4043 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC); 4044 4045 /* If the symbol is a function defined in .opd, and the function 4046 code is in a discarded group, let it appear to be undefined. */ 4047 if (!bfd_link_relocatable (info) 4048 && (*sec)->reloc_count != 0 4049 && opd_entry_value (*sec, *value, &code_sec, NULL, 4050 FALSE) != (bfd_vma) -1 4051 && discarded_section (code_sec)) 4052 { 4053 *sec = bfd_und_section_ptr; 4054 isym->st_shndx = SHN_UNDEF; 4055 } 4056 } 4057 else if (*sec != NULL 4058 && strcmp ((*sec)->name, ".toc") == 0 4059 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT) 4060 { 4061 struct ppc_link_hash_table *htab = ppc_hash_table (info); 4062 if (htab != NULL) 4063 htab->params->object_in_toc = 1; 4064 } 4065 4066 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0) 4067 { 4068 if (abiversion (ibfd) == 0) 4069 set_abiversion (ibfd, 2); 4070 else if (abiversion (ibfd) == 1) 4071 { 4072 _bfd_error_handler (_("symbol '%s' has invalid st_other" 4073 " for ABI version 1"), *name); 4074 bfd_set_error (bfd_error_bad_value); 4075 return FALSE; 4076 } 4077 } 4078 4079 return TRUE; 4080 } 4081 4082 /* Merge non-visibility st_other attributes: local entry point. */ 4083 4084 static void 4085 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h, 4086 const Elf_Internal_Sym *isym, 4087 bfd_boolean definition, 4088 bfd_boolean dynamic) 4089 { 4090 if (definition && (!dynamic || !h->def_regular)) 4091 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) 4092 | ELF_ST_VISIBILITY (h->other)); 4093 } 4094 4095 /* Hook called on merging a symbol. We use this to clear "fake" since 4096 we now have a real symbol. */ 4097 4098 static bfd_boolean 4099 ppc64_elf_merge_symbol (struct elf_link_hash_entry *h, 4100 const Elf_Internal_Sym *isym, 4101 asection **psec ATTRIBUTE_UNUSED, 4102 bfd_boolean newdef ATTRIBUTE_UNUSED, 4103 bfd_boolean olddef ATTRIBUTE_UNUSED, 4104 bfd *oldbfd ATTRIBUTE_UNUSED, 4105 const asection *oldsec ATTRIBUTE_UNUSED) 4106 { 4107 ((struct ppc_link_hash_entry *) h)->fake = 0; 4108 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0) 4109 ((struct ppc_link_hash_entry *) h)->non_zero_localentry = 1; 4110 return TRUE; 4111 } 4112 4113 /* This function makes an old ABI object reference to ".bar" cause the 4114 inclusion of a new ABI object archive that defines "bar". 4115 NAME is a symbol defined in an archive. Return a symbol in the hash 4116 table that might be satisfied by the archive symbols. */ 4117 4118 static struct elf_link_hash_entry * 4119 ppc64_elf_archive_symbol_lookup (bfd *abfd, 4120 struct bfd_link_info *info, 4121 const char *name) 4122 { 4123 struct elf_link_hash_entry *h; 4124 char *dot_name; 4125 size_t len; 4126 4127 h = _bfd_elf_archive_symbol_lookup (abfd, info, name); 4128 if (h != NULL 4129 /* Don't return this sym if it is a fake function descriptor 4130 created by add_symbol_adjust. */ 4131 && !((struct ppc_link_hash_entry *) h)->fake) 4132 return h; 4133 4134 if (name[0] == '.') 4135 return h; 4136 4137 len = strlen (name); 4138 dot_name = bfd_alloc (abfd, len + 2); 4139 if (dot_name == NULL) 4140 return (struct elf_link_hash_entry *) -1; 4141 dot_name[0] = '.'; 4142 memcpy (dot_name + 1, name, len + 1); 4143 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name); 4144 bfd_release (abfd, dot_name); 4145 return h; 4146 } 4147 4148 /* This function satisfies all old ABI object references to ".bar" if a 4149 new ABI object defines "bar". Well, at least, undefined dot symbols 4150 are made weak. This stops later archive searches from including an 4151 object if we already have a function descriptor definition. It also 4152 prevents the linker complaining about undefined symbols. 4153 We also check and correct mismatched symbol visibility here. The 4154 most restrictive visibility of the function descriptor and the 4155 function entry symbol is used. */ 4156 4157 static bfd_boolean 4158 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info) 4159 { 4160 struct ppc_link_hash_table *htab; 4161 struct ppc_link_hash_entry *fdh; 4162 4163 if (eh->elf.root.type == bfd_link_hash_warning) 4164 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link; 4165 4166 if (eh->elf.root.type == bfd_link_hash_indirect) 4167 return TRUE; 4168 4169 if (eh->elf.root.root.string[0] != '.') 4170 abort (); 4171 4172 htab = ppc_hash_table (info); 4173 if (htab == NULL) 4174 return FALSE; 4175 4176 fdh = lookup_fdh (eh, htab); 4177 if (fdh == NULL 4178 && !bfd_link_relocatable (info) 4179 && (eh->elf.root.type == bfd_link_hash_undefined 4180 || eh->elf.root.type == bfd_link_hash_undefweak) 4181 && eh->elf.ref_regular) 4182 { 4183 /* Make an undefined function descriptor sym, in order to 4184 pull in an --as-needed shared lib. Archives are handled 4185 elsewhere. */ 4186 fdh = make_fdh (info, eh); 4187 if (fdh == NULL) 4188 return FALSE; 4189 } 4190 4191 if (fdh != NULL) 4192 { 4193 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1; 4194 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1; 4195 4196 /* Make both descriptor and entry symbol have the most 4197 constraining visibility of either symbol. */ 4198 if (entry_vis < descr_vis) 4199 fdh->elf.other += entry_vis - descr_vis; 4200 else if (entry_vis > descr_vis) 4201 eh->elf.other += descr_vis - entry_vis; 4202 4203 /* Propagate reference flags from entry symbol to function 4204 descriptor symbol. */ 4205 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular; 4206 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic; 4207 fdh->elf.ref_regular |= eh->elf.ref_regular; 4208 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak; 4209 4210 if (!fdh->elf.forced_local 4211 && fdh->elf.dynindx == -1 4212 && fdh->elf.versioned != versioned_hidden 4213 && (bfd_link_dll (info) 4214 || fdh->elf.def_dynamic 4215 || fdh->elf.ref_dynamic) 4216 && (eh->elf.ref_regular 4217 || eh->elf.def_regular)) 4218 { 4219 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf)) 4220 return FALSE; 4221 } 4222 } 4223 4224 return TRUE; 4225 } 4226 4227 /* Set up opd section info and abiversion for IBFD, and process list 4228 of dot-symbols we made in link_hash_newfunc. */ 4229 4230 static bfd_boolean 4231 ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info) 4232 { 4233 struct ppc_link_hash_table *htab; 4234 struct ppc_link_hash_entry **p, *eh; 4235 asection *opd = bfd_get_section_by_name (ibfd, ".opd"); 4236 4237 if (opd != NULL && opd->size != 0) 4238 { 4239 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal); 4240 ppc64_elf_section_data (opd)->sec_type = sec_opd; 4241 4242 if (abiversion (ibfd) == 0) 4243 set_abiversion (ibfd, 1); 4244 else if (abiversion (ibfd) >= 2) 4245 { 4246 /* xgettext:c-format */ 4247 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"), 4248 ibfd, abiversion (ibfd)); 4249 bfd_set_error (bfd_error_bad_value); 4250 return FALSE; 4251 } 4252 } 4253 4254 if (is_ppc64_elf (info->output_bfd)) 4255 { 4256 /* For input files without an explicit abiversion in e_flags 4257 we should have flagged any with symbol st_other bits set 4258 as ELFv1 and above flagged those with .opd as ELFv2. 4259 Set the output abiversion if not yet set, and for any input 4260 still ambiguous, take its abiversion from the output. 4261 Differences in ABI are reported later. */ 4262 if (abiversion (info->output_bfd) == 0) 4263 set_abiversion (info->output_bfd, abiversion (ibfd)); 4264 else if (abiversion (ibfd) == 0) 4265 set_abiversion (ibfd, abiversion (info->output_bfd)); 4266 } 4267 4268 htab = ppc_hash_table (info); 4269 if (htab == NULL) 4270 return TRUE; 4271 4272 if (opd != NULL && opd->size != 0 4273 && (ibfd->flags & DYNAMIC) == 0 4274 && (opd->flags & SEC_RELOC) != 0 4275 && opd->reloc_count != 0 4276 && !bfd_is_abs_section (opd->output_section) 4277 && info->gc_sections) 4278 { 4279 /* Garbage collection needs some extra help with .opd sections. 4280 We don't want to necessarily keep everything referenced by 4281 relocs in .opd, as that would keep all functions. Instead, 4282 if we reference an .opd symbol (a function descriptor), we 4283 want to keep the function code symbol's section. This is 4284 easy for global symbols, but for local syms we need to keep 4285 information about the associated function section. */ 4286 bfd_size_type amt; 4287 asection **opd_sym_map; 4288 Elf_Internal_Shdr *symtab_hdr; 4289 Elf_Internal_Rela *relocs, *rel_end, *rel; 4290 4291 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map); 4292 opd_sym_map = bfd_zalloc (ibfd, amt); 4293 if (opd_sym_map == NULL) 4294 return FALSE; 4295 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map; 4296 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL, 4297 info->keep_memory); 4298 if (relocs == NULL) 4299 return FALSE; 4300 symtab_hdr = &elf_symtab_hdr (ibfd); 4301 rel_end = relocs + opd->reloc_count - 1; 4302 for (rel = relocs; rel < rel_end; rel++) 4303 { 4304 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info); 4305 unsigned long r_symndx = ELF64_R_SYM (rel->r_info); 4306 4307 if (r_type == R_PPC64_ADDR64 4308 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC 4309 && r_symndx < symtab_hdr->sh_info) 4310 { 4311 Elf_Internal_Sym *isym; 4312 asection *s; 4313 4314 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx); 4315 if (isym == NULL) 4316 { 4317 if (elf_section_data (opd)->relocs != relocs) 4318 free (relocs); 4319 return FALSE; 4320 } 4321 4322 s = bfd_section_from_elf_index (ibfd, isym->st_shndx); 4323 if (s != NULL && s != opd) 4324 opd_sym_map[OPD_NDX (rel->r_offset)] = s; 4325 } 4326 } 4327 if (elf_section_data (opd)->relocs != relocs) 4328 free (relocs); 4329 } 4330 4331 p = &htab->dot_syms; 4332 while ((eh = *p) != NULL) 4333 { 4334 *p = NULL; 4335 if (&eh->elf == htab->elf.hgot) 4336 ; 4337 else if (htab->elf.hgot == NULL 4338 && strcmp (eh->elf.root.root.string, ".TOC.") == 0) 4339 htab->elf.hgot = &eh->elf; 4340 else if (abiversion (ibfd) <= 1) 4341 { 4342 htab->need_func_desc_adj = 1; 4343 if (!add_symbol_adjust (eh, info)) 4344 return FALSE; 4345 } 4346 p = &eh->u.next_dot_sym; 4347 } 4348 return TRUE; 4349 } 4350 4351 /* Undo hash table changes when an --as-needed input file is determined 4352 not to be needed. */ 4353 4354 static bfd_boolean 4355 ppc64_elf_notice_as_needed (bfd *ibfd, 4356 struct bfd_link_info *info, 4357 enum notice_asneeded_action act) 4358 { 4359 if (act == notice_not_needed) 4360 { 4361 struct ppc_link_hash_table *htab = ppc_hash_table (info); 4362 4363 if (htab == NULL) 4364 return FALSE; 4365 4366 htab->dot_syms = NULL; 4367 } 4368 return _bfd_elf_notice_as_needed (ibfd, info, act); 4369 } 4370 4371 /* If --just-symbols against a final linked binary, then assume we need 4372 toc adjusting stubs when calling functions defined there. */ 4373 4374 static void 4375 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info) 4376 { 4377 if ((sec->flags & SEC_CODE) != 0 4378 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0 4379 && is_ppc64_elf (sec->owner)) 4380 { 4381 if (abiversion (sec->owner) >= 2 4382 || bfd_get_section_by_name (sec->owner, ".opd") != NULL) 4383 sec->has_toc_reloc = 1; 4384 } 4385 _bfd_elf_link_just_syms (sec, info); 4386 } 4387 4388 static struct plt_entry ** 4389 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr, 4390 unsigned long r_symndx, bfd_vma r_addend, int tls_type) 4391 { 4392 struct got_entry **local_got_ents = elf_local_got_ents (abfd); 4393 struct plt_entry **local_plt; 4394 unsigned char *local_got_tls_masks; 4395 4396 if (local_got_ents == NULL) 4397 { 4398 bfd_size_type size = symtab_hdr->sh_info; 4399 4400 size *= (sizeof (*local_got_ents) 4401 + sizeof (*local_plt) 4402 + sizeof (*local_got_tls_masks)); 4403 local_got_ents = bfd_zalloc (abfd, size); 4404 if (local_got_ents == NULL) 4405 return NULL; 4406 elf_local_got_ents (abfd) = local_got_ents; 4407 } 4408 4409 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0) 4410 { 4411 struct got_entry *ent; 4412 4413 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next) 4414 if (ent->addend == r_addend 4415 && ent->owner == abfd 4416 && ent->tls_type == tls_type) 4417 break; 4418 if (ent == NULL) 4419 { 4420 bfd_size_type amt = sizeof (*ent); 4421 ent = bfd_alloc (abfd, amt); 4422 if (ent == NULL) 4423 return FALSE; 4424 ent->next = local_got_ents[r_symndx]; 4425 ent->addend = r_addend; 4426 ent->owner = abfd; 4427 ent->tls_type = tls_type; 4428 ent->is_indirect = FALSE; 4429 ent->got.refcount = 0; 4430 local_got_ents[r_symndx] = ent; 4431 } 4432 ent->got.refcount += 1; 4433 } 4434 4435 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info); 4436 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info); 4437 local_got_tls_masks[r_symndx] |= tls_type & 0xff; 4438 4439 return local_plt + r_symndx; 4440 } 4441 4442 static bfd_boolean 4443 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend) 4444 { 4445 struct plt_entry *ent; 4446 4447 for (ent = *plist; ent != NULL; ent = ent->next) 4448 if (ent->addend == addend) 4449 break; 4450 if (ent == NULL) 4451 { 4452 bfd_size_type amt = sizeof (*ent); 4453 ent = bfd_alloc (abfd, amt); 4454 if (ent == NULL) 4455 return FALSE; 4456 ent->next = *plist; 4457 ent->addend = addend; 4458 ent->plt.refcount = 0; 4459 *plist = ent; 4460 } 4461 ent->plt.refcount += 1; 4462 return TRUE; 4463 } 4464 4465 static bfd_boolean 4466 is_branch_reloc (enum elf_ppc64_reloc_type r_type) 4467 { 4468 return (r_type == R_PPC64_REL24 4469 || r_type == R_PPC64_REL24_NOTOC 4470 || r_type == R_PPC64_REL14 4471 || r_type == R_PPC64_REL14_BRTAKEN 4472 || r_type == R_PPC64_REL14_BRNTAKEN 4473 || r_type == R_PPC64_ADDR24 4474 || r_type == R_PPC64_ADDR14 4475 || r_type == R_PPC64_ADDR14_BRTAKEN 4476 || r_type == R_PPC64_ADDR14_BRNTAKEN 4477 || r_type == R_PPC64_PLTCALL 4478 || r_type == R_PPC64_PLTCALL_NOTOC); 4479 } 4480 4481 /* Relocs on inline plt call sequence insns prior to the call. */ 4482 4483 static bfd_boolean 4484 is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type) 4485 { 4486 return (r_type == R_PPC64_PLT16_HA 4487 || r_type == R_PPC64_PLT16_HI 4488 || r_type == R_PPC64_PLT16_LO 4489 || r_type == R_PPC64_PLT16_LO_DS 4490 || r_type == R_PPC64_PLT_PCREL34 4491 || r_type == R_PPC64_PLT_PCREL34_NOTOC 4492 || r_type == R_PPC64_PLTSEQ 4493 || r_type == R_PPC64_PLTSEQ_NOTOC); 4494 } 4495 4496 /* Look through the relocs for a section during the first phase, and 4497 calculate needed space in the global offset table, procedure 4498 linkage table, and dynamic reloc sections. */ 4499 4500 static bfd_boolean 4501 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, 4502 asection *sec, const Elf_Internal_Rela *relocs) 4503 { 4504 struct ppc_link_hash_table *htab; 4505 Elf_Internal_Shdr *symtab_hdr; 4506 struct elf_link_hash_entry **sym_hashes; 4507 const Elf_Internal_Rela *rel; 4508 const Elf_Internal_Rela *rel_end; 4509 asection *sreloc; 4510 struct elf_link_hash_entry *tga, *dottga; 4511 bfd_boolean is_opd; 4512 4513 if (bfd_link_relocatable (info)) 4514 return TRUE; 4515 4516 /* Don't do anything special with non-loaded, non-alloced sections. 4517 In particular, any relocs in such sections should not affect GOT 4518 and PLT reference counting (ie. we don't allow them to create GOT 4519 or PLT entries), there's no possibility or desire to optimize TLS 4520 relocs, and there's not much point in propagating relocs to shared 4521 libs that the dynamic linker won't relocate. */ 4522 if ((sec->flags & SEC_ALLOC) == 0) 4523 return TRUE; 4524 4525 BFD_ASSERT (is_ppc64_elf (abfd)); 4526 4527 htab = ppc_hash_table (info); 4528 if (htab == NULL) 4529 return FALSE; 4530 4531 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr", 4532 FALSE, FALSE, TRUE); 4533 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr", 4534 FALSE, FALSE, TRUE); 4535 symtab_hdr = &elf_symtab_hdr (abfd); 4536 sym_hashes = elf_sym_hashes (abfd); 4537 sreloc = NULL; 4538 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd; 4539 rel_end = relocs + sec->reloc_count; 4540 for (rel = relocs; rel < rel_end; rel++) 4541 { 4542 unsigned long r_symndx; 4543 struct elf_link_hash_entry *h; 4544 enum elf_ppc64_reloc_type r_type; 4545 int tls_type; 4546 struct _ppc64_elf_section_data *ppc64_sec; 4547 struct plt_entry **ifunc, **plt_list; 4548 4549 r_symndx = ELF64_R_SYM (rel->r_info); 4550 if (r_symndx < symtab_hdr->sh_info) 4551 h = NULL; 4552 else 4553 { 4554 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 4555 h = elf_follow_link (h); 4556 4557 if (h == htab->elf.hgot) 4558 sec->has_toc_reloc = 1; 4559 } 4560 4561 r_type = ELF64_R_TYPE (rel->r_info); 4562 switch (r_type) 4563 { 4564 case R_PPC64_D34: 4565 case R_PPC64_D34_LO: 4566 case R_PPC64_D34_HI30: 4567 case R_PPC64_D34_HA30: 4568 case R_PPC64_D28: 4569 case R_PPC64_TPREL34: 4570 case R_PPC64_DTPREL34: 4571 case R_PPC64_PCREL34: 4572 case R_PPC64_GOT_PCREL34: 4573 case R_PPC64_GOT_TLSGD34: 4574 case R_PPC64_GOT_TLSLD34: 4575 case R_PPC64_GOT_TPREL34: 4576 case R_PPC64_GOT_DTPREL34: 4577 case R_PPC64_PLT_PCREL34: 4578 case R_PPC64_PLT_PCREL34_NOTOC: 4579 case R_PPC64_PCREL28: 4580 htab->powerxx_stubs = 1; 4581 break; 4582 default: 4583 break; 4584 } 4585 4586 switch (r_type) 4587 { 4588 case R_PPC64_PLT16_HA: 4589 case R_PPC64_GOT_TLSLD16_HA: 4590 case R_PPC64_GOT_TLSGD16_HA: 4591 case R_PPC64_GOT_TPREL16_HA: 4592 case R_PPC64_GOT_DTPREL16_HA: 4593 case R_PPC64_GOT16_HA: 4594 case R_PPC64_TOC16_HA: 4595 case R_PPC64_PLT16_LO: 4596 case R_PPC64_PLT16_LO_DS: 4597 case R_PPC64_GOT_TLSLD16_LO: 4598 case R_PPC64_GOT_TLSGD16_LO: 4599 case R_PPC64_GOT_TPREL16_LO_DS: 4600 case R_PPC64_GOT_DTPREL16_LO_DS: 4601 case R_PPC64_GOT16_LO: 4602 case R_PPC64_GOT16_LO_DS: 4603 case R_PPC64_TOC16_LO: 4604 case R_PPC64_TOC16_LO_DS: 4605 case R_PPC64_GOT_PCREL34: 4606 ppc64_elf_tdata (abfd)->has_optrel = 1; 4607 ppc64_elf_section_data (sec)->has_optrel = 1; 4608 break; 4609 default: 4610 break; 4611 } 4612 4613 ifunc = NULL; 4614 if (h != NULL) 4615 { 4616 if (h->type == STT_GNU_IFUNC) 4617 { 4618 h->needs_plt = 1; 4619 ifunc = &h->plt.plist; 4620 } 4621 } 4622 else 4623 { 4624 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache, 4625 abfd, r_symndx); 4626 if (isym == NULL) 4627 return FALSE; 4628 4629 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) 4630 { 4631 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx, 4632 rel->r_addend, 4633 NON_GOT | PLT_IFUNC); 4634 if (ifunc == NULL) 4635 return FALSE; 4636 } 4637 } 4638 4639 tls_type = 0; 4640 switch (r_type) 4641 { 4642 case R_PPC64_TLSGD: 4643 case R_PPC64_TLSLD: 4644 /* These special tls relocs tie a call to __tls_get_addr with 4645 its parameter symbol. */ 4646 if (h != NULL) 4647 ((struct ppc_link_hash_entry *) h)->tls_mask |= TLS_TLS | TLS_MARK; 4648 else 4649 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, 4650 rel->r_addend, 4651 NON_GOT | TLS_TLS | TLS_MARK)) 4652 return FALSE; 4653 sec->has_tls_reloc = 1; 4654 break; 4655 4656 case R_PPC64_GOT_TLSLD16: 4657 case R_PPC64_GOT_TLSLD16_LO: 4658 case R_PPC64_GOT_TLSLD16_HI: 4659 case R_PPC64_GOT_TLSLD16_HA: 4660 case R_PPC64_GOT_TLSLD34: 4661 tls_type = TLS_TLS | TLS_LD; 4662 goto dogottls; 4663 4664 case R_PPC64_GOT_TLSGD16: 4665 case R_PPC64_GOT_TLSGD16_LO: 4666 case R_PPC64_GOT_TLSGD16_HI: 4667 case R_PPC64_GOT_TLSGD16_HA: 4668 case R_PPC64_GOT_TLSGD34: 4669 tls_type = TLS_TLS | TLS_GD; 4670 goto dogottls; 4671 4672 case R_PPC64_GOT_TPREL16_DS: 4673 case R_PPC64_GOT_TPREL16_LO_DS: 4674 case R_PPC64_GOT_TPREL16_HI: 4675 case R_PPC64_GOT_TPREL16_HA: 4676 case R_PPC64_GOT_TPREL34: 4677 if (bfd_link_dll (info)) 4678 info->flags |= DF_STATIC_TLS; 4679 tls_type = TLS_TLS | TLS_TPREL; 4680 goto dogottls; 4681 4682 case R_PPC64_GOT_DTPREL16_DS: 4683 case R_PPC64_GOT_DTPREL16_LO_DS: 4684 case R_PPC64_GOT_DTPREL16_HI: 4685 case R_PPC64_GOT_DTPREL16_HA: 4686 case R_PPC64_GOT_DTPREL34: 4687 tls_type = TLS_TLS | TLS_DTPREL; 4688 dogottls: 4689 sec->has_tls_reloc = 1; 4690 goto dogot; 4691 4692 case R_PPC64_GOT16: 4693 case R_PPC64_GOT16_LO: 4694 case R_PPC64_GOT16_HI: 4695 case R_PPC64_GOT16_HA: 4696 case R_PPC64_GOT16_DS: 4697 case R_PPC64_GOT16_LO_DS: 4698 case R_PPC64_GOT_PCREL34: 4699 dogot: 4700 /* This symbol requires a global offset table entry. */ 4701 sec->has_toc_reloc = 1; 4702 if (r_type == R_PPC64_GOT_TLSLD16 4703 || r_type == R_PPC64_GOT_TLSGD16 4704 || r_type == R_PPC64_GOT_TPREL16_DS 4705 || r_type == R_PPC64_GOT_DTPREL16_DS 4706 || r_type == R_PPC64_GOT16 4707 || r_type == R_PPC64_GOT16_DS) 4708 { 4709 htab->do_multi_toc = 1; 4710 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1; 4711 } 4712 4713 if (ppc64_elf_tdata (abfd)->got == NULL 4714 && !create_got_section (abfd, info)) 4715 return FALSE; 4716 4717 if (h != NULL) 4718 { 4719 struct ppc_link_hash_entry *eh; 4720 struct got_entry *ent; 4721 4722 eh = (struct ppc_link_hash_entry *) h; 4723 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next) 4724 if (ent->addend == rel->r_addend 4725 && ent->owner == abfd 4726 && ent->tls_type == tls_type) 4727 break; 4728 if (ent == NULL) 4729 { 4730 bfd_size_type amt = sizeof (*ent); 4731 ent = bfd_alloc (abfd, amt); 4732 if (ent == NULL) 4733 return FALSE; 4734 ent->next = eh->elf.got.glist; 4735 ent->addend = rel->r_addend; 4736 ent->owner = abfd; 4737 ent->tls_type = tls_type; 4738 ent->is_indirect = FALSE; 4739 ent->got.refcount = 0; 4740 eh->elf.got.glist = ent; 4741 } 4742 ent->got.refcount += 1; 4743 eh->tls_mask |= tls_type; 4744 } 4745 else 4746 /* This is a global offset table entry for a local symbol. */ 4747 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, 4748 rel->r_addend, tls_type)) 4749 return FALSE; 4750 4751 /* We may also need a plt entry if the symbol turns out to be 4752 an ifunc. */ 4753 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1) 4754 { 4755 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend)) 4756 return FALSE; 4757 } 4758 break; 4759 4760 case R_PPC64_PLT16_HA: 4761 case R_PPC64_PLT16_HI: 4762 case R_PPC64_PLT16_LO: 4763 case R_PPC64_PLT16_LO_DS: 4764 case R_PPC64_PLT_PCREL34: 4765 case R_PPC64_PLT_PCREL34_NOTOC: 4766 case R_PPC64_PLT32: 4767 case R_PPC64_PLT64: 4768 /* This symbol requires a procedure linkage table entry. */ 4769 plt_list = ifunc; 4770 if (h != NULL) 4771 { 4772 h->needs_plt = 1; 4773 if (h->root.root.string[0] == '.' 4774 && h->root.root.string[1] != '\0') 4775 ((struct ppc_link_hash_entry *) h)->is_func = 1; 4776 ((struct ppc_link_hash_entry *) h)->tls_mask |= PLT_KEEP; 4777 plt_list = &h->plt.plist; 4778 } 4779 if (plt_list == NULL) 4780 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx, 4781 rel->r_addend, 4782 NON_GOT | PLT_KEEP); 4783 if (!update_plt_info (abfd, plt_list, rel->r_addend)) 4784 return FALSE; 4785 break; 4786 4787 /* The following relocations don't need to propagate the 4788 relocation if linking a shared object since they are 4789 section relative. */ 4790 case R_PPC64_SECTOFF: 4791 case R_PPC64_SECTOFF_LO: 4792 case R_PPC64_SECTOFF_HI: 4793 case R_PPC64_SECTOFF_HA: 4794 case R_PPC64_SECTOFF_DS: 4795 case R_PPC64_SECTOFF_LO_DS: 4796 case R_PPC64_DTPREL16: 4797 case R_PPC64_DTPREL16_LO: 4798 case R_PPC64_DTPREL16_HI: 4799 case R_PPC64_DTPREL16_HA: 4800 case R_PPC64_DTPREL16_DS: 4801 case R_PPC64_DTPREL16_LO_DS: 4802 case R_PPC64_DTPREL16_HIGH: 4803 case R_PPC64_DTPREL16_HIGHA: 4804 case R_PPC64_DTPREL16_HIGHER: 4805 case R_PPC64_DTPREL16_HIGHERA: 4806 case R_PPC64_DTPREL16_HIGHEST: 4807 case R_PPC64_DTPREL16_HIGHESTA: 4808 break; 4809 4810 /* Nor do these. */ 4811 case R_PPC64_REL16: 4812 case R_PPC64_REL16_LO: 4813 case R_PPC64_REL16_HI: 4814 case R_PPC64_REL16_HA: 4815 case R_PPC64_REL16_HIGH: 4816 case R_PPC64_REL16_HIGHA: 4817 case R_PPC64_REL16_HIGHER: 4818 case R_PPC64_REL16_HIGHERA: 4819 case R_PPC64_REL16_HIGHEST: 4820 case R_PPC64_REL16_HIGHESTA: 4821 case R_PPC64_REL16_HIGHER34: 4822 case R_PPC64_REL16_HIGHERA34: 4823 case R_PPC64_REL16_HIGHEST34: 4824 case R_PPC64_REL16_HIGHESTA34: 4825 case R_PPC64_REL16DX_HA: 4826 break; 4827 4828 /* Not supported as a dynamic relocation. */ 4829 case R_PPC64_ADDR64_LOCAL: 4830 if (bfd_link_pic (info)) 4831 { 4832 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 4833 ppc_howto_init (); 4834 /* xgettext:c-format */ 4835 info->callbacks->einfo (_("%H: %s reloc unsupported " 4836 "in shared libraries and PIEs\n"), 4837 abfd, sec, rel->r_offset, 4838 ppc64_elf_howto_table[r_type]->name); 4839 bfd_set_error (bfd_error_bad_value); 4840 return FALSE; 4841 } 4842 break; 4843 4844 case R_PPC64_TOC16: 4845 case R_PPC64_TOC16_DS: 4846 htab->do_multi_toc = 1; 4847 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1; 4848 /* Fall through. */ 4849 case R_PPC64_TOC16_LO: 4850 case R_PPC64_TOC16_HI: 4851 case R_PPC64_TOC16_HA: 4852 case R_PPC64_TOC16_LO_DS: 4853 sec->has_toc_reloc = 1; 4854 if (h != NULL && bfd_link_executable (info)) 4855 { 4856 /* We may need a copy reloc. */ 4857 h->non_got_ref = 1; 4858 /* Strongly prefer a copy reloc over a dynamic reloc. 4859 glibc ld.so as of 2019-08 will error out if one of 4860 these relocations is emitted. */ 4861 h->needs_copy = 1; 4862 goto dodyn; 4863 } 4864 break; 4865 4866 /* Marker reloc. */ 4867 case R_PPC64_ENTRY: 4868 break; 4869 4870 /* This relocation describes the C++ object vtable hierarchy. 4871 Reconstruct it for later use during GC. */ 4872 case R_PPC64_GNU_VTINHERIT: 4873 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 4874 return FALSE; 4875 break; 4876 4877 /* This relocation describes which C++ vtable entries are actually 4878 used. Record for later use during GC. */ 4879 case R_PPC64_GNU_VTENTRY: 4880 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 4881 return FALSE; 4882 break; 4883 4884 case R_PPC64_REL14: 4885 case R_PPC64_REL14_BRTAKEN: 4886 case R_PPC64_REL14_BRNTAKEN: 4887 { 4888 asection *dest = NULL; 4889 4890 /* Heuristic: If jumping outside our section, chances are 4891 we are going to need a stub. */ 4892 if (h != NULL) 4893 { 4894 /* If the sym is weak it may be overridden later, so 4895 don't assume we know where a weak sym lives. */ 4896 if (h->root.type == bfd_link_hash_defined) 4897 dest = h->root.u.def.section; 4898 } 4899 else 4900 { 4901 Elf_Internal_Sym *isym; 4902 4903 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 4904 abfd, r_symndx); 4905 if (isym == NULL) 4906 return FALSE; 4907 4908 dest = bfd_section_from_elf_index (abfd, isym->st_shndx); 4909 } 4910 4911 if (dest != sec) 4912 ppc64_elf_section_data (sec)->has_14bit_branch = 1; 4913 } 4914 goto rel24; 4915 4916 case R_PPC64_PLTCALL: 4917 case R_PPC64_PLTCALL_NOTOC: 4918 ppc64_elf_section_data (sec)->has_pltcall = 1; 4919 /* Fall through. */ 4920 4921 case R_PPC64_REL24: 4922 case R_PPC64_REL24_NOTOC: 4923 rel24: 4924 plt_list = ifunc; 4925 if (h != NULL) 4926 { 4927 h->needs_plt = 1; 4928 if (h->root.root.string[0] == '.' 4929 && h->root.root.string[1] != '\0') 4930 ((struct ppc_link_hash_entry *) h)->is_func = 1; 4931 4932 if (h == tga || h == dottga) 4933 { 4934 sec->has_tls_reloc = 1; 4935 if (rel != relocs 4936 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD 4937 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD)) 4938 /* We have a new-style __tls_get_addr call with 4939 a marker reloc. */ 4940 ; 4941 else 4942 /* Mark this section as having an old-style call. */ 4943 sec->nomark_tls_get_addr = 1; 4944 } 4945 plt_list = &h->plt.plist; 4946 } 4947 4948 /* We may need a .plt entry if the function this reloc 4949 refers to is in a shared lib. */ 4950 if (plt_list 4951 && !update_plt_info (abfd, plt_list, rel->r_addend)) 4952 return FALSE; 4953 break; 4954 4955 case R_PPC64_ADDR14: 4956 case R_PPC64_ADDR14_BRNTAKEN: 4957 case R_PPC64_ADDR14_BRTAKEN: 4958 case R_PPC64_ADDR24: 4959 goto dodyn; 4960 4961 case R_PPC64_TPREL64: 4962 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL; 4963 if (bfd_link_dll (info)) 4964 info->flags |= DF_STATIC_TLS; 4965 goto dotlstoc; 4966 4967 case R_PPC64_DTPMOD64: 4968 if (rel + 1 < rel_end 4969 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64) 4970 && rel[1].r_offset == rel->r_offset + 8) 4971 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD; 4972 else 4973 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD; 4974 goto dotlstoc; 4975 4976 case R_PPC64_DTPREL64: 4977 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL; 4978 if (rel != relocs 4979 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64) 4980 && rel[-1].r_offset == rel->r_offset - 8) 4981 /* This is the second reloc of a dtpmod, dtprel pair. 4982 Don't mark with TLS_DTPREL. */ 4983 goto dodyn; 4984 4985 dotlstoc: 4986 sec->has_tls_reloc = 1; 4987 if (h != NULL) 4988 { 4989 struct ppc_link_hash_entry *eh; 4990 eh = (struct ppc_link_hash_entry *) h; 4991 eh->tls_mask |= tls_type & 0xff; 4992 } 4993 else 4994 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, 4995 rel->r_addend, tls_type)) 4996 return FALSE; 4997 4998 ppc64_sec = ppc64_elf_section_data (sec); 4999 if (ppc64_sec->sec_type != sec_toc) 5000 { 5001 bfd_size_type amt; 5002 5003 /* One extra to simplify get_tls_mask. */ 5004 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned); 5005 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt); 5006 if (ppc64_sec->u.toc.symndx == NULL) 5007 return FALSE; 5008 amt = sec->size * sizeof (bfd_vma) / 8; 5009 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt); 5010 if (ppc64_sec->u.toc.add == NULL) 5011 return FALSE; 5012 BFD_ASSERT (ppc64_sec->sec_type == sec_normal); 5013 ppc64_sec->sec_type = sec_toc; 5014 } 5015 BFD_ASSERT (rel->r_offset % 8 == 0); 5016 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx; 5017 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend; 5018 5019 /* Mark the second slot of a GD or LD entry. 5020 -1 to indicate GD and -2 to indicate LD. */ 5021 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD)) 5022 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1; 5023 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD)) 5024 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2; 5025 goto dodyn; 5026 5027 case R_PPC64_TPREL16: 5028 case R_PPC64_TPREL16_LO: 5029 case R_PPC64_TPREL16_HI: 5030 case R_PPC64_TPREL16_HA: 5031 case R_PPC64_TPREL16_DS: 5032 case R_PPC64_TPREL16_LO_DS: 5033 case R_PPC64_TPREL16_HIGH: 5034 case R_PPC64_TPREL16_HIGHA: 5035 case R_PPC64_TPREL16_HIGHER: 5036 case R_PPC64_TPREL16_HIGHERA: 5037 case R_PPC64_TPREL16_HIGHEST: 5038 case R_PPC64_TPREL16_HIGHESTA: 5039 case R_PPC64_TPREL34: 5040 if (bfd_link_dll (info)) 5041 info->flags |= DF_STATIC_TLS; 5042 goto dodyn; 5043 5044 case R_PPC64_ADDR64: 5045 if (is_opd 5046 && rel + 1 < rel_end 5047 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC) 5048 { 5049 if (h != NULL) 5050 ((struct ppc_link_hash_entry *) h)->is_func = 1; 5051 } 5052 /* Fall through. */ 5053 5054 case R_PPC64_ADDR16: 5055 case R_PPC64_ADDR16_DS: 5056 case R_PPC64_ADDR16_HA: 5057 case R_PPC64_ADDR16_HI: 5058 case R_PPC64_ADDR16_HIGH: 5059 case R_PPC64_ADDR16_HIGHA: 5060 case R_PPC64_ADDR16_HIGHER: 5061 case R_PPC64_ADDR16_HIGHERA: 5062 case R_PPC64_ADDR16_HIGHEST: 5063 case R_PPC64_ADDR16_HIGHESTA: 5064 case R_PPC64_ADDR16_LO: 5065 case R_PPC64_ADDR16_LO_DS: 5066 case R_PPC64_D34: 5067 case R_PPC64_D34_LO: 5068 case R_PPC64_D34_HI30: 5069 case R_PPC64_D34_HA30: 5070 case R_PPC64_ADDR16_HIGHER34: 5071 case R_PPC64_ADDR16_HIGHERA34: 5072 case R_PPC64_ADDR16_HIGHEST34: 5073 case R_PPC64_ADDR16_HIGHESTA34: 5074 case R_PPC64_D28: 5075 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1 5076 && rel->r_addend == 0) 5077 { 5078 /* We may need a .plt entry if this reloc refers to a 5079 function in a shared lib. */ 5080 if (!update_plt_info (abfd, &h->plt.plist, 0)) 5081 return FALSE; 5082 h->pointer_equality_needed = 1; 5083 } 5084 /* Fall through. */ 5085 5086 case R_PPC64_REL30: 5087 case R_PPC64_REL32: 5088 case R_PPC64_REL64: 5089 case R_PPC64_ADDR32: 5090 case R_PPC64_UADDR16: 5091 case R_PPC64_UADDR32: 5092 case R_PPC64_UADDR64: 5093 case R_PPC64_TOC: 5094 if (h != NULL && bfd_link_executable (info)) 5095 /* We may need a copy reloc. */ 5096 h->non_got_ref = 1; 5097 5098 /* Don't propagate .opd relocs. */ 5099 if (NO_OPD_RELOCS && is_opd) 5100 break; 5101 5102 /* If we are creating a shared library, and this is a reloc 5103 against a global symbol, or a non PC relative reloc 5104 against a local symbol, then we need to copy the reloc 5105 into the shared library. However, if we are linking with 5106 -Bsymbolic, we do not need to copy a reloc against a 5107 global symbol which is defined in an object we are 5108 including in the link (i.e., DEF_REGULAR is set). At 5109 this point we have not seen all the input files, so it is 5110 possible that DEF_REGULAR is not set now but will be set 5111 later (it is never cleared). In case of a weak definition, 5112 DEF_REGULAR may be cleared later by a strong definition in 5113 a shared library. We account for that possibility below by 5114 storing information in the dyn_relocs field of the hash 5115 table entry. A similar situation occurs when creating 5116 shared libraries and symbol visibility changes render the 5117 symbol local. 5118 5119 If on the other hand, we are creating an executable, we 5120 may need to keep relocations for symbols satisfied by a 5121 dynamic library if we manage to avoid copy relocs for the 5122 symbol. */ 5123 dodyn: 5124 if ((h != NULL 5125 && (h->root.type == bfd_link_hash_defweak 5126 || !h->def_regular)) 5127 || (h != NULL 5128 && !bfd_link_executable (info) 5129 && !SYMBOLIC_BIND (info, h)) 5130 || (bfd_link_pic (info) 5131 && must_be_dyn_reloc (info, r_type)) 5132 || (!bfd_link_pic (info) 5133 && ifunc != NULL)) 5134 { 5135 /* We must copy these reloc types into the output file. 5136 Create a reloc section in dynobj and make room for 5137 this reloc. */ 5138 if (sreloc == NULL) 5139 { 5140 sreloc = _bfd_elf_make_dynamic_reloc_section 5141 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE); 5142 5143 if (sreloc == NULL) 5144 return FALSE; 5145 } 5146 5147 /* If this is a global symbol, we count the number of 5148 relocations we need for this symbol. */ 5149 if (h != NULL) 5150 { 5151 struct elf_dyn_relocs *p; 5152 struct elf_dyn_relocs **head; 5153 5154 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs; 5155 p = *head; 5156 if (p == NULL || p->sec != sec) 5157 { 5158 p = bfd_alloc (htab->elf.dynobj, sizeof *p); 5159 if (p == NULL) 5160 return FALSE; 5161 p->next = *head; 5162 *head = p; 5163 p->sec = sec; 5164 p->count = 0; 5165 p->pc_count = 0; 5166 } 5167 p->count += 1; 5168 if (!must_be_dyn_reloc (info, r_type)) 5169 p->pc_count += 1; 5170 } 5171 else 5172 { 5173 /* Track dynamic relocs needed for local syms too. 5174 We really need local syms available to do this 5175 easily. Oh well. */ 5176 struct ppc_dyn_relocs *p; 5177 struct ppc_dyn_relocs **head; 5178 bfd_boolean is_ifunc; 5179 asection *s; 5180 void *vpp; 5181 Elf_Internal_Sym *isym; 5182 5183 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 5184 abfd, r_symndx); 5185 if (isym == NULL) 5186 return FALSE; 5187 5188 s = bfd_section_from_elf_index (abfd, isym->st_shndx); 5189 if (s == NULL) 5190 s = sec; 5191 5192 vpp = &elf_section_data (s)->local_dynrel; 5193 head = (struct ppc_dyn_relocs **) vpp; 5194 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC; 5195 p = *head; 5196 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc) 5197 p = p->next; 5198 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc) 5199 { 5200 p = bfd_alloc (htab->elf.dynobj, sizeof *p); 5201 if (p == NULL) 5202 return FALSE; 5203 p->next = *head; 5204 *head = p; 5205 p->sec = sec; 5206 p->ifunc = is_ifunc; 5207 p->count = 0; 5208 } 5209 p->count += 1; 5210 } 5211 } 5212 break; 5213 5214 default: 5215 break; 5216 } 5217 } 5218 5219 return TRUE; 5220 } 5221 5222 /* Merge backend specific data from an object file to the output 5223 object file when linking. */ 5224 5225 static bfd_boolean 5226 ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) 5227 { 5228 bfd *obfd = info->output_bfd; 5229 unsigned long iflags, oflags; 5230 5231 if ((ibfd->flags & BFD_LINKER_CREATED) != 0) 5232 return TRUE; 5233 5234 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd)) 5235 return TRUE; 5236 5237 if (!_bfd_generic_verify_endian_match (ibfd, info)) 5238 return FALSE; 5239 5240 iflags = elf_elfheader (ibfd)->e_flags; 5241 oflags = elf_elfheader (obfd)->e_flags; 5242 5243 if (iflags & ~EF_PPC64_ABI) 5244 { 5245 _bfd_error_handler 5246 /* xgettext:c-format */ 5247 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags); 5248 bfd_set_error (bfd_error_bad_value); 5249 return FALSE; 5250 } 5251 else if (iflags != oflags && iflags != 0) 5252 { 5253 _bfd_error_handler 5254 /* xgettext:c-format */ 5255 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"), 5256 ibfd, iflags, oflags); 5257 bfd_set_error (bfd_error_bad_value); 5258 return FALSE; 5259 } 5260 5261 if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info)) 5262 return FALSE; 5263 5264 /* Merge Tag_compatibility attributes and any common GNU ones. */ 5265 return _bfd_elf_merge_object_attributes (ibfd, info); 5266 } 5267 5268 static bfd_boolean 5269 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr) 5270 { 5271 /* Print normal ELF private data. */ 5272 _bfd_elf_print_private_bfd_data (abfd, ptr); 5273 5274 if (elf_elfheader (abfd)->e_flags != 0) 5275 { 5276 FILE *file = ptr; 5277 5278 fprintf (file, _("private flags = 0x%lx:"), 5279 elf_elfheader (abfd)->e_flags); 5280 5281 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0) 5282 fprintf (file, _(" [abiv%ld]"), 5283 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI); 5284 fputc ('\n', file); 5285 } 5286 5287 return TRUE; 5288 } 5289 5290 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address 5291 of the code entry point, and its section, which must be in the same 5292 object as OPD_SEC. Returns (bfd_vma) -1 on error. */ 5293 5294 static bfd_vma 5295 opd_entry_value (asection *opd_sec, 5296 bfd_vma offset, 5297 asection **code_sec, 5298 bfd_vma *code_off, 5299 bfd_boolean in_code_sec) 5300 { 5301 bfd *opd_bfd = opd_sec->owner; 5302 Elf_Internal_Rela *relocs; 5303 Elf_Internal_Rela *lo, *hi, *look; 5304 bfd_vma val; 5305 5306 /* No relocs implies we are linking a --just-symbols object, or looking 5307 at a final linked executable with addr2line or somesuch. */ 5308 if (opd_sec->reloc_count == 0) 5309 { 5310 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents; 5311 5312 if (contents == NULL) 5313 { 5314 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents)) 5315 return (bfd_vma) -1; 5316 ppc64_elf_tdata (opd_bfd)->opd.contents = contents; 5317 } 5318 5319 /* PR 17512: file: 64b9dfbb. */ 5320 if (offset + 7 >= opd_sec->size || offset + 7 < offset) 5321 return (bfd_vma) -1; 5322 5323 val = bfd_get_64 (opd_bfd, contents + offset); 5324 if (code_sec != NULL) 5325 { 5326 asection *sec, *likely = NULL; 5327 5328 if (in_code_sec) 5329 { 5330 sec = *code_sec; 5331 if (sec->vma <= val 5332 && val < sec->vma + sec->size) 5333 likely = sec; 5334 else 5335 val = -1; 5336 } 5337 else 5338 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next) 5339 if (sec->vma <= val 5340 && (sec->flags & SEC_LOAD) != 0 5341 && (sec->flags & SEC_ALLOC) != 0) 5342 likely = sec; 5343 if (likely != NULL) 5344 { 5345 *code_sec = likely; 5346 if (code_off != NULL) 5347 *code_off = val - likely->vma; 5348 } 5349 } 5350 return val; 5351 } 5352 5353 BFD_ASSERT (is_ppc64_elf (opd_bfd)); 5354 5355 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs; 5356 if (relocs == NULL) 5357 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE); 5358 /* PR 17512: file: df8e1fd6. */ 5359 if (relocs == NULL) 5360 return (bfd_vma) -1; 5361 5362 /* Go find the opd reloc at the sym address. */ 5363 lo = relocs; 5364 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */ 5365 val = (bfd_vma) -1; 5366 while (lo < hi) 5367 { 5368 look = lo + (hi - lo) / 2; 5369 if (look->r_offset < offset) 5370 lo = look + 1; 5371 else if (look->r_offset > offset) 5372 hi = look; 5373 else 5374 { 5375 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd); 5376 5377 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64 5378 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC) 5379 { 5380 unsigned long symndx = ELF64_R_SYM (look->r_info); 5381 asection *sec = NULL; 5382 5383 if (symndx >= symtab_hdr->sh_info 5384 && elf_sym_hashes (opd_bfd) != NULL) 5385 { 5386 struct elf_link_hash_entry **sym_hashes; 5387 struct elf_link_hash_entry *rh; 5388 5389 sym_hashes = elf_sym_hashes (opd_bfd); 5390 rh = sym_hashes[symndx - symtab_hdr->sh_info]; 5391 if (rh != NULL) 5392 { 5393 rh = elf_follow_link (rh); 5394 if (rh->root.type != bfd_link_hash_defined 5395 && rh->root.type != bfd_link_hash_defweak) 5396 break; 5397 if (rh->root.u.def.section->owner == opd_bfd) 5398 { 5399 val = rh->root.u.def.value; 5400 sec = rh->root.u.def.section; 5401 } 5402 } 5403 } 5404 5405 if (sec == NULL) 5406 { 5407 Elf_Internal_Sym *sym; 5408 5409 if (symndx < symtab_hdr->sh_info) 5410 { 5411 sym = (Elf_Internal_Sym *) symtab_hdr->contents; 5412 if (sym == NULL) 5413 { 5414 size_t symcnt = symtab_hdr->sh_info; 5415 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, 5416 symcnt, 0, 5417 NULL, NULL, NULL); 5418 if (sym == NULL) 5419 break; 5420 symtab_hdr->contents = (bfd_byte *) sym; 5421 } 5422 sym += symndx; 5423 } 5424 else 5425 { 5426 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, 5427 1, symndx, 5428 NULL, NULL, NULL); 5429 if (sym == NULL) 5430 break; 5431 } 5432 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx); 5433 if (sec == NULL) 5434 break; 5435 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0); 5436 val = sym->st_value; 5437 } 5438 5439 val += look->r_addend; 5440 if (code_off != NULL) 5441 *code_off = val; 5442 if (code_sec != NULL) 5443 { 5444 if (in_code_sec && *code_sec != sec) 5445 return -1; 5446 else 5447 *code_sec = sec; 5448 } 5449 if (sec->output_section != NULL) 5450 val += sec->output_section->vma + sec->output_offset; 5451 } 5452 break; 5453 } 5454 } 5455 5456 return val; 5457 } 5458 5459 /* If the ELF symbol SYM might be a function in SEC, return the 5460 function size and set *CODE_OFF to the function's entry point, 5461 otherwise return zero. */ 5462 5463 static bfd_size_type 5464 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec, 5465 bfd_vma *code_off) 5466 { 5467 bfd_size_type size; 5468 5469 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT 5470 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0) 5471 return 0; 5472 5473 size = 0; 5474 if (!(sym->flags & BSF_SYNTHETIC)) 5475 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; 5476 5477 if (strcmp (sym->section->name, ".opd") == 0) 5478 { 5479 struct _opd_sec_data *opd = get_opd_info (sym->section); 5480 bfd_vma symval = sym->value; 5481 5482 if (opd != NULL 5483 && opd->adjust != NULL 5484 && elf_section_data (sym->section)->relocs != NULL) 5485 { 5486 /* opd_entry_value will use cached relocs that have been 5487 adjusted, but with raw symbols. That means both local 5488 and global symbols need adjusting. */ 5489 long adjust = opd->adjust[OPD_NDX (symval)]; 5490 if (adjust == -1) 5491 return 0; 5492 symval += adjust; 5493 } 5494 5495 if (opd_entry_value (sym->section, symval, 5496 &sec, code_off, TRUE) == (bfd_vma) -1) 5497 return 0; 5498 /* An old ABI binary with dot-syms has a size of 24 on the .opd 5499 symbol. This size has nothing to do with the code size of the 5500 function, which is what we're supposed to return, but the 5501 code size isn't available without looking up the dot-sym. 5502 However, doing that would be a waste of time particularly 5503 since elf_find_function will look at the dot-sym anyway. 5504 Now, elf_find_function will keep the largest size of any 5505 function sym found at the code address of interest, so return 5506 1 here to avoid it incorrectly caching a larger function size 5507 for a small function. This does mean we return the wrong 5508 size for a new-ABI function of size 24, but all that does is 5509 disable caching for such functions. */ 5510 if (size == 24) 5511 size = 1; 5512 } 5513 else 5514 { 5515 if (sym->section != sec) 5516 return 0; 5517 *code_off = sym->value; 5518 } 5519 if (size == 0) 5520 size = 1; 5521 return size; 5522 } 5523 5524 /* Return true if symbol is a strong function defined in an ELFv2 5525 object with st_other localentry bits of zero, ie. its local entry 5526 point coincides with its global entry point. */ 5527 5528 static bfd_boolean 5529 is_elfv2_localentry0 (struct elf_link_hash_entry *h) 5530 { 5531 return (h != NULL 5532 && h->type == STT_FUNC 5533 && h->root.type == bfd_link_hash_defined 5534 && (STO_PPC64_LOCAL_MASK & h->other) == 0 5535 && !((struct ppc_link_hash_entry *) h)->non_zero_localentry 5536 && is_ppc64_elf (h->root.u.def.section->owner) 5537 && abiversion (h->root.u.def.section->owner) >= 2); 5538 } 5539 5540 /* Return true if symbol is defined in a regular object file. */ 5541 5542 static bfd_boolean 5543 is_static_defined (struct elf_link_hash_entry *h) 5544 { 5545 return ((h->root.type == bfd_link_hash_defined 5546 || h->root.type == bfd_link_hash_defweak) 5547 && h->root.u.def.section != NULL 5548 && h->root.u.def.section->output_section != NULL); 5549 } 5550 5551 /* If FDH is a function descriptor symbol, return the associated code 5552 entry symbol if it is defined. Return NULL otherwise. */ 5553 5554 static struct ppc_link_hash_entry * 5555 defined_code_entry (struct ppc_link_hash_entry *fdh) 5556 { 5557 if (fdh->is_func_descriptor) 5558 { 5559 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh); 5560 if (fh->elf.root.type == bfd_link_hash_defined 5561 || fh->elf.root.type == bfd_link_hash_defweak) 5562 return fh; 5563 } 5564 return NULL; 5565 } 5566 5567 /* If FH is a function code entry symbol, return the associated 5568 function descriptor symbol if it is defined. Return NULL otherwise. */ 5569 5570 static struct ppc_link_hash_entry * 5571 defined_func_desc (struct ppc_link_hash_entry *fh) 5572 { 5573 if (fh->oh != NULL 5574 && fh->oh->is_func_descriptor) 5575 { 5576 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh); 5577 if (fdh->elf.root.type == bfd_link_hash_defined 5578 || fdh->elf.root.type == bfd_link_hash_defweak) 5579 return fdh; 5580 } 5581 return NULL; 5582 } 5583 5584 static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *); 5585 5586 /* Garbage collect sections, after first dealing with dot-symbols. */ 5587 5588 static bfd_boolean 5589 ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) 5590 { 5591 struct ppc_link_hash_table *htab = ppc_hash_table (info); 5592 5593 if (htab != NULL && htab->need_func_desc_adj) 5594 { 5595 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info); 5596 htab->need_func_desc_adj = 0; 5597 } 5598 return bfd_elf_gc_sections (abfd, info); 5599 } 5600 5601 /* Mark all our entry sym sections, both opd and code section. */ 5602 5603 static void 5604 ppc64_elf_gc_keep (struct bfd_link_info *info) 5605 { 5606 struct ppc_link_hash_table *htab = ppc_hash_table (info); 5607 struct bfd_sym_chain *sym; 5608 5609 if (htab == NULL) 5610 return; 5611 5612 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next) 5613 { 5614 struct ppc_link_hash_entry *eh, *fh; 5615 asection *sec; 5616 5617 eh = (struct ppc_link_hash_entry *) 5618 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE); 5619 if (eh == NULL) 5620 continue; 5621 if (eh->elf.root.type != bfd_link_hash_defined 5622 && eh->elf.root.type != bfd_link_hash_defweak) 5623 continue; 5624 5625 fh = defined_code_entry (eh); 5626 if (fh != NULL) 5627 { 5628 sec = fh->elf.root.u.def.section; 5629 sec->flags |= SEC_KEEP; 5630 } 5631 else if (get_opd_info (eh->elf.root.u.def.section) != NULL 5632 && opd_entry_value (eh->elf.root.u.def.section, 5633 eh->elf.root.u.def.value, 5634 &sec, NULL, FALSE) != (bfd_vma) -1) 5635 sec->flags |= SEC_KEEP; 5636 5637 sec = eh->elf.root.u.def.section; 5638 sec->flags |= SEC_KEEP; 5639 } 5640 } 5641 5642 /* Mark sections containing dynamically referenced symbols. When 5643 building shared libraries, we must assume that any visible symbol is 5644 referenced. */ 5645 5646 static bfd_boolean 5647 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf) 5648 { 5649 struct bfd_link_info *info = (struct bfd_link_info *) inf; 5650 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h; 5651 struct ppc_link_hash_entry *fdh; 5652 struct bfd_elf_dynamic_list *d = info->dynamic_list; 5653 5654 /* Dynamic linking info is on the func descriptor sym. */ 5655 fdh = defined_func_desc (eh); 5656 if (fdh != NULL) 5657 eh = fdh; 5658 5659 if ((eh->elf.root.type == bfd_link_hash_defined 5660 || eh->elf.root.type == bfd_link_hash_defweak) 5661 && ((eh->elf.ref_dynamic && !eh->elf.forced_local) 5662 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf)) 5663 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL 5664 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN 5665 && (!bfd_link_executable (info) 5666 || info->gc_keep_exported 5667 || info->export_dynamic 5668 || (eh->elf.dynamic 5669 && d != NULL 5670 && (*d->match) (&d->head, NULL, 5671 eh->elf.root.root.string))) 5672 && (eh->elf.versioned >= versioned 5673 || !bfd_hide_sym_by_version (info->version_info, 5674 eh->elf.root.root.string))))) 5675 { 5676 asection *code_sec; 5677 struct ppc_link_hash_entry *fh; 5678 5679 eh->elf.root.u.def.section->flags |= SEC_KEEP; 5680 5681 /* Function descriptor syms cause the associated 5682 function code sym section to be marked. */ 5683 fh = defined_code_entry (eh); 5684 if (fh != NULL) 5685 { 5686 code_sec = fh->elf.root.u.def.section; 5687 code_sec->flags |= SEC_KEEP; 5688 } 5689 else if (get_opd_info (eh->elf.root.u.def.section) != NULL 5690 && opd_entry_value (eh->elf.root.u.def.section, 5691 eh->elf.root.u.def.value, 5692 &code_sec, NULL, FALSE) != (bfd_vma) -1) 5693 code_sec->flags |= SEC_KEEP; 5694 } 5695 5696 return TRUE; 5697 } 5698 5699 /* Return the section that should be marked against GC for a given 5700 relocation. */ 5701 5702 static asection * 5703 ppc64_elf_gc_mark_hook (asection *sec, 5704 struct bfd_link_info *info, 5705 Elf_Internal_Rela *rel, 5706 struct elf_link_hash_entry *h, 5707 Elf_Internal_Sym *sym) 5708 { 5709 asection *rsec; 5710 5711 /* Syms return NULL if we're marking .opd, so we avoid marking all 5712 function sections, as all functions are referenced in .opd. */ 5713 rsec = NULL; 5714 if (get_opd_info (sec) != NULL) 5715 return rsec; 5716 5717 if (h != NULL) 5718 { 5719 enum elf_ppc64_reloc_type r_type; 5720 struct ppc_link_hash_entry *eh, *fh, *fdh; 5721 5722 r_type = ELF64_R_TYPE (rel->r_info); 5723 switch (r_type) 5724 { 5725 case R_PPC64_GNU_VTINHERIT: 5726 case R_PPC64_GNU_VTENTRY: 5727 break; 5728 5729 default: 5730 switch (h->root.type) 5731 { 5732 case bfd_link_hash_defined: 5733 case bfd_link_hash_defweak: 5734 eh = (struct ppc_link_hash_entry *) h; 5735 fdh = defined_func_desc (eh); 5736 if (fdh != NULL) 5737 { 5738 /* -mcall-aixdesc code references the dot-symbol on 5739 a call reloc. Mark the function descriptor too 5740 against garbage collection. */ 5741 fdh->elf.mark = 1; 5742 if (fdh->elf.is_weakalias) 5743 weakdef (&fdh->elf)->mark = 1; 5744 eh = fdh; 5745 } 5746 5747 /* Function descriptor syms cause the associated 5748 function code sym section to be marked. */ 5749 fh = defined_code_entry (eh); 5750 if (fh != NULL) 5751 { 5752 /* They also mark their opd section. */ 5753 eh->elf.root.u.def.section->gc_mark = 1; 5754 5755 rsec = fh->elf.root.u.def.section; 5756 } 5757 else if (get_opd_info (eh->elf.root.u.def.section) != NULL 5758 && opd_entry_value (eh->elf.root.u.def.section, 5759 eh->elf.root.u.def.value, 5760 &rsec, NULL, FALSE) != (bfd_vma) -1) 5761 eh->elf.root.u.def.section->gc_mark = 1; 5762 else 5763 rsec = h->root.u.def.section; 5764 break; 5765 5766 case bfd_link_hash_common: 5767 rsec = h->root.u.c.p->section; 5768 break; 5769 5770 default: 5771 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); 5772 } 5773 } 5774 } 5775 else 5776 { 5777 struct _opd_sec_data *opd; 5778 5779 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx); 5780 opd = get_opd_info (rsec); 5781 if (opd != NULL && opd->func_sec != NULL) 5782 { 5783 rsec->gc_mark = 1; 5784 5785 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)]; 5786 } 5787 } 5788 5789 return rsec; 5790 } 5791 5792 /* The maximum size of .sfpr. */ 5793 #define SFPR_MAX (218*4) 5794 5795 struct sfpr_def_parms 5796 { 5797 const char name[12]; 5798 unsigned char lo, hi; 5799 bfd_byte *(*write_ent) (bfd *, bfd_byte *, int); 5800 bfd_byte *(*write_tail) (bfd *, bfd_byte *, int); 5801 }; 5802 5803 /* Auto-generate _save*, _rest* functions in .sfpr. 5804 If STUB_SEC is non-null, define alias symbols in STUB_SEC 5805 instead. */ 5806 5807 static bfd_boolean 5808 sfpr_define (struct bfd_link_info *info, 5809 const struct sfpr_def_parms *parm, 5810 asection *stub_sec) 5811 { 5812 struct ppc_link_hash_table *htab = ppc_hash_table (info); 5813 unsigned int i; 5814 size_t len = strlen (parm->name); 5815 bfd_boolean writing = FALSE; 5816 char sym[16]; 5817 5818 if (htab == NULL) 5819 return FALSE; 5820 5821 memcpy (sym, parm->name, len); 5822 sym[len + 2] = 0; 5823 5824 for (i = parm->lo; i <= parm->hi; i++) 5825 { 5826 struct ppc_link_hash_entry *h; 5827 5828 sym[len + 0] = i / 10 + '0'; 5829 sym[len + 1] = i % 10 + '0'; 5830 h = (struct ppc_link_hash_entry *) 5831 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE); 5832 if (stub_sec != NULL) 5833 { 5834 if (h != NULL 5835 && h->elf.root.type == bfd_link_hash_defined 5836 && h->elf.root.u.def.section == htab->sfpr) 5837 { 5838 struct elf_link_hash_entry *s; 5839 char buf[32]; 5840 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym); 5841 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE); 5842 if (s == NULL) 5843 return FALSE; 5844 if (s->root.type == bfd_link_hash_new) 5845 { 5846 s->root.type = bfd_link_hash_defined; 5847 s->root.u.def.section = stub_sec; 5848 s->root.u.def.value = (stub_sec->size - htab->sfpr->size 5849 + h->elf.root.u.def.value); 5850 s->ref_regular = 1; 5851 s->def_regular = 1; 5852 s->ref_regular_nonweak = 1; 5853 s->forced_local = 1; 5854 s->non_elf = 0; 5855 s->root.linker_def = 1; 5856 } 5857 } 5858 continue; 5859 } 5860 if (h != NULL) 5861 { 5862 h->save_res = 1; 5863 if (!h->elf.def_regular) 5864 { 5865 h->elf.root.type = bfd_link_hash_defined; 5866 h->elf.root.u.def.section = htab->sfpr; 5867 h->elf.root.u.def.value = htab->sfpr->size; 5868 h->elf.type = STT_FUNC; 5869 h->elf.def_regular = 1; 5870 h->elf.non_elf = 0; 5871 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE); 5872 writing = TRUE; 5873 if (htab->sfpr->contents == NULL) 5874 { 5875 htab->sfpr->contents 5876 = bfd_alloc (htab->elf.dynobj, SFPR_MAX); 5877 if (htab->sfpr->contents == NULL) 5878 return FALSE; 5879 } 5880 } 5881 } 5882 if (writing) 5883 { 5884 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size; 5885 if (i != parm->hi) 5886 p = (*parm->write_ent) (htab->elf.dynobj, p, i); 5887 else 5888 p = (*parm->write_tail) (htab->elf.dynobj, p, i); 5889 htab->sfpr->size = p - htab->sfpr->contents; 5890 } 5891 } 5892 5893 return TRUE; 5894 } 5895 5896 static bfd_byte * 5897 savegpr0 (bfd *abfd, bfd_byte *p, int r) 5898 { 5899 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p); 5900 return p + 4; 5901 } 5902 5903 static bfd_byte * 5904 savegpr0_tail (bfd *abfd, bfd_byte *p, int r) 5905 { 5906 p = savegpr0 (abfd, p, r); 5907 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p); 5908 p = p + 4; 5909 bfd_put_32 (abfd, BLR, p); 5910 return p + 4; 5911 } 5912 5913 static bfd_byte * 5914 restgpr0 (bfd *abfd, bfd_byte *p, int r) 5915 { 5916 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p); 5917 return p + 4; 5918 } 5919 5920 static bfd_byte * 5921 restgpr0_tail (bfd *abfd, bfd_byte *p, int r) 5922 { 5923 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p); 5924 p = p + 4; 5925 p = restgpr0 (abfd, p, r); 5926 bfd_put_32 (abfd, MTLR_R0, p); 5927 p = p + 4; 5928 if (r == 29) 5929 { 5930 p = restgpr0 (abfd, p, 30); 5931 p = restgpr0 (abfd, p, 31); 5932 } 5933 bfd_put_32 (abfd, BLR, p); 5934 return p + 4; 5935 } 5936 5937 static bfd_byte * 5938 savegpr1 (bfd *abfd, bfd_byte *p, int r) 5939 { 5940 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p); 5941 return p + 4; 5942 } 5943 5944 static bfd_byte * 5945 savegpr1_tail (bfd *abfd, bfd_byte *p, int r) 5946 { 5947 p = savegpr1 (abfd, p, r); 5948 bfd_put_32 (abfd, BLR, p); 5949 return p + 4; 5950 } 5951 5952 static bfd_byte * 5953 restgpr1 (bfd *abfd, bfd_byte *p, int r) 5954 { 5955 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p); 5956 return p + 4; 5957 } 5958 5959 static bfd_byte * 5960 restgpr1_tail (bfd *abfd, bfd_byte *p, int r) 5961 { 5962 p = restgpr1 (abfd, p, r); 5963 bfd_put_32 (abfd, BLR, p); 5964 return p + 4; 5965 } 5966 5967 static bfd_byte * 5968 savefpr (bfd *abfd, bfd_byte *p, int r) 5969 { 5970 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p); 5971 return p + 4; 5972 } 5973 5974 static bfd_byte * 5975 savefpr0_tail (bfd *abfd, bfd_byte *p, int r) 5976 { 5977 p = savefpr (abfd, p, r); 5978 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p); 5979 p = p + 4; 5980 bfd_put_32 (abfd, BLR, p); 5981 return p + 4; 5982 } 5983 5984 static bfd_byte * 5985 restfpr (bfd *abfd, bfd_byte *p, int r) 5986 { 5987 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p); 5988 return p + 4; 5989 } 5990 5991 static bfd_byte * 5992 restfpr0_tail (bfd *abfd, bfd_byte *p, int r) 5993 { 5994 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p); 5995 p = p + 4; 5996 p = restfpr (abfd, p, r); 5997 bfd_put_32 (abfd, MTLR_R0, p); 5998 p = p + 4; 5999 if (r == 29) 6000 { 6001 p = restfpr (abfd, p, 30); 6002 p = restfpr (abfd, p, 31); 6003 } 6004 bfd_put_32 (abfd, BLR, p); 6005 return p + 4; 6006 } 6007 6008 static bfd_byte * 6009 savefpr1_tail (bfd *abfd, bfd_byte *p, int r) 6010 { 6011 p = savefpr (abfd, p, r); 6012 bfd_put_32 (abfd, BLR, p); 6013 return p + 4; 6014 } 6015 6016 static bfd_byte * 6017 restfpr1_tail (bfd *abfd, bfd_byte *p, int r) 6018 { 6019 p = restfpr (abfd, p, r); 6020 bfd_put_32 (abfd, BLR, p); 6021 return p + 4; 6022 } 6023 6024 static bfd_byte * 6025 savevr (bfd *abfd, bfd_byte *p, int r) 6026 { 6027 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p); 6028 p = p + 4; 6029 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p); 6030 return p + 4; 6031 } 6032 6033 static bfd_byte * 6034 savevr_tail (bfd *abfd, bfd_byte *p, int r) 6035 { 6036 p = savevr (abfd, p, r); 6037 bfd_put_32 (abfd, BLR, p); 6038 return p + 4; 6039 } 6040 6041 static bfd_byte * 6042 restvr (bfd *abfd, bfd_byte *p, int r) 6043 { 6044 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p); 6045 p = p + 4; 6046 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p); 6047 return p + 4; 6048 } 6049 6050 static bfd_byte * 6051 restvr_tail (bfd *abfd, bfd_byte *p, int r) 6052 { 6053 p = restvr (abfd, p, r); 6054 bfd_put_32 (abfd, BLR, p); 6055 return p + 4; 6056 } 6057 6058 /* Called via elf_link_hash_traverse to transfer dynamic linking 6059 information on function code symbol entries to their corresponding 6060 function descriptor symbol entries. */ 6061 6062 static bfd_boolean 6063 func_desc_adjust (struct elf_link_hash_entry *h, void *inf) 6064 { 6065 struct bfd_link_info *info; 6066 struct ppc_link_hash_table *htab; 6067 struct ppc_link_hash_entry *fh; 6068 struct ppc_link_hash_entry *fdh; 6069 bfd_boolean force_local; 6070 6071 fh = (struct ppc_link_hash_entry *) h; 6072 if (fh->elf.root.type == bfd_link_hash_indirect) 6073 return TRUE; 6074 6075 if (!fh->is_func) 6076 return TRUE; 6077 6078 if (fh->elf.root.root.string[0] != '.' 6079 || fh->elf.root.root.string[1] == '\0') 6080 return TRUE; 6081 6082 info = inf; 6083 htab = ppc_hash_table (info); 6084 if (htab == NULL) 6085 return FALSE; 6086 6087 /* Find the corresponding function descriptor symbol. */ 6088 fdh = lookup_fdh (fh, htab); 6089 6090 /* Resolve undefined references to dot-symbols as the value 6091 in the function descriptor, if we have one in a regular object. 6092 This is to satisfy cases like ".quad .foo". Calls to functions 6093 in dynamic objects are handled elsewhere. */ 6094 if ((fh->elf.root.type == bfd_link_hash_undefined 6095 || fh->elf.root.type == bfd_link_hash_undefweak) 6096 && (fdh->elf.root.type == bfd_link_hash_defined 6097 || fdh->elf.root.type == bfd_link_hash_defweak) 6098 && get_opd_info (fdh->elf.root.u.def.section) != NULL 6099 && opd_entry_value (fdh->elf.root.u.def.section, 6100 fdh->elf.root.u.def.value, 6101 &fh->elf.root.u.def.section, 6102 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1) 6103 { 6104 fh->elf.root.type = fdh->elf.root.type; 6105 fh->elf.forced_local = 1; 6106 fh->elf.def_regular = fdh->elf.def_regular; 6107 fh->elf.def_dynamic = fdh->elf.def_dynamic; 6108 } 6109 6110 if (!fh->elf.dynamic) 6111 { 6112 struct plt_entry *ent; 6113 6114 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next) 6115 if (ent->plt.refcount > 0) 6116 break; 6117 if (ent == NULL) 6118 return TRUE; 6119 } 6120 6121 /* Create a descriptor as undefined if necessary. */ 6122 if (fdh == NULL 6123 && !bfd_link_executable (info) 6124 && (fh->elf.root.type == bfd_link_hash_undefined 6125 || fh->elf.root.type == bfd_link_hash_undefweak)) 6126 { 6127 fdh = make_fdh (info, fh); 6128 if (fdh == NULL) 6129 return FALSE; 6130 } 6131 6132 /* We can't support overriding of symbols on a fake descriptor. */ 6133 if (fdh != NULL 6134 && fdh->fake 6135 && (fh->elf.root.type == bfd_link_hash_defined 6136 || fh->elf.root.type == bfd_link_hash_defweak)) 6137 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE); 6138 6139 /* Transfer dynamic linking information to the function descriptor. */ 6140 if (fdh != NULL) 6141 { 6142 fdh->elf.ref_regular |= fh->elf.ref_regular; 6143 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic; 6144 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak; 6145 fdh->elf.non_got_ref |= fh->elf.non_got_ref; 6146 fdh->elf.dynamic |= fh->elf.dynamic; 6147 fdh->elf.needs_plt |= (fh->elf.needs_plt 6148 || fh->elf.type == STT_FUNC 6149 || fh->elf.type == STT_GNU_IFUNC); 6150 move_plt_plist (fh, fdh); 6151 6152 if (!fdh->elf.forced_local 6153 && fh->elf.dynindx != -1) 6154 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf)) 6155 return FALSE; 6156 } 6157 6158 /* Now that the info is on the function descriptor, clear the 6159 function code sym info. Any function code syms for which we 6160 don't have a definition in a regular file, we force local. 6161 This prevents a shared library from exporting syms that have 6162 been imported from another library. Function code syms that 6163 are really in the library we must leave global to prevent the 6164 linker dragging in a definition from a static library. */ 6165 force_local = (!fh->elf.def_regular 6166 || fdh == NULL 6167 || !fdh->elf.def_regular 6168 || fdh->elf.forced_local); 6169 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local); 6170 6171 return TRUE; 6172 } 6173 6174 static const struct sfpr_def_parms save_res_funcs[] = 6175 { 6176 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail }, 6177 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail }, 6178 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail }, 6179 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail }, 6180 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail }, 6181 { "_savefpr_", 14, 31, savefpr, savefpr0_tail }, 6182 { "_restfpr_", 14, 29, restfpr, restfpr0_tail }, 6183 { "_restfpr_", 30, 31, restfpr, restfpr0_tail }, 6184 { "._savef", 14, 31, savefpr, savefpr1_tail }, 6185 { "._restf", 14, 31, restfpr, restfpr1_tail }, 6186 { "_savevr_", 20, 31, savevr, savevr_tail }, 6187 { "_restvr_", 20, 31, restvr, restvr_tail } 6188 }; 6189 6190 /* Called near the start of bfd_elf_size_dynamic_sections. We use 6191 this hook to a) provide some gcc support functions, and b) transfer 6192 dynamic linking information gathered so far on function code symbol 6193 entries, to their corresponding function descriptor symbol entries. */ 6194 6195 static bfd_boolean 6196 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED, 6197 struct bfd_link_info *info) 6198 { 6199 struct ppc_link_hash_table *htab; 6200 6201 htab = ppc_hash_table (info); 6202 if (htab == NULL) 6203 return FALSE; 6204 6205 /* Provide any missing _save* and _rest* functions. */ 6206 if (htab->sfpr != NULL) 6207 { 6208 unsigned int i; 6209 6210 htab->sfpr->size = 0; 6211 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++) 6212 if (!sfpr_define (info, &save_res_funcs[i], NULL)) 6213 return FALSE; 6214 if (htab->sfpr->size == 0) 6215 htab->sfpr->flags |= SEC_EXCLUDE; 6216 } 6217 6218 if (bfd_link_relocatable (info)) 6219 return TRUE; 6220 6221 if (htab->elf.hgot != NULL) 6222 { 6223 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE); 6224 /* Make .TOC. defined so as to prevent it being made dynamic. 6225 The wrong value here is fixed later in ppc64_elf_set_toc. */ 6226 if (!htab->elf.hgot->def_regular 6227 || htab->elf.hgot->root.type != bfd_link_hash_defined) 6228 { 6229 htab->elf.hgot->root.type = bfd_link_hash_defined; 6230 htab->elf.hgot->root.u.def.value = 0; 6231 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr; 6232 htab->elf.hgot->def_regular = 1; 6233 htab->elf.hgot->root.linker_def = 1; 6234 } 6235 htab->elf.hgot->type = STT_OBJECT; 6236 htab->elf.hgot->other 6237 = (htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN; 6238 } 6239 6240 if (htab->need_func_desc_adj) 6241 { 6242 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info); 6243 htab->need_func_desc_adj = 0; 6244 } 6245 6246 return TRUE; 6247 } 6248 6249 /* Find dynamic relocs for H that apply to read-only sections. */ 6250 6251 static asection * 6252 readonly_dynrelocs (struct elf_link_hash_entry *h) 6253 { 6254 struct ppc_link_hash_entry *eh; 6255 struct elf_dyn_relocs *p; 6256 6257 eh = (struct ppc_link_hash_entry *) h; 6258 for (p = eh->dyn_relocs; p != NULL; p = p->next) 6259 { 6260 asection *s = p->sec->output_section; 6261 6262 if (s != NULL && (s->flags & SEC_READONLY) != 0) 6263 return p->sec; 6264 } 6265 return NULL; 6266 } 6267 6268 /* Return true if we have dynamic relocs against H or any of its weak 6269 aliases, that apply to read-only sections. Cannot be used after 6270 size_dynamic_sections. */ 6271 6272 static bfd_boolean 6273 alias_readonly_dynrelocs (struct elf_link_hash_entry *h) 6274 { 6275 struct ppc_link_hash_entry *eh; 6276 6277 eh = (struct ppc_link_hash_entry *) h; 6278 do 6279 { 6280 if (readonly_dynrelocs (&eh->elf)) 6281 return TRUE; 6282 eh = (struct ppc_link_hash_entry *) eh->elf.u.alias; 6283 } 6284 while (eh != NULL && &eh->elf != h); 6285 6286 return FALSE; 6287 } 6288 6289 /* Return whether EH has pc-relative dynamic relocs. */ 6290 6291 static bfd_boolean 6292 pc_dynrelocs (struct ppc_link_hash_entry *eh) 6293 { 6294 struct elf_dyn_relocs *p; 6295 6296 for (p = eh->dyn_relocs; p != NULL; p = p->next) 6297 if (p->pc_count != 0) 6298 return TRUE; 6299 return FALSE; 6300 } 6301 6302 /* Return true if a global entry stub will be created for H. Valid 6303 for ELFv2 before plt entries have been allocated. */ 6304 6305 static bfd_boolean 6306 global_entry_stub (struct elf_link_hash_entry *h) 6307 { 6308 struct plt_entry *pent; 6309 6310 if (!h->pointer_equality_needed 6311 || h->def_regular) 6312 return FALSE; 6313 6314 for (pent = h->plt.plist; pent != NULL; pent = pent->next) 6315 if (pent->plt.refcount > 0 6316 && pent->addend == 0) 6317 return TRUE; 6318 6319 return FALSE; 6320 } 6321 6322 /* Adjust a symbol defined by a dynamic object and referenced by a 6323 regular object. The current definition is in some section of the 6324 dynamic object, but we're not including those sections. We have to 6325 change the definition to something the rest of the link can 6326 understand. */ 6327 6328 static bfd_boolean 6329 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info, 6330 struct elf_link_hash_entry *h) 6331 { 6332 struct ppc_link_hash_table *htab; 6333 asection *s, *srel; 6334 6335 htab = ppc_hash_table (info); 6336 if (htab == NULL) 6337 return FALSE; 6338 6339 /* Deal with function syms. */ 6340 if (h->type == STT_FUNC 6341 || h->type == STT_GNU_IFUNC 6342 || h->needs_plt) 6343 { 6344 bfd_boolean local = (((struct ppc_link_hash_entry *) h)->save_res 6345 || SYMBOL_CALLS_LOCAL (info, h) 6346 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); 6347 /* Discard dyn_relocs when non-pic if we've decided that a 6348 function symbol is local and not an ifunc. We keep dynamic 6349 relocs for ifuncs when local rather than always emitting a 6350 plt call stub for them and defining the symbol on the call 6351 stub. We can't do that for ELFv1 anyway (a function symbol 6352 is defined on a descriptor, not code) and it can be faster at 6353 run-time due to not needing to bounce through a stub. The 6354 dyn_relocs for ifuncs will be applied even in a static 6355 executable. */ 6356 if (!bfd_link_pic (info) 6357 && h->type != STT_GNU_IFUNC 6358 && local) 6359 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL; 6360 6361 /* Clear procedure linkage table information for any symbol that 6362 won't need a .plt entry. */ 6363 struct plt_entry *ent; 6364 for (ent = h->plt.plist; ent != NULL; ent = ent->next) 6365 if (ent->plt.refcount > 0) 6366 break; 6367 if (ent == NULL 6368 || (h->type != STT_GNU_IFUNC 6369 && local 6370 && (htab->can_convert_all_inline_plt 6371 || (((struct ppc_link_hash_entry *) h)->tls_mask 6372 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP))) 6373 { 6374 h->plt.plist = NULL; 6375 h->needs_plt = 0; 6376 h->pointer_equality_needed = 0; 6377 } 6378 else if (abiversion (info->output_bfd) >= 2) 6379 { 6380 /* Taking a function's address in a read/write section 6381 doesn't require us to define the function symbol in the 6382 executable on a global entry stub. A dynamic reloc can 6383 be used instead. The reason we prefer a few more dynamic 6384 relocs is that calling via a global entry stub costs a 6385 few more instructions, and pointer_equality_needed causes 6386 extra work in ld.so when resolving these symbols. */ 6387 if (global_entry_stub (h)) 6388 { 6389 if (!readonly_dynrelocs (h)) 6390 { 6391 h->pointer_equality_needed = 0; 6392 /* If we haven't seen a branch reloc and the symbol 6393 isn't an ifunc then we don't need a plt entry. */ 6394 if (!h->needs_plt) 6395 h->plt.plist = NULL; 6396 } 6397 else if (!bfd_link_pic (info)) 6398 /* We are going to be defining the function symbol on the 6399 plt stub, so no dyn_relocs needed when non-pic. */ 6400 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL; 6401 } 6402 6403 /* ELFv2 function symbols can't have copy relocs. */ 6404 return TRUE; 6405 } 6406 else if (!h->needs_plt 6407 && !readonly_dynrelocs (h)) 6408 { 6409 /* If we haven't seen a branch reloc and the symbol isn't an 6410 ifunc then we don't need a plt entry. */ 6411 h->plt.plist = NULL; 6412 h->pointer_equality_needed = 0; 6413 return TRUE; 6414 } 6415 } 6416 else 6417 h->plt.plist = NULL; 6418 6419 /* If this is a weak symbol, and there is a real definition, the 6420 processor independent code will have arranged for us to see the 6421 real definition first, and we can just use the same value. */ 6422 if (h->is_weakalias) 6423 { 6424 struct elf_link_hash_entry *def = weakdef (h); 6425 BFD_ASSERT (def->root.type == bfd_link_hash_defined); 6426 h->root.u.def.section = def->root.u.def.section; 6427 h->root.u.def.value = def->root.u.def.value; 6428 if (def->root.u.def.section == htab->elf.sdynbss 6429 || def->root.u.def.section == htab->elf.sdynrelro) 6430 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL; 6431 return TRUE; 6432 } 6433 6434 /* If we are creating a shared library, we must presume that the 6435 only references to the symbol are via the global offset table. 6436 For such cases we need not do anything here; the relocations will 6437 be handled correctly by relocate_section. */ 6438 if (!bfd_link_executable (info)) 6439 return TRUE; 6440 6441 /* If there are no references to this symbol that do not use the 6442 GOT, we don't need to generate a copy reloc. */ 6443 if (!h->non_got_ref) 6444 return TRUE; 6445 6446 /* Don't generate a copy reloc for symbols defined in the executable. */ 6447 if (!h->def_dynamic || !h->ref_regular || h->def_regular 6448 6449 /* If -z nocopyreloc was given, don't generate them either. */ 6450 || info->nocopyreloc 6451 6452 /* If we don't find any dynamic relocs in read-only sections, then 6453 we'll be keeping the dynamic relocs and avoiding the copy reloc. */ 6454 || (ELIMINATE_COPY_RELOCS 6455 && !h->needs_copy 6456 && !alias_readonly_dynrelocs (h)) 6457 6458 /* Protected variables do not work with .dynbss. The copy in 6459 .dynbss won't be used by the shared library with the protected 6460 definition for the variable. Text relocations are preferable 6461 to an incorrect program. */ 6462 || h->protected_def) 6463 return TRUE; 6464 6465 if (h->type == STT_FUNC 6466 || h->type == STT_GNU_IFUNC) 6467 { 6468 /* .dynbss copies of function symbols only work if we have 6469 ELFv1 dot-symbols. ELFv1 compilers since 2004 default to not 6470 use dot-symbols and set the function symbol size to the text 6471 size of the function rather than the size of the descriptor. 6472 That's wrong for copying a descriptor. */ 6473 if (((struct ppc_link_hash_entry *) h)->oh == NULL 6474 || !(h->size == 24 || h->size == 16)) 6475 return TRUE; 6476 6477 /* We should never get here, but unfortunately there are old 6478 versions of gcc (circa gcc-3.2) that improperly for the 6479 ELFv1 ABI put initialized function pointers, vtable refs and 6480 suchlike in read-only sections. Allow them to proceed, but 6481 warn that this might break at runtime. */ 6482 info->callbacks->einfo 6483 (_("%P: copy reloc against `%pT' requires lazy plt linking; " 6484 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"), 6485 h->root.root.string); 6486 } 6487 6488 /* This is a reference to a symbol defined by a dynamic object which 6489 is not a function. */ 6490 6491 /* We must allocate the symbol in our .dynbss section, which will 6492 become part of the .bss section of the executable. There will be 6493 an entry for this symbol in the .dynsym section. The dynamic 6494 object will contain position independent code, so all references 6495 from the dynamic object to this symbol will go through the global 6496 offset table. The dynamic linker will use the .dynsym entry to 6497 determine the address it must put in the global offset table, so 6498 both the dynamic object and the regular object will refer to the 6499 same memory location for the variable. */ 6500 if ((h->root.u.def.section->flags & SEC_READONLY) != 0) 6501 { 6502 s = htab->elf.sdynrelro; 6503 srel = htab->elf.sreldynrelro; 6504 } 6505 else 6506 { 6507 s = htab->elf.sdynbss; 6508 srel = htab->elf.srelbss; 6509 } 6510 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) 6511 { 6512 /* We must generate a R_PPC64_COPY reloc to tell the dynamic 6513 linker to copy the initial value out of the dynamic object 6514 and into the runtime process image. */ 6515 srel->size += sizeof (Elf64_External_Rela); 6516 h->needs_copy = 1; 6517 } 6518 6519 /* We no longer want dyn_relocs. */ 6520 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL; 6521 return _bfd_elf_adjust_dynamic_copy (info, h, s); 6522 } 6523 6524 /* If given a function descriptor symbol, hide both the function code 6525 sym and the descriptor. */ 6526 static void 6527 ppc64_elf_hide_symbol (struct bfd_link_info *info, 6528 struct elf_link_hash_entry *h, 6529 bfd_boolean force_local) 6530 { 6531 struct ppc_link_hash_entry *eh; 6532 _bfd_elf_link_hash_hide_symbol (info, h, force_local); 6533 6534 if (ppc_hash_table (info) == NULL) 6535 return; 6536 6537 eh = (struct ppc_link_hash_entry *) h; 6538 if (eh->is_func_descriptor) 6539 { 6540 struct ppc_link_hash_entry *fh = eh->oh; 6541 6542 if (fh == NULL) 6543 { 6544 const char *p, *q; 6545 struct elf_link_hash_table *htab = elf_hash_table (info); 6546 char save; 6547 6548 /* We aren't supposed to use alloca in BFD because on 6549 systems which do not have alloca the version in libiberty 6550 calls xmalloc, which might cause the program to crash 6551 when it runs out of memory. This function doesn't have a 6552 return status, so there's no way to gracefully return an 6553 error. So cheat. We know that string[-1] can be safely 6554 accessed; It's either a string in an ELF string table, 6555 or allocated in an objalloc structure. */ 6556 6557 p = eh->elf.root.root.string - 1; 6558 save = *p; 6559 *(char *) p = '.'; 6560 fh = (struct ppc_link_hash_entry *) 6561 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE); 6562 *(char *) p = save; 6563 6564 /* Unfortunately, if it so happens that the string we were 6565 looking for was allocated immediately before this string, 6566 then we overwrote the string terminator. That's the only 6567 reason the lookup should fail. */ 6568 if (fh == NULL) 6569 { 6570 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string); 6571 while (q >= eh->elf.root.root.string && *q == *p) 6572 --q, --p; 6573 if (q < eh->elf.root.root.string && *p == '.') 6574 fh = (struct ppc_link_hash_entry *) 6575 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE); 6576 } 6577 if (fh != NULL) 6578 { 6579 eh->oh = fh; 6580 fh->oh = eh; 6581 } 6582 } 6583 if (fh != NULL) 6584 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local); 6585 } 6586 } 6587 6588 static bfd_boolean 6589 get_sym_h (struct elf_link_hash_entry **hp, 6590 Elf_Internal_Sym **symp, 6591 asection **symsecp, 6592 unsigned char **tls_maskp, 6593 Elf_Internal_Sym **locsymsp, 6594 unsigned long r_symndx, 6595 bfd *ibfd) 6596 { 6597 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd); 6598 6599 if (r_symndx >= symtab_hdr->sh_info) 6600 { 6601 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd); 6602 struct elf_link_hash_entry *h; 6603 6604 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 6605 h = elf_follow_link (h); 6606 6607 if (hp != NULL) 6608 *hp = h; 6609 6610 if (symp != NULL) 6611 *symp = NULL; 6612 6613 if (symsecp != NULL) 6614 { 6615 asection *symsec = NULL; 6616 if (h->root.type == bfd_link_hash_defined 6617 || h->root.type == bfd_link_hash_defweak) 6618 symsec = h->root.u.def.section; 6619 *symsecp = symsec; 6620 } 6621 6622 if (tls_maskp != NULL) 6623 { 6624 struct ppc_link_hash_entry *eh; 6625 6626 eh = (struct ppc_link_hash_entry *) h; 6627 *tls_maskp = &eh->tls_mask; 6628 } 6629 } 6630 else 6631 { 6632 Elf_Internal_Sym *sym; 6633 Elf_Internal_Sym *locsyms = *locsymsp; 6634 6635 if (locsyms == NULL) 6636 { 6637 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents; 6638 if (locsyms == NULL) 6639 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, 6640 symtab_hdr->sh_info, 6641 0, NULL, NULL, NULL); 6642 if (locsyms == NULL) 6643 return FALSE; 6644 *locsymsp = locsyms; 6645 } 6646 sym = locsyms + r_symndx; 6647 6648 if (hp != NULL) 6649 *hp = NULL; 6650 6651 if (symp != NULL) 6652 *symp = sym; 6653 6654 if (symsecp != NULL) 6655 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx); 6656 6657 if (tls_maskp != NULL) 6658 { 6659 struct got_entry **lgot_ents; 6660 unsigned char *tls_mask; 6661 6662 tls_mask = NULL; 6663 lgot_ents = elf_local_got_ents (ibfd); 6664 if (lgot_ents != NULL) 6665 { 6666 struct plt_entry **local_plt = (struct plt_entry **) 6667 (lgot_ents + symtab_hdr->sh_info); 6668 unsigned char *lgot_masks = (unsigned char *) 6669 (local_plt + symtab_hdr->sh_info); 6670 tls_mask = &lgot_masks[r_symndx]; 6671 } 6672 *tls_maskp = tls_mask; 6673 } 6674 } 6675 return TRUE; 6676 } 6677 6678 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on 6679 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD 6680 type suitable for optimization, and 1 otherwise. */ 6681 6682 static int 6683 get_tls_mask (unsigned char **tls_maskp, 6684 unsigned long *toc_symndx, 6685 bfd_vma *toc_addend, 6686 Elf_Internal_Sym **locsymsp, 6687 const Elf_Internal_Rela *rel, 6688 bfd *ibfd) 6689 { 6690 unsigned long r_symndx; 6691 int next_r; 6692 struct elf_link_hash_entry *h; 6693 Elf_Internal_Sym *sym; 6694 asection *sec; 6695 bfd_vma off; 6696 6697 r_symndx = ELF64_R_SYM (rel->r_info); 6698 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd)) 6699 return 0; 6700 6701 if ((*tls_maskp != NULL 6702 && (**tls_maskp & TLS_TLS) != 0 6703 && **tls_maskp != (TLS_TLS | TLS_MARK)) 6704 || sec == NULL 6705 || ppc64_elf_section_data (sec) == NULL 6706 || ppc64_elf_section_data (sec)->sec_type != sec_toc) 6707 return 1; 6708 6709 /* Look inside a TOC section too. */ 6710 if (h != NULL) 6711 { 6712 BFD_ASSERT (h->root.type == bfd_link_hash_defined); 6713 off = h->root.u.def.value; 6714 } 6715 else 6716 off = sym->st_value; 6717 off += rel->r_addend; 6718 BFD_ASSERT (off % 8 == 0); 6719 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8]; 6720 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1]; 6721 if (toc_symndx != NULL) 6722 *toc_symndx = r_symndx; 6723 if (toc_addend != NULL) 6724 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8]; 6725 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd)) 6726 return 0; 6727 if ((h == NULL || is_static_defined (h)) 6728 && (next_r == -1 || next_r == -2)) 6729 return 1 - next_r; 6730 return 1; 6731 } 6732 6733 /* Find (or create) an entry in the tocsave hash table. */ 6734 6735 static struct tocsave_entry * 6736 tocsave_find (struct ppc_link_hash_table *htab, 6737 enum insert_option insert, 6738 Elf_Internal_Sym **local_syms, 6739 const Elf_Internal_Rela *irela, 6740 bfd *ibfd) 6741 { 6742 unsigned long r_indx; 6743 struct elf_link_hash_entry *h; 6744 Elf_Internal_Sym *sym; 6745 struct tocsave_entry ent, *p; 6746 hashval_t hash; 6747 struct tocsave_entry **slot; 6748 6749 r_indx = ELF64_R_SYM (irela->r_info); 6750 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd)) 6751 return NULL; 6752 if (ent.sec == NULL || ent.sec->output_section == NULL) 6753 { 6754 _bfd_error_handler 6755 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd); 6756 return NULL; 6757 } 6758 6759 if (h != NULL) 6760 ent.offset = h->root.u.def.value; 6761 else 6762 ent.offset = sym->st_value; 6763 ent.offset += irela->r_addend; 6764 6765 hash = tocsave_htab_hash (&ent); 6766 slot = ((struct tocsave_entry **) 6767 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert)); 6768 if (slot == NULL) 6769 return NULL; 6770 6771 if (*slot == NULL) 6772 { 6773 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p)); 6774 if (p == NULL) 6775 return NULL; 6776 *p = ent; 6777 *slot = p; 6778 } 6779 return *slot; 6780 } 6781 6782 /* Adjust all global syms defined in opd sections. In gcc generated 6783 code for the old ABI, these will already have been done. */ 6784 6785 static bfd_boolean 6786 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED) 6787 { 6788 struct ppc_link_hash_entry *eh; 6789 asection *sym_sec; 6790 struct _opd_sec_data *opd; 6791 6792 if (h->root.type == bfd_link_hash_indirect) 6793 return TRUE; 6794 6795 if (h->root.type != bfd_link_hash_defined 6796 && h->root.type != bfd_link_hash_defweak) 6797 return TRUE; 6798 6799 eh = (struct ppc_link_hash_entry *) h; 6800 if (eh->adjust_done) 6801 return TRUE; 6802 6803 sym_sec = eh->elf.root.u.def.section; 6804 opd = get_opd_info (sym_sec); 6805 if (opd != NULL && opd->adjust != NULL) 6806 { 6807 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)]; 6808 if (adjust == -1) 6809 { 6810 /* This entry has been deleted. */ 6811 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section; 6812 if (dsec == NULL) 6813 { 6814 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next) 6815 if (discarded_section (dsec)) 6816 { 6817 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec; 6818 break; 6819 } 6820 } 6821 eh->elf.root.u.def.value = 0; 6822 eh->elf.root.u.def.section = dsec; 6823 } 6824 else 6825 eh->elf.root.u.def.value += adjust; 6826 eh->adjust_done = 1; 6827 } 6828 return TRUE; 6829 } 6830 6831 /* Handles decrementing dynamic reloc counts for the reloc specified by 6832 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM 6833 have already been determined. */ 6834 6835 static bfd_boolean 6836 dec_dynrel_count (bfd_vma r_info, 6837 asection *sec, 6838 struct bfd_link_info *info, 6839 Elf_Internal_Sym **local_syms, 6840 struct elf_link_hash_entry *h, 6841 Elf_Internal_Sym *sym) 6842 { 6843 enum elf_ppc64_reloc_type r_type; 6844 asection *sym_sec = NULL; 6845 6846 /* Can this reloc be dynamic? This switch, and later tests here 6847 should be kept in sync with the code in check_relocs. */ 6848 r_type = ELF64_R_TYPE (r_info); 6849 switch (r_type) 6850 { 6851 default: 6852 return TRUE; 6853 6854 case R_PPC64_TOC16: 6855 case R_PPC64_TOC16_DS: 6856 case R_PPC64_TOC16_LO: 6857 case R_PPC64_TOC16_HI: 6858 case R_PPC64_TOC16_HA: 6859 case R_PPC64_TOC16_LO_DS: 6860 if (h == NULL) 6861 return TRUE; 6862 break; 6863 6864 case R_PPC64_TPREL16: 6865 case R_PPC64_TPREL16_LO: 6866 case R_PPC64_TPREL16_HI: 6867 case R_PPC64_TPREL16_HA: 6868 case R_PPC64_TPREL16_DS: 6869 case R_PPC64_TPREL16_LO_DS: 6870 case R_PPC64_TPREL16_HIGH: 6871 case R_PPC64_TPREL16_HIGHA: 6872 case R_PPC64_TPREL16_HIGHER: 6873 case R_PPC64_TPREL16_HIGHERA: 6874 case R_PPC64_TPREL16_HIGHEST: 6875 case R_PPC64_TPREL16_HIGHESTA: 6876 case R_PPC64_TPREL64: 6877 case R_PPC64_TPREL34: 6878 case R_PPC64_DTPMOD64: 6879 case R_PPC64_DTPREL64: 6880 case R_PPC64_ADDR64: 6881 case R_PPC64_REL30: 6882 case R_PPC64_REL32: 6883 case R_PPC64_REL64: 6884 case R_PPC64_ADDR14: 6885 case R_PPC64_ADDR14_BRNTAKEN: 6886 case R_PPC64_ADDR14_BRTAKEN: 6887 case R_PPC64_ADDR16: 6888 case R_PPC64_ADDR16_DS: 6889 case R_PPC64_ADDR16_HA: 6890 case R_PPC64_ADDR16_HI: 6891 case R_PPC64_ADDR16_HIGH: 6892 case R_PPC64_ADDR16_HIGHA: 6893 case R_PPC64_ADDR16_HIGHER: 6894 case R_PPC64_ADDR16_HIGHERA: 6895 case R_PPC64_ADDR16_HIGHEST: 6896 case R_PPC64_ADDR16_HIGHESTA: 6897 case R_PPC64_ADDR16_LO: 6898 case R_PPC64_ADDR16_LO_DS: 6899 case R_PPC64_ADDR24: 6900 case R_PPC64_ADDR32: 6901 case R_PPC64_UADDR16: 6902 case R_PPC64_UADDR32: 6903 case R_PPC64_UADDR64: 6904 case R_PPC64_TOC: 6905 case R_PPC64_D34: 6906 case R_PPC64_D34_LO: 6907 case R_PPC64_D34_HI30: 6908 case R_PPC64_D34_HA30: 6909 case R_PPC64_ADDR16_HIGHER34: 6910 case R_PPC64_ADDR16_HIGHERA34: 6911 case R_PPC64_ADDR16_HIGHEST34: 6912 case R_PPC64_ADDR16_HIGHESTA34: 6913 case R_PPC64_D28: 6914 break; 6915 } 6916 6917 if (local_syms != NULL) 6918 { 6919 unsigned long r_symndx; 6920 bfd *ibfd = sec->owner; 6921 6922 r_symndx = ELF64_R_SYM (r_info); 6923 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd)) 6924 return FALSE; 6925 } 6926 6927 if ((h != NULL 6928 && (h->root.type == bfd_link_hash_defweak 6929 || !h->def_regular)) 6930 || (h != NULL 6931 && !bfd_link_executable (info) 6932 && !SYMBOLIC_BIND (info, h)) 6933 || (bfd_link_pic (info) 6934 && must_be_dyn_reloc (info, r_type)) 6935 || (!bfd_link_pic (info) 6936 && (h != NULL 6937 ? h->type == STT_GNU_IFUNC 6938 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))) 6939 ; 6940 else 6941 return TRUE; 6942 6943 if (h != NULL) 6944 { 6945 struct elf_dyn_relocs *p; 6946 struct elf_dyn_relocs **pp; 6947 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs; 6948 6949 /* elf_gc_sweep may have already removed all dyn relocs associated 6950 with local syms for a given section. Also, symbol flags are 6951 changed by elf_gc_sweep_symbol, confusing the test above. Don't 6952 report a dynreloc miscount. */ 6953 if (*pp == NULL && info->gc_sections) 6954 return TRUE; 6955 6956 while ((p = *pp) != NULL) 6957 { 6958 if (p->sec == sec) 6959 { 6960 if (!must_be_dyn_reloc (info, r_type)) 6961 p->pc_count -= 1; 6962 p->count -= 1; 6963 if (p->count == 0) 6964 *pp = p->next; 6965 return TRUE; 6966 } 6967 pp = &p->next; 6968 } 6969 } 6970 else 6971 { 6972 struct ppc_dyn_relocs *p; 6973 struct ppc_dyn_relocs **pp; 6974 void *vpp; 6975 bfd_boolean is_ifunc; 6976 6977 if (local_syms == NULL) 6978 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx); 6979 if (sym_sec == NULL) 6980 sym_sec = sec; 6981 6982 vpp = &elf_section_data (sym_sec)->local_dynrel; 6983 pp = (struct ppc_dyn_relocs **) vpp; 6984 6985 if (*pp == NULL && info->gc_sections) 6986 return TRUE; 6987 6988 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC; 6989 while ((p = *pp) != NULL) 6990 { 6991 if (p->sec == sec && p->ifunc == is_ifunc) 6992 { 6993 p->count -= 1; 6994 if (p->count == 0) 6995 *pp = p->next; 6996 return TRUE; 6997 } 6998 pp = &p->next; 6999 } 7000 } 7001 7002 /* xgettext:c-format */ 7003 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"), 7004 sec->owner, sec); 7005 bfd_set_error (bfd_error_bad_value); 7006 return FALSE; 7007 } 7008 7009 /* Remove unused Official Procedure Descriptor entries. Currently we 7010 only remove those associated with functions in discarded link-once 7011 sections, or weakly defined functions that have been overridden. It 7012 would be possible to remove many more entries for statically linked 7013 applications. */ 7014 7015 bfd_boolean 7016 ppc64_elf_edit_opd (struct bfd_link_info *info) 7017 { 7018 bfd *ibfd; 7019 bfd_boolean some_edited = FALSE; 7020 asection *need_pad = NULL; 7021 struct ppc_link_hash_table *htab; 7022 7023 htab = ppc_hash_table (info); 7024 if (htab == NULL) 7025 return FALSE; 7026 7027 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 7028 { 7029 asection *sec; 7030 Elf_Internal_Rela *relstart, *rel, *relend; 7031 Elf_Internal_Shdr *symtab_hdr; 7032 Elf_Internal_Sym *local_syms; 7033 struct _opd_sec_data *opd; 7034 bfd_boolean need_edit, add_aux_fields, broken; 7035 bfd_size_type cnt_16b = 0; 7036 7037 if (!is_ppc64_elf (ibfd)) 7038 continue; 7039 7040 sec = bfd_get_section_by_name (ibfd, ".opd"); 7041 if (sec == NULL || sec->size == 0) 7042 continue; 7043 7044 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS) 7045 continue; 7046 7047 if (sec->output_section == bfd_abs_section_ptr) 7048 continue; 7049 7050 /* Look through the section relocs. */ 7051 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0) 7052 continue; 7053 7054 local_syms = NULL; 7055 symtab_hdr = &elf_symtab_hdr (ibfd); 7056 7057 /* Read the relocations. */ 7058 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, 7059 info->keep_memory); 7060 if (relstart == NULL) 7061 return FALSE; 7062 7063 /* First run through the relocs to check they are sane, and to 7064 determine whether we need to edit this opd section. */ 7065 need_edit = FALSE; 7066 broken = FALSE; 7067 need_pad = sec; 7068 relend = relstart + sec->reloc_count; 7069 for (rel = relstart; rel < relend; ) 7070 { 7071 enum elf_ppc64_reloc_type r_type; 7072 unsigned long r_symndx; 7073 asection *sym_sec; 7074 struct elf_link_hash_entry *h; 7075 Elf_Internal_Sym *sym; 7076 bfd_vma offset; 7077 7078 /* .opd contains an array of 16 or 24 byte entries. We're 7079 only interested in the reloc pointing to a function entry 7080 point. */ 7081 offset = rel->r_offset; 7082 if (rel + 1 == relend 7083 || rel[1].r_offset != offset + 8) 7084 { 7085 /* If someone messes with .opd alignment then after a 7086 "ld -r" we might have padding in the middle of .opd. 7087 Also, there's nothing to prevent someone putting 7088 something silly in .opd with the assembler. No .opd 7089 optimization for them! */ 7090 broken_opd: 7091 _bfd_error_handler 7092 (_("%pB: .opd is not a regular array of opd entries"), ibfd); 7093 broken = TRUE; 7094 break; 7095 } 7096 7097 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64 7098 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC) 7099 { 7100 _bfd_error_handler 7101 /* xgettext:c-format */ 7102 (_("%pB: unexpected reloc type %u in .opd section"), 7103 ibfd, r_type); 7104 broken = TRUE; 7105 break; 7106 } 7107 7108 r_symndx = ELF64_R_SYM (rel->r_info); 7109 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 7110 r_symndx, ibfd)) 7111 goto error_ret; 7112 7113 if (sym_sec == NULL || sym_sec->owner == NULL) 7114 { 7115 const char *sym_name; 7116 if (h != NULL) 7117 sym_name = h->root.root.string; 7118 else 7119 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym, 7120 sym_sec); 7121 7122 _bfd_error_handler 7123 /* xgettext:c-format */ 7124 (_("%pB: undefined sym `%s' in .opd section"), 7125 ibfd, sym_name); 7126 broken = TRUE; 7127 break; 7128 } 7129 7130 /* opd entries are always for functions defined in the 7131 current input bfd. If the symbol isn't defined in the 7132 input bfd, then we won't be using the function in this 7133 bfd; It must be defined in a linkonce section in another 7134 bfd, or is weak. It's also possible that we are 7135 discarding the function due to a linker script /DISCARD/, 7136 which we test for via the output_section. */ 7137 if (sym_sec->owner != ibfd 7138 || sym_sec->output_section == bfd_abs_section_ptr) 7139 need_edit = TRUE; 7140 7141 rel += 2; 7142 if (rel + 1 == relend 7143 || (rel + 2 < relend 7144 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)) 7145 ++rel; 7146 7147 if (rel == relend) 7148 { 7149 if (sec->size == offset + 24) 7150 { 7151 need_pad = NULL; 7152 break; 7153 } 7154 if (sec->size == offset + 16) 7155 { 7156 cnt_16b++; 7157 break; 7158 } 7159 goto broken_opd; 7160 } 7161 else if (rel + 1 < relend 7162 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64 7163 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC) 7164 { 7165 if (rel[0].r_offset == offset + 16) 7166 cnt_16b++; 7167 else if (rel[0].r_offset != offset + 24) 7168 goto broken_opd; 7169 } 7170 else 7171 goto broken_opd; 7172 } 7173 7174 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0; 7175 7176 if (!broken && (need_edit || add_aux_fields)) 7177 { 7178 Elf_Internal_Rela *write_rel; 7179 Elf_Internal_Shdr *rel_hdr; 7180 bfd_byte *rptr, *wptr; 7181 bfd_byte *new_contents; 7182 bfd_size_type amt; 7183 7184 new_contents = NULL; 7185 amt = OPD_NDX (sec->size) * sizeof (long); 7186 opd = &ppc64_elf_section_data (sec)->u.opd; 7187 opd->adjust = bfd_zalloc (sec->owner, amt); 7188 if (opd->adjust == NULL) 7189 return FALSE; 7190 7191 /* This seems a waste of time as input .opd sections are all 7192 zeros as generated by gcc, but I suppose there's no reason 7193 this will always be so. We might start putting something in 7194 the third word of .opd entries. */ 7195 if ((sec->flags & SEC_IN_MEMORY) == 0) 7196 { 7197 bfd_byte *loc; 7198 if (!bfd_malloc_and_get_section (ibfd, sec, &loc)) 7199 { 7200 if (loc != NULL) 7201 free (loc); 7202 error_ret: 7203 if (local_syms != NULL 7204 && symtab_hdr->contents != (unsigned char *) local_syms) 7205 free (local_syms); 7206 if (elf_section_data (sec)->relocs != relstart) 7207 free (relstart); 7208 return FALSE; 7209 } 7210 sec->contents = loc; 7211 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS); 7212 } 7213 7214 elf_section_data (sec)->relocs = relstart; 7215 7216 new_contents = sec->contents; 7217 if (add_aux_fields) 7218 { 7219 new_contents = bfd_malloc (sec->size + cnt_16b * 8); 7220 if (new_contents == NULL) 7221 return FALSE; 7222 need_pad = NULL; 7223 } 7224 wptr = new_contents; 7225 rptr = sec->contents; 7226 write_rel = relstart; 7227 for (rel = relstart; rel < relend; ) 7228 { 7229 unsigned long r_symndx; 7230 asection *sym_sec; 7231 struct elf_link_hash_entry *h; 7232 struct ppc_link_hash_entry *fdh = NULL; 7233 Elf_Internal_Sym *sym; 7234 long opd_ent_size; 7235 Elf_Internal_Rela *next_rel; 7236 bfd_boolean skip; 7237 7238 r_symndx = ELF64_R_SYM (rel->r_info); 7239 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 7240 r_symndx, ibfd)) 7241 goto error_ret; 7242 7243 next_rel = rel + 2; 7244 if (next_rel + 1 == relend 7245 || (next_rel + 2 < relend 7246 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC)) 7247 ++next_rel; 7248 7249 /* See if the .opd entry is full 24 byte or 7250 16 byte (with fd_aux entry overlapped with next 7251 fd_func). */ 7252 opd_ent_size = 24; 7253 if (next_rel == relend) 7254 { 7255 if (sec->size == rel->r_offset + 16) 7256 opd_ent_size = 16; 7257 } 7258 else if (next_rel->r_offset == rel->r_offset + 16) 7259 opd_ent_size = 16; 7260 7261 if (h != NULL 7262 && h->root.root.string[0] == '.') 7263 { 7264 fdh = ((struct ppc_link_hash_entry *) h)->oh; 7265 if (fdh != NULL) 7266 { 7267 fdh = ppc_follow_link (fdh); 7268 if (fdh->elf.root.type != bfd_link_hash_defined 7269 && fdh->elf.root.type != bfd_link_hash_defweak) 7270 fdh = NULL; 7271 } 7272 } 7273 7274 skip = (sym_sec->owner != ibfd 7275 || sym_sec->output_section == bfd_abs_section_ptr); 7276 if (skip) 7277 { 7278 if (fdh != NULL && sym_sec->owner == ibfd) 7279 { 7280 /* Arrange for the function descriptor sym 7281 to be dropped. */ 7282 fdh->elf.root.u.def.value = 0; 7283 fdh->elf.root.u.def.section = sym_sec; 7284 } 7285 opd->adjust[OPD_NDX (rel->r_offset)] = -1; 7286 7287 if (NO_OPD_RELOCS || bfd_link_relocatable (info)) 7288 rel = next_rel; 7289 else 7290 while (1) 7291 { 7292 if (!dec_dynrel_count (rel->r_info, sec, info, 7293 NULL, h, sym)) 7294 goto error_ret; 7295 7296 if (++rel == next_rel) 7297 break; 7298 7299 r_symndx = ELF64_R_SYM (rel->r_info); 7300 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 7301 r_symndx, ibfd)) 7302 goto error_ret; 7303 } 7304 } 7305 else 7306 { 7307 /* We'll be keeping this opd entry. */ 7308 long adjust; 7309 7310 if (fdh != NULL) 7311 { 7312 /* Redefine the function descriptor symbol to 7313 this location in the opd section. It is 7314 necessary to update the value here rather 7315 than using an array of adjustments as we do 7316 for local symbols, because various places 7317 in the generic ELF code use the value 7318 stored in u.def.value. */ 7319 fdh->elf.root.u.def.value = wptr - new_contents; 7320 fdh->adjust_done = 1; 7321 } 7322 7323 /* Local syms are a bit tricky. We could 7324 tweak them as they can be cached, but 7325 we'd need to look through the local syms 7326 for the function descriptor sym which we 7327 don't have at the moment. So keep an 7328 array of adjustments. */ 7329 adjust = (wptr - new_contents) - (rptr - sec->contents); 7330 opd->adjust[OPD_NDX (rel->r_offset)] = adjust; 7331 7332 if (wptr != rptr) 7333 memcpy (wptr, rptr, opd_ent_size); 7334 wptr += opd_ent_size; 7335 if (add_aux_fields && opd_ent_size == 16) 7336 { 7337 memset (wptr, '\0', 8); 7338 wptr += 8; 7339 } 7340 7341 /* We need to adjust any reloc offsets to point to the 7342 new opd entries. */ 7343 for ( ; rel != next_rel; ++rel) 7344 { 7345 rel->r_offset += adjust; 7346 if (write_rel != rel) 7347 memcpy (write_rel, rel, sizeof (*rel)); 7348 ++write_rel; 7349 } 7350 } 7351 7352 rptr += opd_ent_size; 7353 } 7354 7355 sec->size = wptr - new_contents; 7356 sec->reloc_count = write_rel - relstart; 7357 if (add_aux_fields) 7358 { 7359 free (sec->contents); 7360 sec->contents = new_contents; 7361 } 7362 7363 /* Fudge the header size too, as this is used later in 7364 elf_bfd_final_link if we are emitting relocs. */ 7365 rel_hdr = _bfd_elf_single_rel_hdr (sec); 7366 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize; 7367 some_edited = TRUE; 7368 } 7369 else if (elf_section_data (sec)->relocs != relstart) 7370 free (relstart); 7371 7372 if (local_syms != NULL 7373 && symtab_hdr->contents != (unsigned char *) local_syms) 7374 { 7375 if (!info->keep_memory) 7376 free (local_syms); 7377 else 7378 symtab_hdr->contents = (unsigned char *) local_syms; 7379 } 7380 } 7381 7382 if (some_edited) 7383 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL); 7384 7385 /* If we are doing a final link and the last .opd entry is just 16 byte 7386 long, add a 8 byte padding after it. */ 7387 if (need_pad != NULL && !bfd_link_relocatable (info)) 7388 { 7389 bfd_byte *p; 7390 7391 if ((need_pad->flags & SEC_IN_MEMORY) == 0) 7392 { 7393 BFD_ASSERT (need_pad->size > 0); 7394 7395 p = bfd_malloc (need_pad->size + 8); 7396 if (p == NULL) 7397 return FALSE; 7398 7399 if (!bfd_get_section_contents (need_pad->owner, need_pad, 7400 p, 0, need_pad->size)) 7401 return FALSE; 7402 7403 need_pad->contents = p; 7404 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS); 7405 } 7406 else 7407 { 7408 p = bfd_realloc (need_pad->contents, need_pad->size + 8); 7409 if (p == NULL) 7410 return FALSE; 7411 7412 need_pad->contents = p; 7413 } 7414 7415 memset (need_pad->contents + need_pad->size, 0, 8); 7416 need_pad->size += 8; 7417 } 7418 7419 return TRUE; 7420 } 7421 7422 /* Analyze inline PLT call relocations to see whether calls to locally 7423 defined functions can be converted to direct calls. */ 7424 7425 bfd_boolean 7426 ppc64_elf_inline_plt (struct bfd_link_info *info) 7427 { 7428 struct ppc_link_hash_table *htab; 7429 bfd *ibfd; 7430 asection *sec; 7431 bfd_vma low_vma, high_vma, limit; 7432 7433 htab = ppc_hash_table (info); 7434 if (htab == NULL) 7435 return FALSE; 7436 7437 /* A bl insn can reach -0x2000000 to 0x1fffffc. The limit is 7438 reduced somewhat to cater for possible stubs that might be added 7439 between the call and its destination. */ 7440 if (htab->params->group_size < 0) 7441 { 7442 limit = -htab->params->group_size; 7443 if (limit == 1) 7444 limit = 0x1e00000; 7445 } 7446 else 7447 { 7448 limit = htab->params->group_size; 7449 if (limit == 1) 7450 limit = 0x1c00000; 7451 } 7452 7453 low_vma = -1; 7454 high_vma = 0; 7455 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next) 7456 if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE)) 7457 { 7458 if (low_vma > sec->vma) 7459 low_vma = sec->vma; 7460 if (high_vma < sec->vma + sec->size) 7461 high_vma = sec->vma + sec->size; 7462 } 7463 7464 /* If a "bl" can reach anywhere in local code sections, then we can 7465 convert all inline PLT sequences to direct calls when the symbol 7466 is local. */ 7467 if (high_vma - low_vma < limit) 7468 { 7469 htab->can_convert_all_inline_plt = 1; 7470 return TRUE; 7471 } 7472 7473 /* Otherwise, go looking through relocs for cases where a direct 7474 call won't reach. Mark the symbol on any such reloc to disable 7475 the optimization and keep the PLT entry as it seems likely that 7476 this will be better than creating trampolines. Note that this 7477 will disable the optimization for all inline PLT calls to a 7478 particular symbol, not just those that won't reach. The 7479 difficulty in doing a more precise optimization is that the 7480 linker needs to make a decision depending on whether a 7481 particular R_PPC64_PLTCALL insn can be turned into a direct 7482 call, for each of the R_PPC64_PLTSEQ and R_PPC64_PLT16* insns in 7483 the sequence, and there is nothing that ties those relocs 7484 together except their symbol. */ 7485 7486 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 7487 { 7488 Elf_Internal_Shdr *symtab_hdr; 7489 Elf_Internal_Sym *local_syms; 7490 7491 if (!is_ppc64_elf (ibfd)) 7492 continue; 7493 7494 local_syms = NULL; 7495 symtab_hdr = &elf_symtab_hdr (ibfd); 7496 7497 for (sec = ibfd->sections; sec != NULL; sec = sec->next) 7498 if (ppc64_elf_section_data (sec)->has_pltcall 7499 && !bfd_is_abs_section (sec->output_section)) 7500 { 7501 Elf_Internal_Rela *relstart, *rel, *relend; 7502 7503 /* Read the relocations. */ 7504 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, 7505 info->keep_memory); 7506 if (relstart == NULL) 7507 return FALSE; 7508 7509 relend = relstart + sec->reloc_count; 7510 for (rel = relstart; rel < relend; rel++) 7511 { 7512 enum elf_ppc64_reloc_type r_type; 7513 unsigned long r_symndx; 7514 asection *sym_sec; 7515 struct elf_link_hash_entry *h; 7516 Elf_Internal_Sym *sym; 7517 unsigned char *tls_maskp; 7518 7519 r_type = ELF64_R_TYPE (rel->r_info); 7520 if (r_type != R_PPC64_PLTCALL 7521 && r_type != R_PPC64_PLTCALL_NOTOC) 7522 continue; 7523 7524 r_symndx = ELF64_R_SYM (rel->r_info); 7525 if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms, 7526 r_symndx, ibfd)) 7527 { 7528 if (elf_section_data (sec)->relocs != relstart) 7529 free (relstart); 7530 if (local_syms != NULL 7531 && symtab_hdr->contents != (bfd_byte *) local_syms) 7532 free (local_syms); 7533 return FALSE; 7534 } 7535 7536 if (sym_sec != NULL && sym_sec->output_section != NULL) 7537 { 7538 bfd_vma from, to; 7539 if (h != NULL) 7540 to = h->root.u.def.value; 7541 else 7542 to = sym->st_value; 7543 to += (rel->r_addend 7544 + sym_sec->output_offset 7545 + sym_sec->output_section->vma); 7546 from = (rel->r_offset 7547 + sec->output_offset 7548 + sec->output_section->vma); 7549 if (to - from + limit < 2 * limit 7550 && !(r_type == R_PPC64_PLTCALL_NOTOC 7551 && (((h ? h->other : sym->st_other) 7552 & STO_PPC64_LOCAL_MASK) 7553 > 1 << STO_PPC64_LOCAL_BIT))) 7554 *tls_maskp &= ~PLT_KEEP; 7555 } 7556 } 7557 if (elf_section_data (sec)->relocs != relstart) 7558 free (relstart); 7559 } 7560 7561 if (local_syms != NULL 7562 && symtab_hdr->contents != (unsigned char *) local_syms) 7563 { 7564 if (!info->keep_memory) 7565 free (local_syms); 7566 else 7567 symtab_hdr->contents = (unsigned char *) local_syms; 7568 } 7569 } 7570 7571 return TRUE; 7572 } 7573 7574 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */ 7575 7576 asection * 7577 ppc64_elf_tls_setup (struct bfd_link_info *info) 7578 { 7579 struct ppc_link_hash_table *htab; 7580 7581 htab = ppc_hash_table (info); 7582 if (htab == NULL) 7583 return NULL; 7584 7585 if (abiversion (info->output_bfd) == 1) 7586 htab->opd_abi = 1; 7587 7588 if (htab->params->no_multi_toc) 7589 htab->do_multi_toc = 0; 7590 else if (!htab->do_multi_toc) 7591 htab->params->no_multi_toc = 1; 7592 7593 /* Default to --no-plt-localentry, as this option can cause problems 7594 with symbol interposition. For example, glibc libpthread.so and 7595 libc.so duplicate many pthread symbols, with a fallback 7596 implementation in libc.so. In some cases the fallback does more 7597 work than the pthread implementation. __pthread_condattr_destroy 7598 is one such symbol: the libpthread.so implementation is 7599 localentry:0 while the libc.so implementation is localentry:8. 7600 An app that "cleverly" uses dlopen to only load necessary 7601 libraries at runtime may omit loading libpthread.so when not 7602 running multi-threaded, which then results in the libc.so 7603 fallback symbols being used and ld.so complaining. Now there 7604 are workarounds in ld (see non_zero_localentry) to detect the 7605 pthread situation, but that may not be the only case where 7606 --plt-localentry can cause trouble. */ 7607 if (htab->params->plt_localentry0 < 0) 7608 htab->params->plt_localentry0 = 0; 7609 if (htab->params->plt_localentry0 7610 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26", 7611 FALSE, FALSE, FALSE) == NULL) 7612 _bfd_error_handler 7613 (_("warning: --plt-localentry is especially dangerous without " 7614 "ld.so support to detect ABI violations")); 7615 7616 htab->tls_get_addr = ((struct ppc_link_hash_entry *) 7617 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr", 7618 FALSE, FALSE, TRUE)); 7619 /* Move dynamic linking info to the function descriptor sym. */ 7620 if (htab->tls_get_addr != NULL) 7621 func_desc_adjust (&htab->tls_get_addr->elf, info); 7622 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *) 7623 elf_link_hash_lookup (&htab->elf, "__tls_get_addr", 7624 FALSE, FALSE, TRUE)); 7625 if (htab->params->tls_get_addr_opt) 7626 { 7627 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd; 7628 7629 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt", 7630 FALSE, FALSE, TRUE); 7631 if (opt != NULL) 7632 func_desc_adjust (opt, info); 7633 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt", 7634 FALSE, FALSE, TRUE); 7635 if (opt_fd != NULL 7636 && (opt_fd->root.type == bfd_link_hash_defined 7637 || opt_fd->root.type == bfd_link_hash_defweak)) 7638 { 7639 /* If glibc supports an optimized __tls_get_addr call stub, 7640 signalled by the presence of __tls_get_addr_opt, and we'll 7641 be calling __tls_get_addr via a plt call stub, then 7642 make __tls_get_addr point to __tls_get_addr_opt. */ 7643 tga_fd = &htab->tls_get_addr_fd->elf; 7644 if (htab->elf.dynamic_sections_created 7645 && tga_fd != NULL 7646 && (tga_fd->type == STT_FUNC 7647 || tga_fd->needs_plt) 7648 && !(SYMBOL_CALLS_LOCAL (info, tga_fd) 7649 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd))) 7650 { 7651 struct plt_entry *ent; 7652 7653 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next) 7654 if (ent->plt.refcount > 0) 7655 break; 7656 if (ent != NULL) 7657 { 7658 tga_fd->root.type = bfd_link_hash_indirect; 7659 tga_fd->root.u.i.link = &opt_fd->root; 7660 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd); 7661 opt_fd->mark = 1; 7662 if (opt_fd->dynindx != -1) 7663 { 7664 /* Use __tls_get_addr_opt in dynamic relocations. */ 7665 opt_fd->dynindx = -1; 7666 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr, 7667 opt_fd->dynstr_index); 7668 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd)) 7669 return NULL; 7670 } 7671 htab->tls_get_addr_fd 7672 = (struct ppc_link_hash_entry *) opt_fd; 7673 tga = &htab->tls_get_addr->elf; 7674 if (opt != NULL && tga != NULL) 7675 { 7676 tga->root.type = bfd_link_hash_indirect; 7677 tga->root.u.i.link = &opt->root; 7678 ppc64_elf_copy_indirect_symbol (info, opt, tga); 7679 opt->mark = 1; 7680 _bfd_elf_link_hash_hide_symbol (info, opt, 7681 tga->forced_local); 7682 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt; 7683 } 7684 htab->tls_get_addr_fd->oh = htab->tls_get_addr; 7685 htab->tls_get_addr_fd->is_func_descriptor = 1; 7686 if (htab->tls_get_addr != NULL) 7687 { 7688 htab->tls_get_addr->oh = htab->tls_get_addr_fd; 7689 htab->tls_get_addr->is_func = 1; 7690 } 7691 } 7692 } 7693 } 7694 else if (htab->params->tls_get_addr_opt < 0) 7695 htab->params->tls_get_addr_opt = 0; 7696 } 7697 return _bfd_elf_tls_setup (info->output_bfd, info); 7698 } 7699 7700 /* Return TRUE iff REL is a branch reloc with a global symbol matching 7701 HASH1 or HASH2. */ 7702 7703 static bfd_boolean 7704 branch_reloc_hash_match (const bfd *ibfd, 7705 const Elf_Internal_Rela *rel, 7706 const struct ppc_link_hash_entry *hash1, 7707 const struct ppc_link_hash_entry *hash2) 7708 { 7709 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd); 7710 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info); 7711 unsigned int r_symndx = ELF64_R_SYM (rel->r_info); 7712 7713 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type)) 7714 { 7715 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd); 7716 struct elf_link_hash_entry *h; 7717 7718 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 7719 h = elf_follow_link (h); 7720 if (h == &hash1->elf || h == &hash2->elf) 7721 return TRUE; 7722 } 7723 return FALSE; 7724 } 7725 7726 /* Run through all the TLS relocs looking for optimization 7727 opportunities. The linker has been hacked (see ppc64elf.em) to do 7728 a preliminary section layout so that we know the TLS segment 7729 offsets. We can't optimize earlier because some optimizations need 7730 to know the tp offset, and we need to optimize before allocating 7731 dynamic relocations. */ 7732 7733 bfd_boolean 7734 ppc64_elf_tls_optimize (struct bfd_link_info *info) 7735 { 7736 bfd *ibfd; 7737 asection *sec; 7738 struct ppc_link_hash_table *htab; 7739 unsigned char *toc_ref; 7740 int pass; 7741 7742 if (!bfd_link_executable (info)) 7743 return TRUE; 7744 7745 htab = ppc_hash_table (info); 7746 if (htab == NULL) 7747 return FALSE; 7748 7749 /* Make two passes over the relocs. On the first pass, mark toc 7750 entries involved with tls relocs, and check that tls relocs 7751 involved in setting up a tls_get_addr call are indeed followed by 7752 such a call. If they are not, we can't do any tls optimization. 7753 On the second pass twiddle tls_mask flags to notify 7754 relocate_section that optimization can be done, and adjust got 7755 and plt refcounts. */ 7756 toc_ref = NULL; 7757 for (pass = 0; pass < 2; ++pass) 7758 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 7759 { 7760 Elf_Internal_Sym *locsyms = NULL; 7761 asection *toc = bfd_get_section_by_name (ibfd, ".toc"); 7762 7763 for (sec = ibfd->sections; sec != NULL; sec = sec->next) 7764 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section)) 7765 { 7766 Elf_Internal_Rela *relstart, *rel, *relend; 7767 bfd_boolean found_tls_get_addr_arg = 0; 7768 7769 /* Read the relocations. */ 7770 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, 7771 info->keep_memory); 7772 if (relstart == NULL) 7773 { 7774 free (toc_ref); 7775 return FALSE; 7776 } 7777 7778 relend = relstart + sec->reloc_count; 7779 for (rel = relstart; rel < relend; rel++) 7780 { 7781 enum elf_ppc64_reloc_type r_type; 7782 unsigned long r_symndx; 7783 struct elf_link_hash_entry *h; 7784 Elf_Internal_Sym *sym; 7785 asection *sym_sec; 7786 unsigned char *tls_mask; 7787 unsigned int tls_set, tls_clear, tls_type = 0; 7788 bfd_vma value; 7789 bfd_boolean ok_tprel, is_local; 7790 long toc_ref_index = 0; 7791 int expecting_tls_get_addr = 0; 7792 bfd_boolean ret = FALSE; 7793 7794 r_symndx = ELF64_R_SYM (rel->r_info); 7795 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms, 7796 r_symndx, ibfd)) 7797 { 7798 err_free_rel: 7799 if (elf_section_data (sec)->relocs != relstart) 7800 free (relstart); 7801 if (toc_ref != NULL) 7802 free (toc_ref); 7803 if (locsyms != NULL 7804 && (elf_symtab_hdr (ibfd).contents 7805 != (unsigned char *) locsyms)) 7806 free (locsyms); 7807 return ret; 7808 } 7809 7810 if (h != NULL) 7811 { 7812 if (h->root.type == bfd_link_hash_defined 7813 || h->root.type == bfd_link_hash_defweak) 7814 value = h->root.u.def.value; 7815 else if (h->root.type == bfd_link_hash_undefweak) 7816 value = 0; 7817 else 7818 { 7819 found_tls_get_addr_arg = 0; 7820 continue; 7821 } 7822 } 7823 else 7824 /* Symbols referenced by TLS relocs must be of type 7825 STT_TLS. So no need for .opd local sym adjust. */ 7826 value = sym->st_value; 7827 7828 ok_tprel = FALSE; 7829 is_local = SYMBOL_REFERENCES_LOCAL (info, h); 7830 if (is_local) 7831 { 7832 if (h != NULL 7833 && h->root.type == bfd_link_hash_undefweak) 7834 ok_tprel = TRUE; 7835 else if (sym_sec != NULL 7836 && sym_sec->output_section != NULL) 7837 { 7838 value += sym_sec->output_offset; 7839 value += sym_sec->output_section->vma; 7840 value -= htab->elf.tls_sec->vma + TP_OFFSET; 7841 /* Note that even though the prefix insns 7842 allow a 1<<33 offset we use the same test 7843 as for addis;addi. There may be a mix of 7844 pcrel and non-pcrel code and the decision 7845 to optimise is per symbol, not per TLS 7846 sequence. */ 7847 ok_tprel = value + 0x80008000ULL < 1ULL << 32; 7848 } 7849 } 7850 7851 r_type = ELF64_R_TYPE (rel->r_info); 7852 /* If this section has old-style __tls_get_addr calls 7853 without marker relocs, then check that each 7854 __tls_get_addr call reloc is preceded by a reloc 7855 that conceivably belongs to the __tls_get_addr arg 7856 setup insn. If we don't find matching arg setup 7857 relocs, don't do any tls optimization. */ 7858 if (pass == 0 7859 && sec->nomark_tls_get_addr 7860 && h != NULL 7861 && (h == &htab->tls_get_addr->elf 7862 || h == &htab->tls_get_addr_fd->elf) 7863 && !found_tls_get_addr_arg 7864 && is_branch_reloc (r_type)) 7865 { 7866 info->callbacks->minfo (_("%H __tls_get_addr lost arg, " 7867 "TLS optimization disabled\n"), 7868 ibfd, sec, rel->r_offset); 7869 ret = TRUE; 7870 goto err_free_rel; 7871 } 7872 7873 found_tls_get_addr_arg = 0; 7874 switch (r_type) 7875 { 7876 case R_PPC64_GOT_TLSLD16: 7877 case R_PPC64_GOT_TLSLD16_LO: 7878 case R_PPC64_GOT_TLSLD34: 7879 expecting_tls_get_addr = 1; 7880 found_tls_get_addr_arg = 1; 7881 /* Fall through. */ 7882 7883 case R_PPC64_GOT_TLSLD16_HI: 7884 case R_PPC64_GOT_TLSLD16_HA: 7885 /* These relocs should never be against a symbol 7886 defined in a shared lib. Leave them alone if 7887 that turns out to be the case. */ 7888 if (!is_local) 7889 continue; 7890 7891 /* LD -> LE */ 7892 tls_set = 0; 7893 tls_clear = TLS_LD; 7894 tls_type = TLS_TLS | TLS_LD; 7895 break; 7896 7897 case R_PPC64_GOT_TLSGD16: 7898 case R_PPC64_GOT_TLSGD16_LO: 7899 case R_PPC64_GOT_TLSGD34: 7900 expecting_tls_get_addr = 1; 7901 found_tls_get_addr_arg = 1; 7902 /* Fall through. */ 7903 7904 case R_PPC64_GOT_TLSGD16_HI: 7905 case R_PPC64_GOT_TLSGD16_HA: 7906 if (ok_tprel) 7907 /* GD -> LE */ 7908 tls_set = 0; 7909 else 7910 /* GD -> IE */ 7911 tls_set = TLS_TLS | TLS_GDIE; 7912 tls_clear = TLS_GD; 7913 tls_type = TLS_TLS | TLS_GD; 7914 break; 7915 7916 case R_PPC64_GOT_TPREL34: 7917 case R_PPC64_GOT_TPREL16_DS: 7918 case R_PPC64_GOT_TPREL16_LO_DS: 7919 case R_PPC64_GOT_TPREL16_HI: 7920 case R_PPC64_GOT_TPREL16_HA: 7921 if (ok_tprel) 7922 { 7923 /* IE -> LE */ 7924 tls_set = 0; 7925 tls_clear = TLS_TPREL; 7926 tls_type = TLS_TLS | TLS_TPREL; 7927 break; 7928 } 7929 continue; 7930 7931 case R_PPC64_TLSLD: 7932 if (!is_local) 7933 continue; 7934 /* Fall through. */ 7935 case R_PPC64_TLSGD: 7936 if (rel + 1 < relend 7937 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info))) 7938 { 7939 if (pass != 0 7940 && (ELF64_R_TYPE (rel[1].r_info) 7941 != R_PPC64_PLTSEQ) 7942 && (ELF64_R_TYPE (rel[1].r_info) 7943 != R_PPC64_PLTSEQ_NOTOC)) 7944 { 7945 r_symndx = ELF64_R_SYM (rel[1].r_info); 7946 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms, 7947 r_symndx, ibfd)) 7948 goto err_free_rel; 7949 if (h != NULL) 7950 { 7951 struct plt_entry *ent = NULL; 7952 7953 for (ent = h->plt.plist; 7954 ent != NULL; 7955 ent = ent->next) 7956 if (ent->addend == rel[1].r_addend) 7957 break; 7958 7959 if (ent != NULL 7960 && ent->plt.refcount > 0) 7961 ent->plt.refcount -= 1; 7962 } 7963 } 7964 continue; 7965 } 7966 found_tls_get_addr_arg = 1; 7967 /* Fall through. */ 7968 7969 case R_PPC64_TLS: 7970 case R_PPC64_TOC16: 7971 case R_PPC64_TOC16_LO: 7972 if (sym_sec == NULL || sym_sec != toc) 7973 continue; 7974 7975 /* Mark this toc entry as referenced by a TLS 7976 code sequence. We can do that now in the 7977 case of R_PPC64_TLS, and after checking for 7978 tls_get_addr for the TOC16 relocs. */ 7979 if (toc_ref == NULL) 7980 toc_ref 7981 = bfd_zmalloc (toc->output_section->rawsize / 8); 7982 if (toc_ref == NULL) 7983 goto err_free_rel; 7984 7985 if (h != NULL) 7986 value = h->root.u.def.value; 7987 else 7988 value = sym->st_value; 7989 value += rel->r_addend; 7990 if (value % 8 != 0) 7991 continue; 7992 BFD_ASSERT (value < toc->size 7993 && toc->output_offset % 8 == 0); 7994 toc_ref_index = (value + toc->output_offset) / 8; 7995 if (r_type == R_PPC64_TLS 7996 || r_type == R_PPC64_TLSGD 7997 || r_type == R_PPC64_TLSLD) 7998 { 7999 toc_ref[toc_ref_index] = 1; 8000 continue; 8001 } 8002 8003 if (pass != 0 && toc_ref[toc_ref_index] == 0) 8004 continue; 8005 8006 tls_set = 0; 8007 tls_clear = 0; 8008 expecting_tls_get_addr = 2; 8009 break; 8010 8011 case R_PPC64_TPREL64: 8012 if (pass == 0 8013 || sec != toc 8014 || toc_ref == NULL 8015 || !toc_ref[(rel->r_offset + toc->output_offset) / 8]) 8016 continue; 8017 if (ok_tprel) 8018 { 8019 /* IE -> LE */ 8020 tls_set = TLS_EXPLICIT; 8021 tls_clear = TLS_TPREL; 8022 break; 8023 } 8024 continue; 8025 8026 case R_PPC64_DTPMOD64: 8027 if (pass == 0 8028 || sec != toc 8029 || toc_ref == NULL 8030 || !toc_ref[(rel->r_offset + toc->output_offset) / 8]) 8031 continue; 8032 if (rel + 1 < relend 8033 && (rel[1].r_info 8034 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)) 8035 && rel[1].r_offset == rel->r_offset + 8) 8036 { 8037 if (ok_tprel) 8038 /* GD -> LE */ 8039 tls_set = TLS_EXPLICIT | TLS_GD; 8040 else 8041 /* GD -> IE */ 8042 tls_set = TLS_EXPLICIT | TLS_GD | TLS_GDIE; 8043 tls_clear = TLS_GD; 8044 } 8045 else 8046 { 8047 if (!is_local) 8048 continue; 8049 8050 /* LD -> LE */ 8051 tls_set = TLS_EXPLICIT; 8052 tls_clear = TLS_LD; 8053 } 8054 break; 8055 8056 default: 8057 continue; 8058 } 8059 8060 if (pass == 0) 8061 { 8062 if (!expecting_tls_get_addr 8063 || !sec->nomark_tls_get_addr) 8064 continue; 8065 8066 if (rel + 1 < relend 8067 && branch_reloc_hash_match (ibfd, rel + 1, 8068 htab->tls_get_addr, 8069 htab->tls_get_addr_fd)) 8070 { 8071 if (expecting_tls_get_addr == 2) 8072 { 8073 /* Check for toc tls entries. */ 8074 unsigned char *toc_tls; 8075 int retval; 8076 8077 retval = get_tls_mask (&toc_tls, NULL, NULL, 8078 &locsyms, 8079 rel, ibfd); 8080 if (retval == 0) 8081 goto err_free_rel; 8082 if (toc_tls != NULL) 8083 { 8084 if ((*toc_tls & TLS_TLS) != 0 8085 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0)) 8086 found_tls_get_addr_arg = 1; 8087 if (retval > 1) 8088 toc_ref[toc_ref_index] = 1; 8089 } 8090 } 8091 continue; 8092 } 8093 8094 /* Uh oh, we didn't find the expected call. We 8095 could just mark this symbol to exclude it 8096 from tls optimization but it's safer to skip 8097 the entire optimization. */ 8098 /* xgettext:c-format */ 8099 info->callbacks->minfo (_("%H arg lost __tls_get_addr, " 8100 "TLS optimization disabled\n"), 8101 ibfd, sec, rel->r_offset); 8102 ret = TRUE; 8103 goto err_free_rel; 8104 } 8105 8106 /* If we don't have old-style __tls_get_addr calls 8107 without TLSGD/TLSLD marker relocs, and we haven't 8108 found a new-style __tls_get_addr call with a 8109 marker for this symbol, then we either have a 8110 broken object file or an -mlongcall style 8111 indirect call to __tls_get_addr without a marker. 8112 Disable optimization in this case. */ 8113 if ((tls_clear & (TLS_GD | TLS_LD)) != 0 8114 && (tls_set & TLS_EXPLICIT) == 0 8115 && !sec->nomark_tls_get_addr 8116 && ((*tls_mask & (TLS_TLS | TLS_MARK)) 8117 != (TLS_TLS | TLS_MARK))) 8118 continue; 8119 8120 if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr) 8121 { 8122 struct plt_entry *ent = NULL; 8123 8124 if (htab->tls_get_addr != NULL) 8125 for (ent = htab->tls_get_addr->elf.plt.plist; 8126 ent != NULL; 8127 ent = ent->next) 8128 if (ent->addend == 0) 8129 break; 8130 8131 if (ent == NULL && htab->tls_get_addr_fd != NULL) 8132 for (ent = htab->tls_get_addr_fd->elf.plt.plist; 8133 ent != NULL; 8134 ent = ent->next) 8135 if (ent->addend == 0) 8136 break; 8137 8138 if (ent != NULL 8139 && ent->plt.refcount > 0) 8140 ent->plt.refcount -= 1; 8141 } 8142 8143 if (tls_clear == 0) 8144 continue; 8145 8146 if ((tls_set & TLS_EXPLICIT) == 0) 8147 { 8148 struct got_entry *ent; 8149 8150 /* Adjust got entry for this reloc. */ 8151 if (h != NULL) 8152 ent = h->got.glist; 8153 else 8154 ent = elf_local_got_ents (ibfd)[r_symndx]; 8155 8156 for (; ent != NULL; ent = ent->next) 8157 if (ent->addend == rel->r_addend 8158 && ent->owner == ibfd 8159 && ent->tls_type == tls_type) 8160 break; 8161 if (ent == NULL) 8162 abort (); 8163 8164 if (tls_set == 0) 8165 { 8166 /* We managed to get rid of a got entry. */ 8167 if (ent->got.refcount > 0) 8168 ent->got.refcount -= 1; 8169 } 8170 } 8171 else 8172 { 8173 /* If we got rid of a DTPMOD/DTPREL reloc pair then 8174 we'll lose one or two dyn relocs. */ 8175 if (!dec_dynrel_count (rel->r_info, sec, info, 8176 NULL, h, sym)) 8177 return FALSE; 8178 8179 if (tls_set == (TLS_EXPLICIT | TLS_GD)) 8180 { 8181 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info, 8182 NULL, h, sym)) 8183 return FALSE; 8184 } 8185 } 8186 8187 *tls_mask |= tls_set & 0xff; 8188 *tls_mask &= ~tls_clear; 8189 } 8190 8191 if (elf_section_data (sec)->relocs != relstart) 8192 free (relstart); 8193 } 8194 8195 if (locsyms != NULL 8196 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms)) 8197 { 8198 if (!info->keep_memory) 8199 free (locsyms); 8200 else 8201 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms; 8202 } 8203 } 8204 8205 if (toc_ref != NULL) 8206 free (toc_ref); 8207 htab->do_tls_opt = 1; 8208 return TRUE; 8209 } 8210 8211 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust 8212 the values of any global symbols in a toc section that has been 8213 edited. Globals in toc sections should be a rarity, so this function 8214 sets a flag if any are found in toc sections other than the one just 8215 edited, so that further hash table traversals can be avoided. */ 8216 8217 struct adjust_toc_info 8218 { 8219 asection *toc; 8220 unsigned long *skip; 8221 bfd_boolean global_toc_syms; 8222 }; 8223 8224 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 }; 8225 8226 static bfd_boolean 8227 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf) 8228 { 8229 struct ppc_link_hash_entry *eh; 8230 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf; 8231 unsigned long i; 8232 8233 if (h->root.type != bfd_link_hash_defined 8234 && h->root.type != bfd_link_hash_defweak) 8235 return TRUE; 8236 8237 eh = (struct ppc_link_hash_entry *) h; 8238 if (eh->adjust_done) 8239 return TRUE; 8240 8241 if (eh->elf.root.u.def.section == toc_inf->toc) 8242 { 8243 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize) 8244 i = toc_inf->toc->rawsize >> 3; 8245 else 8246 i = eh->elf.root.u.def.value >> 3; 8247 8248 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0) 8249 { 8250 _bfd_error_handler 8251 (_("%s defined on removed toc entry"), eh->elf.root.root.string); 8252 do 8253 ++i; 8254 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0); 8255 eh->elf.root.u.def.value = (bfd_vma) i << 3; 8256 } 8257 8258 eh->elf.root.u.def.value -= toc_inf->skip[i]; 8259 eh->adjust_done = 1; 8260 } 8261 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0) 8262 toc_inf->global_toc_syms = TRUE; 8263 8264 return TRUE; 8265 } 8266 8267 /* Return TRUE iff INSN with a relocation of R_TYPE is one we expect 8268 on a _LO variety toc/got reloc. */ 8269 8270 static bfd_boolean 8271 ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type) 8272 { 8273 return ((insn & (0x3fu << 26)) == 12u << 26 /* addic */ 8274 || (insn & (0x3fu << 26)) == 14u << 26 /* addi */ 8275 || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */ 8276 || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */ 8277 || (insn & (0x3fu << 26)) == 36u << 26 /* stw */ 8278 || (insn & (0x3fu << 26)) == 38u << 26 /* stb */ 8279 || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */ 8280 || (insn & (0x3fu << 26)) == 42u << 26 /* lha */ 8281 || (insn & (0x3fu << 26)) == 44u << 26 /* sth */ 8282 || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */ 8283 || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */ 8284 || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */ 8285 || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */ 8286 || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */ 8287 || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */ 8288 || (insn & (0x3fu << 26)) == 56u << 26 /* lq,lfq */ 8289 || ((insn & (0x3fu << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */ 8290 /* Exclude lfqu by testing reloc. If relocs are ever 8291 defined for the reduced D field in psq_lu then those 8292 will need testing too. */ 8293 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO) 8294 || ((insn & (0x3fu << 26)) == 58u << 26 /* ld,lwa */ 8295 && (insn & 1) == 0) 8296 || (insn & (0x3fu << 26)) == 60u << 26 /* stfq */ 8297 || ((insn & (0x3fu << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */ 8298 /* Exclude stfqu. psq_stu as above for psq_lu. */ 8299 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO) 8300 || ((insn & (0x3fu << 26)) == 62u << 26 /* std,stq */ 8301 && (insn & 1) == 0)); 8302 } 8303 8304 /* PCREL_OPT in one instance flags to the linker that a pair of insns: 8305 pld ra,symbol@got@pcrel 8306 load/store rt,off(ra) 8307 or 8308 pla ra,symbol@pcrel 8309 load/store rt,off(ra) 8310 may be translated to 8311 pload/pstore rt,symbol+off@pcrel 8312 nop. 8313 This function returns true if the optimization is possible, placing 8314 the prefix insn in *PINSN1, a NOP in *PINSN2 and the offset in *POFF. 8315 8316 On entry to this function, the linker has already determined that 8317 the pld can be replaced with pla: *PINSN1 is that pla insn, 8318 while *PINSN2 is the second instruction. */ 8319 8320 static bfd_boolean 8321 xlate_pcrel_opt (uint64_t *pinsn1, uint64_t *pinsn2, bfd_signed_vma *poff) 8322 { 8323 uint64_t insn1 = *pinsn1; 8324 uint64_t insn2 = *pinsn2; 8325 bfd_signed_vma off; 8326 8327 if ((insn2 & (63ULL << 58)) == 1ULL << 58) 8328 { 8329 /* Check that regs match. */ 8330 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31)) 8331 return FALSE; 8332 8333 /* P8LS or PMLS form, non-pcrel. */ 8334 if ((insn2 & (-1ULL << 50) & ~(1ULL << 56)) != (1ULL << 58)) 8335 return FALSE; 8336 8337 *pinsn1 = (insn2 & ~(31 << 16) & ~0x3ffff0000ffffULL) | (1ULL << 52); 8338 *pinsn2 = PNOP; 8339 off = ((insn2 >> 16) & 0x3ffff0000ULL) | (insn2 & 0xffff); 8340 *poff = (off ^ 0x200000000ULL) - 0x200000000ULL; 8341 return TRUE; 8342 } 8343 8344 insn2 >>= 32; 8345 8346 /* Check that regs match. */ 8347 if (((insn2 >> 16) & 31) != ((insn1 >> 21) & 31)) 8348 return FALSE; 8349 8350 switch ((insn2 >> 26) & 63) 8351 { 8352 default: 8353 return FALSE; 8354 8355 case 32: /* lwz */ 8356 case 34: /* lbz */ 8357 case 36: /* stw */ 8358 case 38: /* stb */ 8359 case 40: /* lhz */ 8360 case 42: /* lha */ 8361 case 44: /* sth */ 8362 case 48: /* lfs */ 8363 case 50: /* lfd */ 8364 case 52: /* stfs */ 8365 case 54: /* stfd */ 8366 /* These are the PMLS cases, where we just need to tack a prefix 8367 on the insn. */ 8368 insn1 = ((1ULL << 58) | (2ULL << 56) | (1ULL << 52) 8369 | (insn2 & ((63ULL << 26) | (31ULL << 21)))); 8370 off = insn2 & 0xffff; 8371 break; 8372 8373 case 58: /* lwa, ld */ 8374 if ((insn2 & 1) != 0) 8375 return FALSE; 8376 insn1 = ((1ULL << 58) | (1ULL << 52) 8377 | (insn2 & 2 ? 41ULL << 26 : 57ULL << 26) 8378 | (insn2 & (31ULL << 21))); 8379 off = insn2 & 0xfffc; 8380 break; 8381 8382 case 57: /* lxsd, lxssp */ 8383 if ((insn2 & 3) < 2) 8384 return FALSE; 8385 insn1 = ((1ULL << 58) | (1ULL << 52) 8386 | ((40ULL | (insn2 & 3)) << 26) 8387 | (insn2 & (31ULL << 21))); 8388 off = insn2 & 0xfffc; 8389 break; 8390 8391 case 61: /* stxsd, stxssp, lxv, stxv */ 8392 if ((insn2 & 3) == 0) 8393 return FALSE; 8394 else if ((insn2 & 3) >= 2) 8395 { 8396 insn1 = ((1ULL << 58) | (1ULL << 52) 8397 | ((44ULL | (insn2 & 3)) << 26) 8398 | (insn2 & (31ULL << 21))); 8399 off = insn2 & 0xfffc; 8400 } 8401 else 8402 { 8403 insn1 = ((1ULL << 58) | (1ULL << 52) 8404 | ((50ULL | (insn2 & 4) | ((insn2 & 8) >> 3)) << 26) 8405 | (insn2 & (31ULL << 21))); 8406 off = insn2 & 0xfff0; 8407 } 8408 break; 8409 8410 case 56: /* lq */ 8411 insn1 = ((1ULL << 58) | (1ULL << 52) 8412 | (insn2 & ((63ULL << 26) | (31ULL << 21)))); 8413 off = insn2 & 0xffff; 8414 break; 8415 8416 case 62: /* std, stq */ 8417 if ((insn2 & 1) != 0) 8418 return FALSE; 8419 insn1 = ((1ULL << 58) | (1ULL << 52) 8420 | ((insn2 & 2) == 0 ? 61ULL << 26 : 60ULL << 26) 8421 | (insn2 & (31ULL << 21))); 8422 off = insn2 & 0xfffc; 8423 break; 8424 } 8425 8426 *pinsn1 = insn1; 8427 *pinsn2 = (uint64_t) NOP << 32; 8428 *poff = (off ^ 0x8000) - 0x8000; 8429 return TRUE; 8430 } 8431 8432 /* Examine all relocs referencing .toc sections in order to remove 8433 unused .toc entries. */ 8434 8435 bfd_boolean 8436 ppc64_elf_edit_toc (struct bfd_link_info *info) 8437 { 8438 bfd *ibfd; 8439 struct adjust_toc_info toc_inf; 8440 struct ppc_link_hash_table *htab = ppc_hash_table (info); 8441 8442 htab->do_toc_opt = 1; 8443 toc_inf.global_toc_syms = TRUE; 8444 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 8445 { 8446 asection *toc, *sec; 8447 Elf_Internal_Shdr *symtab_hdr; 8448 Elf_Internal_Sym *local_syms; 8449 Elf_Internal_Rela *relstart, *rel, *toc_relocs; 8450 unsigned long *skip, *drop; 8451 unsigned char *used; 8452 unsigned char *keep, last, some_unused; 8453 8454 if (!is_ppc64_elf (ibfd)) 8455 continue; 8456 8457 toc = bfd_get_section_by_name (ibfd, ".toc"); 8458 if (toc == NULL 8459 || toc->size == 0 8460 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS 8461 || discarded_section (toc)) 8462 continue; 8463 8464 toc_relocs = NULL; 8465 local_syms = NULL; 8466 symtab_hdr = &elf_symtab_hdr (ibfd); 8467 8468 /* Look at sections dropped from the final link. */ 8469 skip = NULL; 8470 relstart = NULL; 8471 for (sec = ibfd->sections; sec != NULL; sec = sec->next) 8472 { 8473 if (sec->reloc_count == 0 8474 || !discarded_section (sec) 8475 || get_opd_info (sec) 8476 || (sec->flags & SEC_ALLOC) == 0 8477 || (sec->flags & SEC_DEBUGGING) != 0) 8478 continue; 8479 8480 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE); 8481 if (relstart == NULL) 8482 goto error_ret; 8483 8484 /* Run through the relocs to see which toc entries might be 8485 unused. */ 8486 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel) 8487 { 8488 enum elf_ppc64_reloc_type r_type; 8489 unsigned long r_symndx; 8490 asection *sym_sec; 8491 struct elf_link_hash_entry *h; 8492 Elf_Internal_Sym *sym; 8493 bfd_vma val; 8494 8495 r_type = ELF64_R_TYPE (rel->r_info); 8496 switch (r_type) 8497 { 8498 default: 8499 continue; 8500 8501 case R_PPC64_TOC16: 8502 case R_PPC64_TOC16_LO: 8503 case R_PPC64_TOC16_HI: 8504 case R_PPC64_TOC16_HA: 8505 case R_PPC64_TOC16_DS: 8506 case R_PPC64_TOC16_LO_DS: 8507 break; 8508 } 8509 8510 r_symndx = ELF64_R_SYM (rel->r_info); 8511 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 8512 r_symndx, ibfd)) 8513 goto error_ret; 8514 8515 if (sym_sec != toc) 8516 continue; 8517 8518 if (h != NULL) 8519 val = h->root.u.def.value; 8520 else 8521 val = sym->st_value; 8522 val += rel->r_addend; 8523 8524 if (val >= toc->size) 8525 continue; 8526 8527 /* Anything in the toc ought to be aligned to 8 bytes. 8528 If not, don't mark as unused. */ 8529 if (val & 7) 8530 continue; 8531 8532 if (skip == NULL) 8533 { 8534 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8); 8535 if (skip == NULL) 8536 goto error_ret; 8537 } 8538 8539 skip[val >> 3] = ref_from_discarded; 8540 } 8541 8542 if (elf_section_data (sec)->relocs != relstart) 8543 free (relstart); 8544 } 8545 8546 /* For largetoc loads of address constants, we can convert 8547 . addis rx,2,addr@got@ha 8548 . ld ry,addr@got@l(rx) 8549 to 8550 . addis rx,2,addr@toc@ha 8551 . addi ry,rx,addr@toc@l 8552 when addr is within 2G of the toc pointer. This then means 8553 that the word storing "addr" in the toc is no longer needed. */ 8554 8555 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc 8556 && toc->output_section->rawsize < (bfd_vma) 1 << 31 8557 && toc->reloc_count != 0) 8558 { 8559 /* Read toc relocs. */ 8560 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL, 8561 info->keep_memory); 8562 if (toc_relocs == NULL) 8563 goto error_ret; 8564 8565 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel) 8566 { 8567 enum elf_ppc64_reloc_type r_type; 8568 unsigned long r_symndx; 8569 asection *sym_sec; 8570 struct elf_link_hash_entry *h; 8571 Elf_Internal_Sym *sym; 8572 bfd_vma val, addr; 8573 8574 r_type = ELF64_R_TYPE (rel->r_info); 8575 if (r_type != R_PPC64_ADDR64) 8576 continue; 8577 8578 r_symndx = ELF64_R_SYM (rel->r_info); 8579 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 8580 r_symndx, ibfd)) 8581 goto error_ret; 8582 8583 if (sym_sec == NULL 8584 || sym_sec->output_section == NULL 8585 || discarded_section (sym_sec)) 8586 continue; 8587 8588 if (!SYMBOL_REFERENCES_LOCAL (info, h)) 8589 continue; 8590 8591 if (h != NULL) 8592 { 8593 if (h->type == STT_GNU_IFUNC) 8594 continue; 8595 val = h->root.u.def.value; 8596 } 8597 else 8598 { 8599 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 8600 continue; 8601 val = sym->st_value; 8602 } 8603 val += rel->r_addend; 8604 val += sym_sec->output_section->vma + sym_sec->output_offset; 8605 8606 /* We don't yet know the exact toc pointer value, but we 8607 know it will be somewhere in the toc section. Don't 8608 optimize if the difference from any possible toc 8609 pointer is outside [ff..f80008000, 7fff7fff]. */ 8610 addr = toc->output_section->vma + TOC_BASE_OFF; 8611 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32) 8612 continue; 8613 8614 addr = toc->output_section->vma + toc->output_section->rawsize; 8615 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32) 8616 continue; 8617 8618 if (skip == NULL) 8619 { 8620 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8); 8621 if (skip == NULL) 8622 goto error_ret; 8623 } 8624 8625 skip[rel->r_offset >> 3] 8626 |= can_optimize | ((rel - toc_relocs) << 2); 8627 } 8628 } 8629 8630 if (skip == NULL) 8631 continue; 8632 8633 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8); 8634 if (used == NULL) 8635 { 8636 error_ret: 8637 if (local_syms != NULL 8638 && symtab_hdr->contents != (unsigned char *) local_syms) 8639 free (local_syms); 8640 if (sec != NULL 8641 && relstart != NULL 8642 && elf_section_data (sec)->relocs != relstart) 8643 free (relstart); 8644 if (toc_relocs != NULL 8645 && elf_section_data (toc)->relocs != toc_relocs) 8646 free (toc_relocs); 8647 if (skip != NULL) 8648 free (skip); 8649 return FALSE; 8650 } 8651 8652 /* Now check all kept sections that might reference the toc. 8653 Check the toc itself last. */ 8654 for (sec = (ibfd->sections == toc && toc->next ? toc->next 8655 : ibfd->sections); 8656 sec != NULL; 8657 sec = (sec == toc ? NULL 8658 : sec->next == NULL ? toc 8659 : sec->next == toc && toc->next ? toc->next 8660 : sec->next)) 8661 { 8662 int repeat; 8663 8664 if (sec->reloc_count == 0 8665 || discarded_section (sec) 8666 || get_opd_info (sec) 8667 || (sec->flags & SEC_ALLOC) == 0 8668 || (sec->flags & SEC_DEBUGGING) != 0) 8669 continue; 8670 8671 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, 8672 info->keep_memory); 8673 if (relstart == NULL) 8674 { 8675 free (used); 8676 goto error_ret; 8677 } 8678 8679 /* Mark toc entries referenced as used. */ 8680 do 8681 { 8682 repeat = 0; 8683 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel) 8684 { 8685 enum elf_ppc64_reloc_type r_type; 8686 unsigned long r_symndx; 8687 asection *sym_sec; 8688 struct elf_link_hash_entry *h; 8689 Elf_Internal_Sym *sym; 8690 bfd_vma val; 8691 8692 r_type = ELF64_R_TYPE (rel->r_info); 8693 switch (r_type) 8694 { 8695 case R_PPC64_TOC16: 8696 case R_PPC64_TOC16_LO: 8697 case R_PPC64_TOC16_HI: 8698 case R_PPC64_TOC16_HA: 8699 case R_PPC64_TOC16_DS: 8700 case R_PPC64_TOC16_LO_DS: 8701 /* In case we're taking addresses of toc entries. */ 8702 case R_PPC64_ADDR64: 8703 break; 8704 8705 default: 8706 continue; 8707 } 8708 8709 r_symndx = ELF64_R_SYM (rel->r_info); 8710 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 8711 r_symndx, ibfd)) 8712 { 8713 free (used); 8714 goto error_ret; 8715 } 8716 8717 if (sym_sec != toc) 8718 continue; 8719 8720 if (h != NULL) 8721 val = h->root.u.def.value; 8722 else 8723 val = sym->st_value; 8724 val += rel->r_addend; 8725 8726 if (val >= toc->size) 8727 continue; 8728 8729 if ((skip[val >> 3] & can_optimize) != 0) 8730 { 8731 bfd_vma off; 8732 unsigned char opc; 8733 8734 switch (r_type) 8735 { 8736 case R_PPC64_TOC16_HA: 8737 break; 8738 8739 case R_PPC64_TOC16_LO_DS: 8740 off = rel->r_offset; 8741 off += (bfd_big_endian (ibfd) ? -2 : 3); 8742 if (!bfd_get_section_contents (ibfd, sec, &opc, 8743 off, 1)) 8744 { 8745 free (used); 8746 goto error_ret; 8747 } 8748 if ((opc & (0x3f << 2)) == (58u << 2)) 8749 break; 8750 /* Fall through. */ 8751 8752 default: 8753 /* Wrong sort of reloc, or not a ld. We may 8754 as well clear ref_from_discarded too. */ 8755 skip[val >> 3] = 0; 8756 } 8757 } 8758 8759 if (sec != toc) 8760 used[val >> 3] = 1; 8761 /* For the toc section, we only mark as used if this 8762 entry itself isn't unused. */ 8763 else if ((used[rel->r_offset >> 3] 8764 || !(skip[rel->r_offset >> 3] & ref_from_discarded)) 8765 && !used[val >> 3]) 8766 { 8767 /* Do all the relocs again, to catch reference 8768 chains. */ 8769 repeat = 1; 8770 used[val >> 3] = 1; 8771 } 8772 } 8773 } 8774 while (repeat); 8775 8776 if (elf_section_data (sec)->relocs != relstart) 8777 free (relstart); 8778 } 8779 8780 /* Merge the used and skip arrays. Assume that TOC 8781 doublewords not appearing as either used or unused belong 8782 to an entry more than one doubleword in size. */ 8783 for (drop = skip, keep = used, last = 0, some_unused = 0; 8784 drop < skip + (toc->size + 7) / 8; 8785 ++drop, ++keep) 8786 { 8787 if (*keep) 8788 { 8789 *drop &= ~ref_from_discarded; 8790 if ((*drop & can_optimize) != 0) 8791 some_unused = 1; 8792 last = 0; 8793 } 8794 else if ((*drop & ref_from_discarded) != 0) 8795 { 8796 some_unused = 1; 8797 last = ref_from_discarded; 8798 } 8799 else 8800 *drop = last; 8801 } 8802 8803 free (used); 8804 8805 if (some_unused) 8806 { 8807 bfd_byte *contents, *src; 8808 unsigned long off; 8809 Elf_Internal_Sym *sym; 8810 bfd_boolean local_toc_syms = FALSE; 8811 8812 /* Shuffle the toc contents, and at the same time convert the 8813 skip array from booleans into offsets. */ 8814 if (!bfd_malloc_and_get_section (ibfd, toc, &contents)) 8815 goto error_ret; 8816 8817 elf_section_data (toc)->this_hdr.contents = contents; 8818 8819 for (src = contents, off = 0, drop = skip; 8820 src < contents + toc->size; 8821 src += 8, ++drop) 8822 { 8823 if ((*drop & (can_optimize | ref_from_discarded)) != 0) 8824 off += 8; 8825 else if (off != 0) 8826 { 8827 *drop = off; 8828 memcpy (src - off, src, 8); 8829 } 8830 } 8831 *drop = off; 8832 toc->rawsize = toc->size; 8833 toc->size = src - contents - off; 8834 8835 /* Adjust addends for relocs against the toc section sym, 8836 and optimize any accesses we can. */ 8837 for (sec = ibfd->sections; sec != NULL; sec = sec->next) 8838 { 8839 if (sec->reloc_count == 0 8840 || discarded_section (sec)) 8841 continue; 8842 8843 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, 8844 info->keep_memory); 8845 if (relstart == NULL) 8846 goto error_ret; 8847 8848 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel) 8849 { 8850 enum elf_ppc64_reloc_type r_type; 8851 unsigned long r_symndx; 8852 asection *sym_sec; 8853 struct elf_link_hash_entry *h; 8854 bfd_vma val; 8855 8856 r_type = ELF64_R_TYPE (rel->r_info); 8857 switch (r_type) 8858 { 8859 default: 8860 continue; 8861 8862 case R_PPC64_TOC16: 8863 case R_PPC64_TOC16_LO: 8864 case R_PPC64_TOC16_HI: 8865 case R_PPC64_TOC16_HA: 8866 case R_PPC64_TOC16_DS: 8867 case R_PPC64_TOC16_LO_DS: 8868 case R_PPC64_ADDR64: 8869 break; 8870 } 8871 8872 r_symndx = ELF64_R_SYM (rel->r_info); 8873 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 8874 r_symndx, ibfd)) 8875 goto error_ret; 8876 8877 if (sym_sec != toc) 8878 continue; 8879 8880 if (h != NULL) 8881 val = h->root.u.def.value; 8882 else 8883 { 8884 val = sym->st_value; 8885 if (val != 0) 8886 local_toc_syms = TRUE; 8887 } 8888 8889 val += rel->r_addend; 8890 8891 if (val > toc->rawsize) 8892 val = toc->rawsize; 8893 else if ((skip[val >> 3] & ref_from_discarded) != 0) 8894 continue; 8895 else if ((skip[val >> 3] & can_optimize) != 0) 8896 { 8897 Elf_Internal_Rela *tocrel 8898 = toc_relocs + (skip[val >> 3] >> 2); 8899 unsigned long tsym = ELF64_R_SYM (tocrel->r_info); 8900 8901 switch (r_type) 8902 { 8903 case R_PPC64_TOC16_HA: 8904 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA); 8905 break; 8906 8907 case R_PPC64_TOC16_LO_DS: 8908 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT); 8909 break; 8910 8911 default: 8912 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 8913 ppc_howto_init (); 8914 info->callbacks->einfo 8915 /* xgettext:c-format */ 8916 (_("%H: %s references " 8917 "optimized away TOC entry\n"), 8918 ibfd, sec, rel->r_offset, 8919 ppc64_elf_howto_table[r_type]->name); 8920 bfd_set_error (bfd_error_bad_value); 8921 goto error_ret; 8922 } 8923 rel->r_addend = tocrel->r_addend; 8924 elf_section_data (sec)->relocs = relstart; 8925 continue; 8926 } 8927 8928 if (h != NULL || sym->st_value != 0) 8929 continue; 8930 8931 rel->r_addend -= skip[val >> 3]; 8932 elf_section_data (sec)->relocs = relstart; 8933 } 8934 8935 if (elf_section_data (sec)->relocs != relstart) 8936 free (relstart); 8937 } 8938 8939 /* We shouldn't have local or global symbols defined in the TOC, 8940 but handle them anyway. */ 8941 if (local_syms != NULL) 8942 for (sym = local_syms; 8943 sym < local_syms + symtab_hdr->sh_info; 8944 ++sym) 8945 if (sym->st_value != 0 8946 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc) 8947 { 8948 unsigned long i; 8949 8950 if (sym->st_value > toc->rawsize) 8951 i = toc->rawsize >> 3; 8952 else 8953 i = sym->st_value >> 3; 8954 8955 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0) 8956 { 8957 if (local_toc_syms) 8958 _bfd_error_handler 8959 (_("%s defined on removed toc entry"), 8960 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL)); 8961 do 8962 ++i; 8963 while ((skip[i] & (ref_from_discarded | can_optimize))); 8964 sym->st_value = (bfd_vma) i << 3; 8965 } 8966 8967 sym->st_value -= skip[i]; 8968 symtab_hdr->contents = (unsigned char *) local_syms; 8969 } 8970 8971 /* Adjust any global syms defined in this toc input section. */ 8972 if (toc_inf.global_toc_syms) 8973 { 8974 toc_inf.toc = toc; 8975 toc_inf.skip = skip; 8976 toc_inf.global_toc_syms = FALSE; 8977 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms, 8978 &toc_inf); 8979 } 8980 8981 if (toc->reloc_count != 0) 8982 { 8983 Elf_Internal_Shdr *rel_hdr; 8984 Elf_Internal_Rela *wrel; 8985 bfd_size_type sz; 8986 8987 /* Remove unused toc relocs, and adjust those we keep. */ 8988 if (toc_relocs == NULL) 8989 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL, 8990 info->keep_memory); 8991 if (toc_relocs == NULL) 8992 goto error_ret; 8993 8994 wrel = toc_relocs; 8995 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel) 8996 if ((skip[rel->r_offset >> 3] 8997 & (ref_from_discarded | can_optimize)) == 0) 8998 { 8999 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3]; 9000 wrel->r_info = rel->r_info; 9001 wrel->r_addend = rel->r_addend; 9002 ++wrel; 9003 } 9004 else if (!dec_dynrel_count (rel->r_info, toc, info, 9005 &local_syms, NULL, NULL)) 9006 goto error_ret; 9007 9008 elf_section_data (toc)->relocs = toc_relocs; 9009 toc->reloc_count = wrel - toc_relocs; 9010 rel_hdr = _bfd_elf_single_rel_hdr (toc); 9011 sz = rel_hdr->sh_entsize; 9012 rel_hdr->sh_size = toc->reloc_count * sz; 9013 } 9014 } 9015 else if (toc_relocs != NULL 9016 && elf_section_data (toc)->relocs != toc_relocs) 9017 free (toc_relocs); 9018 9019 if (local_syms != NULL 9020 && symtab_hdr->contents != (unsigned char *) local_syms) 9021 { 9022 if (!info->keep_memory) 9023 free (local_syms); 9024 else 9025 symtab_hdr->contents = (unsigned char *) local_syms; 9026 } 9027 free (skip); 9028 } 9029 9030 /* Look for cases where we can change an indirect GOT access to 9031 a GOT relative or PC relative access, possibly reducing the 9032 number of GOT entries. */ 9033 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 9034 { 9035 asection *sec; 9036 Elf_Internal_Shdr *symtab_hdr; 9037 Elf_Internal_Sym *local_syms; 9038 Elf_Internal_Rela *relstart, *rel; 9039 bfd_vma got; 9040 9041 if (!is_ppc64_elf (ibfd)) 9042 continue; 9043 9044 if (!ppc64_elf_tdata (ibfd)->has_optrel) 9045 continue; 9046 9047 sec = ppc64_elf_tdata (ibfd)->got; 9048 got = 0; 9049 if (sec != NULL) 9050 got = sec->output_section->vma + sec->output_offset + 0x8000; 9051 9052 local_syms = NULL; 9053 symtab_hdr = &elf_symtab_hdr (ibfd); 9054 9055 for (sec = ibfd->sections; sec != NULL; sec = sec->next) 9056 { 9057 if (sec->reloc_count == 0 9058 || !ppc64_elf_section_data (sec)->has_optrel 9059 || discarded_section (sec)) 9060 continue; 9061 9062 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, 9063 info->keep_memory); 9064 if (relstart == NULL) 9065 { 9066 got_error_ret: 9067 if (local_syms != NULL 9068 && symtab_hdr->contents != (unsigned char *) local_syms) 9069 free (local_syms); 9070 if (sec != NULL 9071 && relstart != NULL 9072 && elf_section_data (sec)->relocs != relstart) 9073 free (relstart); 9074 return FALSE; 9075 } 9076 9077 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel) 9078 { 9079 enum elf_ppc64_reloc_type r_type; 9080 unsigned long r_symndx; 9081 Elf_Internal_Sym *sym; 9082 asection *sym_sec; 9083 struct elf_link_hash_entry *h; 9084 struct got_entry *ent; 9085 bfd_vma val, pc; 9086 unsigned char buf[8]; 9087 unsigned int insn; 9088 enum {no_check, check_lo, check_ha} insn_check; 9089 9090 r_type = ELF64_R_TYPE (rel->r_info); 9091 switch (r_type) 9092 { 9093 default: 9094 insn_check = no_check; 9095 break; 9096 9097 case R_PPC64_PLT16_HA: 9098 case R_PPC64_GOT_TLSLD16_HA: 9099 case R_PPC64_GOT_TLSGD16_HA: 9100 case R_PPC64_GOT_TPREL16_HA: 9101 case R_PPC64_GOT_DTPREL16_HA: 9102 case R_PPC64_GOT16_HA: 9103 case R_PPC64_TOC16_HA: 9104 insn_check = check_ha; 9105 break; 9106 9107 case R_PPC64_PLT16_LO: 9108 case R_PPC64_PLT16_LO_DS: 9109 case R_PPC64_GOT_TLSLD16_LO: 9110 case R_PPC64_GOT_TLSGD16_LO: 9111 case R_PPC64_GOT_TPREL16_LO_DS: 9112 case R_PPC64_GOT_DTPREL16_LO_DS: 9113 case R_PPC64_GOT16_LO: 9114 case R_PPC64_GOT16_LO_DS: 9115 case R_PPC64_TOC16_LO: 9116 case R_PPC64_TOC16_LO_DS: 9117 insn_check = check_lo; 9118 break; 9119 } 9120 9121 if (insn_check != no_check) 9122 { 9123 bfd_vma off = rel->r_offset & ~3; 9124 9125 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4)) 9126 goto got_error_ret; 9127 9128 insn = bfd_get_32 (ibfd, buf); 9129 if (insn_check == check_lo 9130 ? !ok_lo_toc_insn (insn, r_type) 9131 : ((insn & ((0x3fu << 26) | 0x1f << 16)) 9132 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */)) 9133 { 9134 char str[12]; 9135 9136 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1; 9137 sprintf (str, "%#08x", insn); 9138 info->callbacks->einfo 9139 /* xgettext:c-format */ 9140 (_("%H: got/toc optimization is not supported for" 9141 " %s instruction\n"), 9142 ibfd, sec, rel->r_offset & ~3, str); 9143 continue; 9144 } 9145 } 9146 9147 switch (r_type) 9148 { 9149 /* Note that we don't delete GOT entries for 9150 R_PPC64_GOT16_DS since we'd need a lot more 9151 analysis. For starters, the preliminary layout is 9152 before the GOT, PLT, dynamic sections and stubs are 9153 laid out. Then we'd need to allow for changes in 9154 distance between sections caused by alignment. */ 9155 default: 9156 continue; 9157 9158 case R_PPC64_GOT16_HA: 9159 case R_PPC64_GOT16_LO_DS: 9160 case R_PPC64_GOT_PCREL34: 9161 break; 9162 } 9163 9164 r_symndx = ELF64_R_SYM (rel->r_info); 9165 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 9166 r_symndx, ibfd)) 9167 goto got_error_ret; 9168 9169 if (sym_sec == NULL 9170 || sym_sec->output_section == NULL 9171 || discarded_section (sym_sec)) 9172 continue; 9173 9174 if (!SYMBOL_REFERENCES_LOCAL (info, h)) 9175 continue; 9176 9177 if (h != NULL) 9178 val = h->root.u.def.value; 9179 else 9180 val = sym->st_value; 9181 val += rel->r_addend; 9182 val += sym_sec->output_section->vma + sym_sec->output_offset; 9183 9184 /* Fudge factor to allow for the fact that the preliminary layout 9185 isn't exact. Reduce limits by this factor. */ 9186 #define LIMIT_ADJUST(LIMIT) ((LIMIT) - (LIMIT) / 16) 9187 9188 switch (r_type) 9189 { 9190 default: 9191 continue; 9192 9193 case R_PPC64_GOT16_HA: 9194 if (val - got + LIMIT_ADJUST (0x80008000ULL) 9195 >= LIMIT_ADJUST (0x100000000ULL)) 9196 continue; 9197 9198 if (!bfd_get_section_contents (ibfd, sec, buf, 9199 rel->r_offset & ~3, 4)) 9200 goto got_error_ret; 9201 insn = bfd_get_32 (ibfd, buf); 9202 if (((insn & ((0x3fu << 26) | 0x1f << 16)) 9203 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */)) 9204 continue; 9205 break; 9206 9207 case R_PPC64_GOT16_LO_DS: 9208 if (val - got + LIMIT_ADJUST (0x80008000ULL) 9209 >= LIMIT_ADJUST (0x100000000ULL)) 9210 continue; 9211 if (!bfd_get_section_contents (ibfd, sec, buf, 9212 rel->r_offset & ~3, 4)) 9213 goto got_error_ret; 9214 insn = bfd_get_32 (ibfd, buf); 9215 if ((insn & (0x3fu << 26 | 0x3)) != 58u << 26 /* ld */) 9216 continue; 9217 break; 9218 9219 case R_PPC64_GOT_PCREL34: 9220 pc = rel->r_offset; 9221 pc += sec->output_section->vma + sec->output_offset; 9222 if (val - pc + LIMIT_ADJUST (1ULL << 33) 9223 >= LIMIT_ADJUST (1ULL << 34)) 9224 continue; 9225 if (!bfd_get_section_contents (ibfd, sec, buf, 9226 rel->r_offset & ~3, 8)) 9227 goto got_error_ret; 9228 insn = bfd_get_32 (ibfd, buf); 9229 if ((insn & (-1u << 18)) != ((1u << 26) | (1u << 20))) 9230 continue; 9231 insn = bfd_get_32 (ibfd, buf + 4); 9232 if ((insn & (0x3fu << 26)) != 57u << 26) 9233 continue; 9234 break; 9235 } 9236 #undef LIMIT_ADJUST 9237 9238 if (h != NULL) 9239 ent = h->got.glist; 9240 else 9241 { 9242 struct got_entry **local_got_ents = elf_local_got_ents (ibfd); 9243 ent = local_got_ents[r_symndx]; 9244 } 9245 for (; ent != NULL; ent = ent->next) 9246 if (ent->addend == rel->r_addend 9247 && ent->owner == ibfd 9248 && ent->tls_type == 0) 9249 break; 9250 BFD_ASSERT (ent && ent->got.refcount > 0); 9251 ent->got.refcount -= 1; 9252 } 9253 9254 if (elf_section_data (sec)->relocs != relstart) 9255 free (relstart); 9256 } 9257 9258 if (local_syms != NULL 9259 && symtab_hdr->contents != (unsigned char *) local_syms) 9260 { 9261 if (!info->keep_memory) 9262 free (local_syms); 9263 else 9264 symtab_hdr->contents = (unsigned char *) local_syms; 9265 } 9266 } 9267 9268 return TRUE; 9269 } 9270 9271 /* Return true iff input section I references the TOC using 9272 instructions limited to +/-32k offsets. */ 9273 9274 bfd_boolean 9275 ppc64_elf_has_small_toc_reloc (asection *i) 9276 { 9277 return (is_ppc64_elf (i->owner) 9278 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc); 9279 } 9280 9281 /* Allocate space for one GOT entry. */ 9282 9283 static void 9284 allocate_got (struct elf_link_hash_entry *h, 9285 struct bfd_link_info *info, 9286 struct got_entry *gent) 9287 { 9288 struct ppc_link_hash_table *htab = ppc_hash_table (info); 9289 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h; 9290 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD) 9291 ? 16 : 8); 9292 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD 9293 ? 2 : 1) * sizeof (Elf64_External_Rela); 9294 asection *got = ppc64_elf_tdata (gent->owner)->got; 9295 9296 gent->got.offset = got->size; 9297 got->size += entsize; 9298 9299 if (h->type == STT_GNU_IFUNC) 9300 { 9301 htab->elf.irelplt->size += rentsize; 9302 htab->got_reli_size += rentsize; 9303 } 9304 else if (((bfd_link_pic (info) 9305 && !(gent->tls_type != 0 9306 && bfd_link_executable (info) 9307 && SYMBOL_REFERENCES_LOCAL (info, h))) 9308 || (htab->elf.dynamic_sections_created 9309 && h->dynindx != -1 9310 && !SYMBOL_REFERENCES_LOCAL (info, h))) 9311 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) 9312 { 9313 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot; 9314 relgot->size += rentsize; 9315 } 9316 } 9317 9318 /* This function merges got entries in the same toc group. */ 9319 9320 static void 9321 merge_got_entries (struct got_entry **pent) 9322 { 9323 struct got_entry *ent, *ent2; 9324 9325 for (ent = *pent; ent != NULL; ent = ent->next) 9326 if (!ent->is_indirect) 9327 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next) 9328 if (!ent2->is_indirect 9329 && ent2->addend == ent->addend 9330 && ent2->tls_type == ent->tls_type 9331 && elf_gp (ent2->owner) == elf_gp (ent->owner)) 9332 { 9333 ent2->is_indirect = TRUE; 9334 ent2->got.ent = ent; 9335 } 9336 } 9337 9338 /* If H is undefined, make it dynamic if that makes sense. */ 9339 9340 static bfd_boolean 9341 ensure_undef_dynamic (struct bfd_link_info *info, 9342 struct elf_link_hash_entry *h) 9343 { 9344 struct elf_link_hash_table *htab = elf_hash_table (info); 9345 9346 if (htab->dynamic_sections_created 9347 && ((info->dynamic_undefined_weak != 0 9348 && h->root.type == bfd_link_hash_undefweak) 9349 || h->root.type == bfd_link_hash_undefined) 9350 && h->dynindx == -1 9351 && !h->forced_local 9352 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 9353 return bfd_elf_link_record_dynamic_symbol (info, h); 9354 return TRUE; 9355 } 9356 9357 /* Allocate space in .plt, .got and associated reloc sections for 9358 dynamic relocs. */ 9359 9360 static bfd_boolean 9361 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) 9362 { 9363 struct bfd_link_info *info; 9364 struct ppc_link_hash_table *htab; 9365 asection *s; 9366 struct ppc_link_hash_entry *eh; 9367 struct got_entry **pgent, *gent; 9368 9369 if (h->root.type == bfd_link_hash_indirect) 9370 return TRUE; 9371 9372 info = (struct bfd_link_info *) inf; 9373 htab = ppc_hash_table (info); 9374 if (htab == NULL) 9375 return FALSE; 9376 9377 eh = (struct ppc_link_hash_entry *) h; 9378 /* Run through the TLS GD got entries first if we're changing them 9379 to TPREL. */ 9380 if ((eh->tls_mask & (TLS_TLS | TLS_GDIE)) == (TLS_TLS | TLS_GDIE)) 9381 for (gent = h->got.glist; gent != NULL; gent = gent->next) 9382 if (gent->got.refcount > 0 9383 && (gent->tls_type & TLS_GD) != 0) 9384 { 9385 /* This was a GD entry that has been converted to TPREL. If 9386 there happens to be a TPREL entry we can use that one. */ 9387 struct got_entry *ent; 9388 for (ent = h->got.glist; ent != NULL; ent = ent->next) 9389 if (ent->got.refcount > 0 9390 && (ent->tls_type & TLS_TPREL) != 0 9391 && ent->addend == gent->addend 9392 && ent->owner == gent->owner) 9393 { 9394 gent->got.refcount = 0; 9395 break; 9396 } 9397 9398 /* If not, then we'll be using our own TPREL entry. */ 9399 if (gent->got.refcount != 0) 9400 gent->tls_type = TLS_TLS | TLS_TPREL; 9401 } 9402 9403 /* Remove any list entry that won't generate a word in the GOT before 9404 we call merge_got_entries. Otherwise we risk merging to empty 9405 entries. */ 9406 pgent = &h->got.glist; 9407 while ((gent = *pgent) != NULL) 9408 if (gent->got.refcount > 0) 9409 { 9410 if ((gent->tls_type & TLS_LD) != 0 9411 && SYMBOL_REFERENCES_LOCAL (info, h)) 9412 { 9413 ppc64_tlsld_got (gent->owner)->got.refcount += 1; 9414 *pgent = gent->next; 9415 } 9416 else 9417 pgent = &gent->next; 9418 } 9419 else 9420 *pgent = gent->next; 9421 9422 if (!htab->do_multi_toc) 9423 merge_got_entries (&h->got.glist); 9424 9425 for (gent = h->got.glist; gent != NULL; gent = gent->next) 9426 if (!gent->is_indirect) 9427 { 9428 /* Ensure we catch all the cases where this symbol should 9429 be made dynamic. */ 9430 if (!ensure_undef_dynamic (info, h)) 9431 return FALSE; 9432 9433 if (!is_ppc64_elf (gent->owner)) 9434 abort (); 9435 9436 allocate_got (h, info, gent); 9437 } 9438 9439 /* If no dynamic sections we can't have dynamic relocs, except for 9440 IFUNCs which are handled even in static executables. */ 9441 if (!htab->elf.dynamic_sections_created 9442 && h->type != STT_GNU_IFUNC) 9443 eh->dyn_relocs = NULL; 9444 9445 /* Discard relocs on undefined symbols that must be local. */ 9446 else if (h->root.type == bfd_link_hash_undefined 9447 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 9448 eh->dyn_relocs = NULL; 9449 9450 /* Also discard relocs on undefined weak syms with non-default 9451 visibility, or when dynamic_undefined_weak says so. */ 9452 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) 9453 eh->dyn_relocs = NULL; 9454 9455 if (eh->dyn_relocs != NULL) 9456 { 9457 struct elf_dyn_relocs *p, **pp; 9458 9459 /* In the shared -Bsymbolic case, discard space allocated for 9460 dynamic pc-relative relocs against symbols which turn out to 9461 be defined in regular objects. For the normal shared case, 9462 discard space for relocs that have become local due to symbol 9463 visibility changes. */ 9464 if (bfd_link_pic (info)) 9465 { 9466 /* Relocs that use pc_count are those that appear on a call 9467 insn, or certain REL relocs (see must_be_dyn_reloc) that 9468 can be generated via assembly. We want calls to 9469 protected symbols to resolve directly to the function 9470 rather than going via the plt. If people want function 9471 pointer comparisons to work as expected then they should 9472 avoid writing weird assembly. */ 9473 if (SYMBOL_CALLS_LOCAL (info, h)) 9474 { 9475 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 9476 { 9477 p->count -= p->pc_count; 9478 p->pc_count = 0; 9479 if (p->count == 0) 9480 *pp = p->next; 9481 else 9482 pp = &p->next; 9483 } 9484 } 9485 9486 if (eh->dyn_relocs != NULL) 9487 { 9488 /* Ensure we catch all the cases where this symbol 9489 should be made dynamic. */ 9490 if (!ensure_undef_dynamic (info, h)) 9491 return FALSE; 9492 } 9493 } 9494 9495 /* For a fixed position executable, discard space for 9496 relocs against symbols which are not dynamic. */ 9497 else if (h->type != STT_GNU_IFUNC) 9498 { 9499 if (h->dynamic_adjusted 9500 && !h->def_regular 9501 && !ELF_COMMON_DEF_P (h)) 9502 { 9503 /* Ensure we catch all the cases where this symbol 9504 should be made dynamic. */ 9505 if (!ensure_undef_dynamic (info, h)) 9506 return FALSE; 9507 9508 /* But if that didn't work out, discard dynamic relocs. */ 9509 if (h->dynindx == -1) 9510 eh->dyn_relocs = NULL; 9511 } 9512 else 9513 eh->dyn_relocs = NULL; 9514 } 9515 9516 /* Finally, allocate space. */ 9517 for (p = eh->dyn_relocs; p != NULL; p = p->next) 9518 { 9519 asection *sreloc = elf_section_data (p->sec)->sreloc; 9520 if (eh->elf.type == STT_GNU_IFUNC) 9521 sreloc = htab->elf.irelplt; 9522 sreloc->size += p->count * sizeof (Elf64_External_Rela); 9523 } 9524 } 9525 9526 /* We might need a PLT entry when the symbol 9527 a) is dynamic, or 9528 b) is an ifunc, or 9529 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or 9530 d) has plt16 relocs and we are linking statically. */ 9531 if ((htab->elf.dynamic_sections_created && h->dynindx != -1) 9532 || h->type == STT_GNU_IFUNC 9533 || (h->needs_plt && h->dynamic_adjusted) 9534 || (h->needs_plt 9535 && h->def_regular 9536 && !htab->elf.dynamic_sections_created 9537 && !htab->can_convert_all_inline_plt 9538 && (((struct ppc_link_hash_entry *) h)->tls_mask 9539 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP)) 9540 { 9541 struct plt_entry *pent; 9542 bfd_boolean doneone = FALSE; 9543 for (pent = h->plt.plist; pent != NULL; pent = pent->next) 9544 if (pent->plt.refcount > 0) 9545 { 9546 if (!htab->elf.dynamic_sections_created 9547 || h->dynindx == -1) 9548 { 9549 if (h->type == STT_GNU_IFUNC) 9550 { 9551 s = htab->elf.iplt; 9552 pent->plt.offset = s->size; 9553 s->size += PLT_ENTRY_SIZE (htab); 9554 s = htab->elf.irelplt; 9555 } 9556 else 9557 { 9558 s = htab->pltlocal; 9559 pent->plt.offset = s->size; 9560 s->size += LOCAL_PLT_ENTRY_SIZE (htab); 9561 s = bfd_link_pic (info) ? htab->relpltlocal : NULL; 9562 } 9563 } 9564 else 9565 { 9566 /* If this is the first .plt entry, make room for the special 9567 first entry. */ 9568 s = htab->elf.splt; 9569 if (s->size == 0) 9570 s->size += PLT_INITIAL_ENTRY_SIZE (htab); 9571 9572 pent->plt.offset = s->size; 9573 9574 /* Make room for this entry. */ 9575 s->size += PLT_ENTRY_SIZE (htab); 9576 9577 /* Make room for the .glink code. */ 9578 s = htab->glink; 9579 if (s->size == 0) 9580 s->size += GLINK_PLTRESOLVE_SIZE (htab); 9581 if (htab->opd_abi) 9582 { 9583 /* We need bigger stubs past index 32767. */ 9584 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4) 9585 s->size += 4; 9586 s->size += 2*4; 9587 } 9588 else 9589 s->size += 4; 9590 9591 /* We also need to make an entry in the .rela.plt section. */ 9592 s = htab->elf.srelplt; 9593 } 9594 if (s != NULL) 9595 s->size += sizeof (Elf64_External_Rela); 9596 doneone = TRUE; 9597 } 9598 else 9599 pent->plt.offset = (bfd_vma) -1; 9600 if (!doneone) 9601 { 9602 h->plt.plist = NULL; 9603 h->needs_plt = 0; 9604 } 9605 } 9606 else 9607 { 9608 h->plt.plist = NULL; 9609 h->needs_plt = 0; 9610 } 9611 9612 return TRUE; 9613 } 9614 9615 #define PPC_LO(v) ((v) & 0xffff) 9616 #define PPC_HI(v) (((v) >> 16) & 0xffff) 9617 #define PPC_HA(v) PPC_HI ((v) + 0x8000) 9618 #define D34(v) \ 9619 ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff)) 9620 #define HA34(v) ((v + (1ULL << 33)) >> 34) 9621 9622 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections 9623 to set up space for global entry stubs. These are put in glink, 9624 after the branch table. */ 9625 9626 static bfd_boolean 9627 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf) 9628 { 9629 struct bfd_link_info *info; 9630 struct ppc_link_hash_table *htab; 9631 struct plt_entry *pent; 9632 asection *s, *plt; 9633 9634 if (h->root.type == bfd_link_hash_indirect) 9635 return TRUE; 9636 9637 if (!h->pointer_equality_needed) 9638 return TRUE; 9639 9640 if (h->def_regular) 9641 return TRUE; 9642 9643 info = inf; 9644 htab = ppc_hash_table (info); 9645 if (htab == NULL) 9646 return FALSE; 9647 9648 s = htab->global_entry; 9649 plt = htab->elf.splt; 9650 for (pent = h->plt.plist; pent != NULL; pent = pent->next) 9651 if (pent->plt.offset != (bfd_vma) -1 9652 && pent->addend == 0) 9653 { 9654 /* For ELFv2, if this symbol is not defined in a regular file 9655 and we are not generating a shared library or pie, then we 9656 need to define the symbol in the executable on a call stub. 9657 This is to avoid text relocations. */ 9658 bfd_vma off, stub_align, stub_off, stub_size; 9659 unsigned int align_power; 9660 9661 stub_size = 16; 9662 stub_off = s->size; 9663 if (htab->params->plt_stub_align >= 0) 9664 align_power = htab->params->plt_stub_align; 9665 else 9666 align_power = -htab->params->plt_stub_align; 9667 /* Setting section alignment is delayed until we know it is 9668 non-empty. Otherwise the .text output section will be 9669 aligned at least to plt_stub_align even when no global 9670 entry stubs are needed. */ 9671 if (s->alignment_power < align_power) 9672 s->alignment_power = align_power; 9673 stub_align = (bfd_vma) 1 << align_power; 9674 if (htab->params->plt_stub_align >= 0 9675 || ((((stub_off + stub_size - 1) & -stub_align) 9676 - (stub_off & -stub_align)) 9677 > ((stub_size - 1) & -stub_align))) 9678 stub_off = (stub_off + stub_align - 1) & -stub_align; 9679 off = pent->plt.offset + plt->output_offset + plt->output_section->vma; 9680 off -= stub_off + s->output_offset + s->output_section->vma; 9681 /* Note that for --plt-stub-align negative we have a possible 9682 dependency between stub offset and size. Break that 9683 dependency by assuming the max stub size when calculating 9684 the stub offset. */ 9685 if (PPC_HA (off) == 0) 9686 stub_size -= 4; 9687 h->root.type = bfd_link_hash_defined; 9688 h->root.u.def.section = s; 9689 h->root.u.def.value = stub_off; 9690 s->size = stub_off + stub_size; 9691 break; 9692 } 9693 return TRUE; 9694 } 9695 9696 /* Set DF_TEXTREL if we find any dynamic relocs that apply to 9697 read-only sections. */ 9698 9699 static bfd_boolean 9700 maybe_set_textrel (struct elf_link_hash_entry *h, void *inf) 9701 { 9702 asection *sec; 9703 9704 if (h->root.type == bfd_link_hash_indirect) 9705 return TRUE; 9706 9707 sec = readonly_dynrelocs (h); 9708 if (sec != NULL) 9709 { 9710 struct bfd_link_info *info = (struct bfd_link_info *) inf; 9711 9712 info->flags |= DF_TEXTREL; 9713 info->callbacks->minfo (_("%pB: dynamic relocation against `%pT'" 9714 " in read-only section `%pA'\n"), 9715 sec->owner, h->root.root.string, sec); 9716 9717 /* Not an error, just cut short the traversal. */ 9718 return FALSE; 9719 } 9720 return TRUE; 9721 } 9722 9723 /* Set the sizes of the dynamic sections. */ 9724 9725 static bfd_boolean 9726 ppc64_elf_size_dynamic_sections (bfd *output_bfd, 9727 struct bfd_link_info *info) 9728 { 9729 struct ppc_link_hash_table *htab; 9730 bfd *dynobj; 9731 asection *s; 9732 bfd_boolean relocs; 9733 bfd *ibfd; 9734 struct got_entry *first_tlsld; 9735 9736 htab = ppc_hash_table (info); 9737 if (htab == NULL) 9738 return FALSE; 9739 9740 dynobj = htab->elf.dynobj; 9741 if (dynobj == NULL) 9742 abort (); 9743 9744 if (htab->elf.dynamic_sections_created) 9745 { 9746 /* Set the contents of the .interp section to the interpreter. */ 9747 if (bfd_link_executable (info) && !info->nointerp) 9748 { 9749 s = bfd_get_linker_section (dynobj, ".interp"); 9750 if (s == NULL) 9751 abort (); 9752 s->size = sizeof ELF_DYNAMIC_INTERPRETER; 9753 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 9754 } 9755 } 9756 9757 /* Set up .got offsets for local syms, and space for local dynamic 9758 relocs. */ 9759 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 9760 { 9761 struct got_entry **lgot_ents; 9762 struct got_entry **end_lgot_ents; 9763 struct plt_entry **local_plt; 9764 struct plt_entry **end_local_plt; 9765 unsigned char *lgot_masks; 9766 bfd_size_type locsymcount; 9767 Elf_Internal_Shdr *symtab_hdr; 9768 9769 if (!is_ppc64_elf (ibfd)) 9770 continue; 9771 9772 for (s = ibfd->sections; s != NULL; s = s->next) 9773 { 9774 struct ppc_dyn_relocs *p; 9775 9776 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) 9777 { 9778 if (!bfd_is_abs_section (p->sec) 9779 && bfd_is_abs_section (p->sec->output_section)) 9780 { 9781 /* Input section has been discarded, either because 9782 it is a copy of a linkonce section or due to 9783 linker script /DISCARD/, so we'll be discarding 9784 the relocs too. */ 9785 } 9786 else if (p->count != 0) 9787 { 9788 asection *srel = elf_section_data (p->sec)->sreloc; 9789 if (p->ifunc) 9790 srel = htab->elf.irelplt; 9791 srel->size += p->count * sizeof (Elf64_External_Rela); 9792 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 9793 { 9794 if (info->warn_shared_textrel) 9795 (*_bfd_error_handler) 9796 (_("warning: dynamic relocation in readonly section `%s'"), 9797 p->sec->output_section->name); 9798 info->flags |= DF_TEXTREL; 9799 } 9800 } 9801 } 9802 } 9803 9804 lgot_ents = elf_local_got_ents (ibfd); 9805 if (!lgot_ents) 9806 continue; 9807 9808 symtab_hdr = &elf_symtab_hdr (ibfd); 9809 locsymcount = symtab_hdr->sh_info; 9810 end_lgot_ents = lgot_ents + locsymcount; 9811 local_plt = (struct plt_entry **) end_lgot_ents; 9812 end_local_plt = local_plt + locsymcount; 9813 lgot_masks = (unsigned char *) end_local_plt; 9814 s = ppc64_elf_tdata (ibfd)->got; 9815 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks) 9816 { 9817 struct got_entry **pent, *ent; 9818 9819 pent = lgot_ents; 9820 while ((ent = *pent) != NULL) 9821 if (ent->got.refcount > 0) 9822 { 9823 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0) 9824 { 9825 ppc64_tlsld_got (ibfd)->got.refcount += 1; 9826 *pent = ent->next; 9827 } 9828 else 9829 { 9830 unsigned int ent_size = 8; 9831 unsigned int rel_size = sizeof (Elf64_External_Rela); 9832 9833 ent->got.offset = s->size; 9834 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0) 9835 { 9836 ent_size *= 2; 9837 rel_size *= 2; 9838 } 9839 s->size += ent_size; 9840 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC) 9841 { 9842 htab->elf.irelplt->size += rel_size; 9843 htab->got_reli_size += rel_size; 9844 } 9845 else if (bfd_link_pic (info) 9846 && !(ent->tls_type != 0 9847 && bfd_link_executable (info))) 9848 { 9849 asection *srel = ppc64_elf_tdata (ibfd)->relgot; 9850 srel->size += rel_size; 9851 } 9852 pent = &ent->next; 9853 } 9854 } 9855 else 9856 *pent = ent->next; 9857 } 9858 9859 /* Allocate space for plt calls to local syms. */ 9860 lgot_masks = (unsigned char *) end_local_plt; 9861 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks) 9862 { 9863 struct plt_entry *ent; 9864 9865 for (ent = *local_plt; ent != NULL; ent = ent->next) 9866 if (ent->plt.refcount > 0) 9867 { 9868 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC) 9869 { 9870 s = htab->elf.iplt; 9871 ent->plt.offset = s->size; 9872 s->size += PLT_ENTRY_SIZE (htab); 9873 htab->elf.irelplt->size += sizeof (Elf64_External_Rela); 9874 } 9875 else if (htab->can_convert_all_inline_plt 9876 || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP) 9877 ent->plt.offset = (bfd_vma) -1; 9878 else 9879 { 9880 s = htab->pltlocal; 9881 ent->plt.offset = s->size; 9882 s->size += LOCAL_PLT_ENTRY_SIZE (htab); 9883 if (bfd_link_pic (info)) 9884 htab->relpltlocal->size += sizeof (Elf64_External_Rela); 9885 } 9886 } 9887 else 9888 ent->plt.offset = (bfd_vma) -1; 9889 } 9890 } 9891 9892 /* Allocate global sym .plt and .got entries, and space for global 9893 sym dynamic relocs. */ 9894 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info); 9895 9896 if (!htab->opd_abi && !bfd_link_pic (info)) 9897 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info); 9898 9899 first_tlsld = NULL; 9900 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 9901 { 9902 struct got_entry *ent; 9903 9904 if (!is_ppc64_elf (ibfd)) 9905 continue; 9906 9907 ent = ppc64_tlsld_got (ibfd); 9908 if (ent->got.refcount > 0) 9909 { 9910 if (!htab->do_multi_toc && first_tlsld != NULL) 9911 { 9912 ent->is_indirect = TRUE; 9913 ent->got.ent = first_tlsld; 9914 } 9915 else 9916 { 9917 if (first_tlsld == NULL) 9918 first_tlsld = ent; 9919 s = ppc64_elf_tdata (ibfd)->got; 9920 ent->got.offset = s->size; 9921 ent->owner = ibfd; 9922 s->size += 16; 9923 if (bfd_link_dll (info)) 9924 { 9925 asection *srel = ppc64_elf_tdata (ibfd)->relgot; 9926 srel->size += sizeof (Elf64_External_Rela); 9927 } 9928 } 9929 } 9930 else 9931 ent->got.offset = (bfd_vma) -1; 9932 } 9933 9934 /* We now have determined the sizes of the various dynamic sections. 9935 Allocate memory for them. */ 9936 relocs = FALSE; 9937 for (s = dynobj->sections; s != NULL; s = s->next) 9938 { 9939 if ((s->flags & SEC_LINKER_CREATED) == 0) 9940 continue; 9941 9942 if (s == htab->brlt || s == htab->relbrlt) 9943 /* These haven't been allocated yet; don't strip. */ 9944 continue; 9945 else if (s == htab->elf.sgot 9946 || s == htab->elf.splt 9947 || s == htab->elf.iplt 9948 || s == htab->pltlocal 9949 || s == htab->glink 9950 || s == htab->global_entry 9951 || s == htab->elf.sdynbss 9952 || s == htab->elf.sdynrelro) 9953 { 9954 /* Strip this section if we don't need it; see the 9955 comment below. */ 9956 } 9957 else if (s == htab->glink_eh_frame) 9958 { 9959 if (!bfd_is_abs_section (s->output_section)) 9960 /* Not sized yet. */ 9961 continue; 9962 } 9963 else if (CONST_STRNEQ (s->name, ".rela")) 9964 { 9965 if (s->size != 0) 9966 { 9967 if (s != htab->elf.srelplt) 9968 relocs = TRUE; 9969 9970 /* We use the reloc_count field as a counter if we need 9971 to copy relocs into the output file. */ 9972 s->reloc_count = 0; 9973 } 9974 } 9975 else 9976 { 9977 /* It's not one of our sections, so don't allocate space. */ 9978 continue; 9979 } 9980 9981 if (s->size == 0) 9982 { 9983 /* If we don't need this section, strip it from the 9984 output file. This is mostly to handle .rela.bss and 9985 .rela.plt. We must create both sections in 9986 create_dynamic_sections, because they must be created 9987 before the linker maps input sections to output 9988 sections. The linker does that before 9989 adjust_dynamic_symbol is called, and it is that 9990 function which decides whether anything needs to go 9991 into these sections. */ 9992 s->flags |= SEC_EXCLUDE; 9993 continue; 9994 } 9995 9996 if (bfd_is_abs_section (s->output_section)) 9997 _bfd_error_handler (_("warning: discarding dynamic section %s"), 9998 s->name); 9999 10000 if ((s->flags & SEC_HAS_CONTENTS) == 0) 10001 continue; 10002 10003 /* Allocate memory for the section contents. We use bfd_zalloc 10004 here in case unused entries are not reclaimed before the 10005 section's contents are written out. This should not happen, 10006 but this way if it does we get a R_PPC64_NONE reloc in .rela 10007 sections instead of garbage. 10008 We also rely on the section contents being zero when writing 10009 the GOT and .dynrelro. */ 10010 s->contents = bfd_zalloc (dynobj, s->size); 10011 if (s->contents == NULL) 10012 return FALSE; 10013 } 10014 10015 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 10016 { 10017 if (!is_ppc64_elf (ibfd)) 10018 continue; 10019 10020 s = ppc64_elf_tdata (ibfd)->got; 10021 if (s != NULL && s != htab->elf.sgot) 10022 { 10023 if (s->size == 0) 10024 s->flags |= SEC_EXCLUDE; 10025 else 10026 { 10027 s->contents = bfd_zalloc (ibfd, s->size); 10028 if (s->contents == NULL) 10029 return FALSE; 10030 } 10031 } 10032 s = ppc64_elf_tdata (ibfd)->relgot; 10033 if (s != NULL) 10034 { 10035 if (s->size == 0) 10036 s->flags |= SEC_EXCLUDE; 10037 else 10038 { 10039 s->contents = bfd_zalloc (ibfd, s->size); 10040 if (s->contents == NULL) 10041 return FALSE; 10042 relocs = TRUE; 10043 s->reloc_count = 0; 10044 } 10045 } 10046 } 10047 10048 if (htab->elf.dynamic_sections_created) 10049 { 10050 bfd_boolean tls_opt; 10051 10052 /* Add some entries to the .dynamic section. We fill in the 10053 values later, in ppc64_elf_finish_dynamic_sections, but we 10054 must add the entries now so that we get the correct size for 10055 the .dynamic section. The DT_DEBUG entry is filled in by the 10056 dynamic linker and used by the debugger. */ 10057 #define add_dynamic_entry(TAG, VAL) \ 10058 _bfd_elf_add_dynamic_entry (info, TAG, VAL) 10059 10060 if (bfd_link_executable (info)) 10061 { 10062 if (!add_dynamic_entry (DT_DEBUG, 0)) 10063 return FALSE; 10064 } 10065 10066 if (htab->elf.splt != NULL && htab->elf.splt->size != 0) 10067 { 10068 if (!add_dynamic_entry (DT_PLTGOT, 0) 10069 || !add_dynamic_entry (DT_PLTRELSZ, 0) 10070 || !add_dynamic_entry (DT_PLTREL, DT_RELA) 10071 || !add_dynamic_entry (DT_JMPREL, 0) 10072 || !add_dynamic_entry (DT_PPC64_GLINK, 0)) 10073 return FALSE; 10074 } 10075 10076 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1) 10077 { 10078 if (!add_dynamic_entry (DT_PPC64_OPD, 0) 10079 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0)) 10080 return FALSE; 10081 } 10082 10083 tls_opt = (htab->params->tls_get_addr_opt 10084 && htab->tls_get_addr_fd != NULL 10085 && htab->tls_get_addr_fd->elf.plt.plist != NULL); 10086 if (tls_opt || !htab->opd_abi) 10087 { 10088 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0)) 10089 return FALSE; 10090 } 10091 10092 if (relocs) 10093 { 10094 if (!add_dynamic_entry (DT_RELA, 0) 10095 || !add_dynamic_entry (DT_RELASZ, 0) 10096 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela))) 10097 return FALSE; 10098 10099 /* If any dynamic relocs apply to a read-only section, 10100 then we need a DT_TEXTREL entry. */ 10101 if ((info->flags & DF_TEXTREL) == 0) 10102 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info); 10103 10104 if ((info->flags & DF_TEXTREL) != 0) 10105 { 10106 if (!add_dynamic_entry (DT_TEXTREL, 0)) 10107 return FALSE; 10108 } 10109 } 10110 } 10111 #undef add_dynamic_entry 10112 10113 return TRUE; 10114 } 10115 10116 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */ 10117 10118 static bfd_boolean 10119 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h) 10120 { 10121 if (h->plt.plist != NULL 10122 && !h->def_regular 10123 && !h->pointer_equality_needed) 10124 return FALSE; 10125 10126 return _bfd_elf_hash_symbol (h); 10127 } 10128 10129 /* Determine the type of stub needed, if any, for a call. */ 10130 10131 static inline enum ppc_stub_type 10132 ppc_type_of_stub (asection *input_sec, 10133 const Elf_Internal_Rela *rel, 10134 struct ppc_link_hash_entry **hash, 10135 struct plt_entry **plt_ent, 10136 bfd_vma destination, 10137 unsigned long local_off) 10138 { 10139 struct ppc_link_hash_entry *h = *hash; 10140 bfd_vma location; 10141 bfd_vma branch_offset; 10142 bfd_vma max_branch_offset; 10143 enum elf_ppc64_reloc_type r_type; 10144 10145 if (h != NULL) 10146 { 10147 struct plt_entry *ent; 10148 struct ppc_link_hash_entry *fdh = h; 10149 if (h->oh != NULL 10150 && h->oh->is_func_descriptor) 10151 { 10152 fdh = ppc_follow_link (h->oh); 10153 *hash = fdh; 10154 } 10155 10156 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next) 10157 if (ent->addend == rel->r_addend 10158 && ent->plt.offset != (bfd_vma) -1) 10159 { 10160 *plt_ent = ent; 10161 return ppc_stub_plt_call; 10162 } 10163 10164 /* Here, we know we don't have a plt entry. If we don't have a 10165 either a defined function descriptor or a defined entry symbol 10166 in a regular object file, then it is pointless trying to make 10167 any other type of stub. */ 10168 if (!is_static_defined (&fdh->elf) 10169 && !is_static_defined (&h->elf)) 10170 return ppc_stub_none; 10171 } 10172 else if (elf_local_got_ents (input_sec->owner) != NULL) 10173 { 10174 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner); 10175 struct plt_entry **local_plt = (struct plt_entry **) 10176 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info; 10177 unsigned long r_symndx = ELF64_R_SYM (rel->r_info); 10178 10179 if (local_plt[r_symndx] != NULL) 10180 { 10181 struct plt_entry *ent; 10182 10183 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next) 10184 if (ent->addend == rel->r_addend 10185 && ent->plt.offset != (bfd_vma) -1) 10186 { 10187 *plt_ent = ent; 10188 return ppc_stub_plt_call; 10189 } 10190 } 10191 } 10192 10193 /* Determine where the call point is. */ 10194 location = (input_sec->output_offset 10195 + input_sec->output_section->vma 10196 + rel->r_offset); 10197 10198 branch_offset = destination - location; 10199 r_type = ELF64_R_TYPE (rel->r_info); 10200 10201 /* Determine if a long branch stub is needed. */ 10202 max_branch_offset = 1 << 25; 10203 if (r_type == R_PPC64_REL14 10204 || r_type == R_PPC64_REL14_BRTAKEN 10205 || r_type == R_PPC64_REL14_BRNTAKEN) 10206 max_branch_offset = 1 << 15; 10207 10208 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off) 10209 /* We need a stub. Figure out whether a long_branch or plt_branch 10210 is needed later. */ 10211 return ppc_stub_long_branch; 10212 10213 return ppc_stub_none; 10214 } 10215 10216 /* Gets the address of a label (1:) in r11 and builds an offset in r12, 10217 then adds it to r11 (LOAD false) or loads r12 from r11+r12 (LOAD true). 10218 . mflr %r12 10219 . bcl 20,31,1f 10220 .1: mflr %r11 10221 . mtlr %r12 10222 . lis %r12,xxx-1b@highest 10223 . ori %r12,%r12,xxx-1b@higher 10224 . sldi %r12,%r12,32 10225 . oris %r12,%r12,xxx-1b@high 10226 . ori %r12,%r12,xxx-1b@l 10227 . add/ldx %r12,%r11,%r12 */ 10228 10229 static bfd_byte * 10230 build_offset (bfd *abfd, bfd_byte *p, bfd_vma off, bfd_boolean load) 10231 { 10232 bfd_put_32 (abfd, MFLR_R12, p); 10233 p += 4; 10234 bfd_put_32 (abfd, BCL_20_31, p); 10235 p += 4; 10236 bfd_put_32 (abfd, MFLR_R11, p); 10237 p += 4; 10238 bfd_put_32 (abfd, MTLR_R12, p); 10239 p += 4; 10240 if (off + 0x8000 < 0x10000) 10241 { 10242 if (load) 10243 bfd_put_32 (abfd, LD_R12_0R11 + PPC_LO (off), p); 10244 else 10245 bfd_put_32 (abfd, ADDI_R12_R11 + PPC_LO (off), p); 10246 p += 4; 10247 } 10248 else if (off + 0x80008000ULL < 0x100000000ULL) 10249 { 10250 bfd_put_32 (abfd, ADDIS_R12_R11 + PPC_HA (off), p); 10251 p += 4; 10252 if (load) 10253 bfd_put_32 (abfd, LD_R12_0R12 + PPC_LO (off), p); 10254 else 10255 bfd_put_32 (abfd, ADDI_R12_R12 + PPC_LO (off), p); 10256 p += 4; 10257 } 10258 else 10259 { 10260 if (off + 0x800000000000ULL < 0x1000000000000ULL) 10261 { 10262 bfd_put_32 (abfd, LI_R12_0 + ((off >> 32) & 0xffff), p); 10263 p += 4; 10264 } 10265 else 10266 { 10267 bfd_put_32 (abfd, LIS_R12 + ((off >> 48) & 0xffff), p); 10268 p += 4; 10269 if (((off >> 32) & 0xffff) != 0) 10270 { 10271 bfd_put_32 (abfd, ORI_R12_R12_0 + ((off >> 32) & 0xffff), p); 10272 p += 4; 10273 } 10274 } 10275 if (((off >> 32) & 0xffffffffULL) != 0) 10276 { 10277 bfd_put_32 (abfd, SLDI_R12_R12_32, p); 10278 p += 4; 10279 } 10280 if (PPC_HI (off) != 0) 10281 { 10282 bfd_put_32 (abfd, ORIS_R12_R12_0 + PPC_HI (off), p); 10283 p += 4; 10284 } 10285 if (PPC_LO (off) != 0) 10286 { 10287 bfd_put_32 (abfd, ORI_R12_R12_0 + PPC_LO (off), p); 10288 p += 4; 10289 } 10290 if (load) 10291 bfd_put_32 (abfd, LDX_R12_R11_R12, p); 10292 else 10293 bfd_put_32 (abfd, ADD_R12_R11_R12, p); 10294 p += 4; 10295 } 10296 return p; 10297 } 10298 10299 static unsigned int 10300 size_offset (bfd_vma off) 10301 { 10302 unsigned int size; 10303 if (off + 0x8000 < 0x10000) 10304 size = 4; 10305 else if (off + 0x80008000ULL < 0x100000000ULL) 10306 size = 8; 10307 else 10308 { 10309 if (off + 0x800000000000ULL < 0x1000000000000ULL) 10310 size = 4; 10311 else 10312 { 10313 size = 4; 10314 if (((off >> 32) & 0xffff) != 0) 10315 size += 4; 10316 } 10317 if (((off >> 32) & 0xffffffffULL) != 0) 10318 size += 4; 10319 if (PPC_HI (off) != 0) 10320 size += 4; 10321 if (PPC_LO (off) != 0) 10322 size += 4; 10323 size += 4; 10324 } 10325 return size + 16; 10326 } 10327 10328 static unsigned int 10329 num_relocs_for_offset (bfd_vma off) 10330 { 10331 unsigned int num_rel; 10332 if (off + 0x8000 < 0x10000) 10333 num_rel = 1; 10334 else if (off + 0x80008000ULL < 0x100000000ULL) 10335 num_rel = 2; 10336 else 10337 { 10338 num_rel = 1; 10339 if (off + 0x800000000000ULL >= 0x1000000000000ULL 10340 && ((off >> 32) & 0xffff) != 0) 10341 num_rel += 1; 10342 if (PPC_HI (off) != 0) 10343 num_rel += 1; 10344 if (PPC_LO (off) != 0) 10345 num_rel += 1; 10346 } 10347 return num_rel; 10348 } 10349 10350 static Elf_Internal_Rela * 10351 emit_relocs_for_offset (struct bfd_link_info *info, Elf_Internal_Rela *r, 10352 bfd_vma roff, bfd_vma targ, bfd_vma off) 10353 { 10354 bfd_vma relative_targ = targ - (roff - 8); 10355 if (bfd_big_endian (info->output_bfd)) 10356 roff += 2; 10357 r->r_offset = roff; 10358 r->r_addend = relative_targ + roff; 10359 if (off + 0x8000 < 0x10000) 10360 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16); 10361 else if (off + 0x80008000ULL < 0x100000000ULL) 10362 { 10363 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HA); 10364 ++r; 10365 roff += 4; 10366 r->r_offset = roff; 10367 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO); 10368 r->r_addend = relative_targ + roff; 10369 } 10370 else 10371 { 10372 if (off + 0x800000000000ULL < 0x1000000000000ULL) 10373 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER); 10374 else 10375 { 10376 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHEST); 10377 if (((off >> 32) & 0xffff) != 0) 10378 { 10379 ++r; 10380 roff += 4; 10381 r->r_offset = roff; 10382 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHER); 10383 r->r_addend = relative_targ + roff; 10384 } 10385 } 10386 if (((off >> 32) & 0xffffffffULL) != 0) 10387 roff += 4; 10388 if (PPC_HI (off) != 0) 10389 { 10390 ++r; 10391 roff += 4; 10392 r->r_offset = roff; 10393 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGH); 10394 r->r_addend = relative_targ + roff; 10395 } 10396 if (PPC_LO (off) != 0) 10397 { 10398 ++r; 10399 roff += 4; 10400 r->r_offset = roff; 10401 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_LO); 10402 r->r_addend = relative_targ + roff; 10403 } 10404 } 10405 return r; 10406 } 10407 10408 static bfd_byte * 10409 build_powerxx_offset (bfd *abfd, bfd_byte *p, bfd_vma off, int odd, 10410 bfd_boolean load) 10411 { 10412 uint64_t insn; 10413 if (off - odd + (1ULL << 33) < 1ULL << 34) 10414 { 10415 off -= odd; 10416 if (odd) 10417 { 10418 bfd_put_32 (abfd, NOP, p); 10419 p += 4; 10420 } 10421 if (load) 10422 insn = PLD_R12_PC; 10423 else 10424 insn = PADDI_R12_PC; 10425 insn |= D34 (off); 10426 bfd_put_32 (abfd, insn >> 32, p); 10427 p += 4; 10428 bfd_put_32 (abfd, insn, p); 10429 } 10430 /* The minimum value for paddi is -0x200000000. The minimum value 10431 for li is -0x8000, which when shifted by 34 and added gives a 10432 minimum value of -0x2000200000000. The maximum value is 10433 0x1ffffffff+0x7fff<<34 which is 0x2000200000000-1. */ 10434 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32) 10435 { 10436 off -= 8 - odd; 10437 bfd_put_32 (abfd, LI_R11_0 | (HA34 (off) & 0xffff), p); 10438 p += 4; 10439 if (!odd) 10440 { 10441 bfd_put_32 (abfd, SLDI_R11_R11_34, p); 10442 p += 4; 10443 } 10444 insn = PADDI_R12_PC | D34 (off); 10445 bfd_put_32 (abfd, insn >> 32, p); 10446 p += 4; 10447 bfd_put_32 (abfd, insn, p); 10448 p += 4; 10449 if (odd) 10450 { 10451 bfd_put_32 (abfd, SLDI_R11_R11_34, p); 10452 p += 4; 10453 } 10454 if (load) 10455 bfd_put_32 (abfd, LDX_R12_R11_R12, p); 10456 else 10457 bfd_put_32 (abfd, ADD_R12_R11_R12, p); 10458 } 10459 else 10460 { 10461 off -= odd + 8; 10462 bfd_put_32 (abfd, LIS_R11 | ((HA34 (off) >> 16) & 0x3fff), p); 10463 p += 4; 10464 bfd_put_32 (abfd, ORI_R11_R11_0 | (HA34 (off) & 0xffff), p); 10465 p += 4; 10466 if (odd) 10467 { 10468 bfd_put_32 (abfd, SLDI_R11_R11_34, p); 10469 p += 4; 10470 } 10471 insn = PADDI_R12_PC | D34 (off); 10472 bfd_put_32 (abfd, insn >> 32, p); 10473 p += 4; 10474 bfd_put_32 (abfd, insn, p); 10475 p += 4; 10476 if (!odd) 10477 { 10478 bfd_put_32 (abfd, SLDI_R11_R11_34, p); 10479 p += 4; 10480 } 10481 if (load) 10482 bfd_put_32 (abfd, LDX_R12_R11_R12, p); 10483 else 10484 bfd_put_32 (abfd, ADD_R12_R11_R12, p); 10485 } 10486 p += 4; 10487 return p; 10488 } 10489 10490 static unsigned int 10491 size_powerxx_offset (bfd_vma off, int odd) 10492 { 10493 if (off - odd + (1ULL << 33) < 1ULL << 34) 10494 return odd + 8; 10495 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32) 10496 return 20; 10497 else 10498 return 24; 10499 } 10500 10501 static unsigned int 10502 num_relocs_for_powerxx_offset (bfd_vma off, int odd) 10503 { 10504 if (off - odd + (1ULL << 33) < 1ULL << 34) 10505 return 1; 10506 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32) 10507 return 2; 10508 else 10509 return 3; 10510 } 10511 10512 static Elf_Internal_Rela * 10513 emit_relocs_for_powerxx_offset (struct bfd_link_info *info, 10514 Elf_Internal_Rela *r, bfd_vma roff, 10515 bfd_vma targ, bfd_vma off, int odd) 10516 { 10517 if (off - odd + (1ULL << 33) < 1ULL << 34) 10518 roff += odd; 10519 else if (off - (8 - odd) + (0x20002ULL << 32) < 0x40004ULL << 32) 10520 { 10521 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0; 10522 r->r_offset = roff + d_offset; 10523 r->r_addend = targ + 8 - odd - d_offset; 10524 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34); 10525 ++r; 10526 roff += 8 - odd; 10527 } 10528 else 10529 { 10530 int d_offset = bfd_big_endian (info->output_bfd) ? 2 : 0; 10531 r->r_offset = roff + d_offset; 10532 r->r_addend = targ + 8 + odd - d_offset; 10533 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHESTA34); 10534 ++r; 10535 roff += 4; 10536 r->r_offset = roff + d_offset; 10537 r->r_addend = targ + 4 + odd - d_offset; 10538 r->r_info = ELF64_R_INFO (0, R_PPC64_REL16_HIGHERA34); 10539 ++r; 10540 roff += 4 + odd; 10541 } 10542 r->r_offset = roff; 10543 r->r_addend = targ; 10544 r->r_info = ELF64_R_INFO (0, R_PPC64_PCREL34); 10545 return r; 10546 } 10547 10548 /* Emit .eh_frame opcode to advance pc by DELTA. */ 10549 10550 static bfd_byte * 10551 eh_advance (bfd *abfd, bfd_byte *eh, unsigned int delta) 10552 { 10553 delta /= 4; 10554 if (delta < 64) 10555 *eh++ = DW_CFA_advance_loc + delta; 10556 else if (delta < 256) 10557 { 10558 *eh++ = DW_CFA_advance_loc1; 10559 *eh++ = delta; 10560 } 10561 else if (delta < 65536) 10562 { 10563 *eh++ = DW_CFA_advance_loc2; 10564 bfd_put_16 (abfd, delta, eh); 10565 eh += 2; 10566 } 10567 else 10568 { 10569 *eh++ = DW_CFA_advance_loc4; 10570 bfd_put_32 (abfd, delta, eh); 10571 eh += 4; 10572 } 10573 return eh; 10574 } 10575 10576 /* Size of required .eh_frame opcode to advance pc by DELTA. */ 10577 10578 static unsigned int 10579 eh_advance_size (unsigned int delta) 10580 { 10581 if (delta < 64 * 4) 10582 /* DW_CFA_advance_loc+[1..63]. */ 10583 return 1; 10584 if (delta < 256 * 4) 10585 /* DW_CFA_advance_loc1, byte. */ 10586 return 2; 10587 if (delta < 65536 * 4) 10588 /* DW_CFA_advance_loc2, 2 bytes. */ 10589 return 3; 10590 /* DW_CFA_advance_loc4, 4 bytes. */ 10591 return 5; 10592 } 10593 10594 /* With power7 weakly ordered memory model, it is possible for ld.so 10595 to update a plt entry in one thread and have another thread see a 10596 stale zero toc entry. To avoid this we need some sort of acquire 10597 barrier in the call stub. One solution is to make the load of the 10598 toc word seem to appear to depend on the load of the function entry 10599 word. Another solution is to test for r2 being zero, and branch to 10600 the appropriate glink entry if so. 10601 10602 . fake dep barrier compare 10603 . ld 12,xxx(2) ld 12,xxx(2) 10604 . mtctr 12 mtctr 12 10605 . xor 11,12,12 ld 2,xxx+8(2) 10606 . add 2,2,11 cmpldi 2,0 10607 . ld 2,xxx+8(2) bnectr+ 10608 . bctr b <glink_entry> 10609 10610 The solution involving the compare turns out to be faster, so 10611 that's what we use unless the branch won't reach. */ 10612 10613 #define ALWAYS_USE_FAKE_DEP 0 10614 #define ALWAYS_EMIT_R2SAVE 0 10615 10616 static inline unsigned int 10617 plt_stub_size (struct ppc_link_hash_table *htab, 10618 struct ppc_stub_hash_entry *stub_entry, 10619 bfd_vma off) 10620 { 10621 unsigned size; 10622 10623 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc) 10624 { 10625 if (htab->powerxx_stubs) 10626 { 10627 bfd_vma start = (stub_entry->stub_offset 10628 + stub_entry->group->stub_sec->output_offset 10629 + stub_entry->group->stub_sec->output_section->vma); 10630 if (stub_entry->stub_type > ppc_stub_plt_call_notoc) 10631 start += 4; 10632 size = 8 + size_powerxx_offset (off, start & 4); 10633 } 10634 else 10635 size = 8 + size_offset (off - 8); 10636 if (stub_entry->stub_type > ppc_stub_plt_call_notoc) 10637 size += 4; 10638 return size; 10639 } 10640 10641 size = 12; 10642 if (ALWAYS_EMIT_R2SAVE 10643 || stub_entry->stub_type == ppc_stub_plt_call_r2save) 10644 size += 4; 10645 if (PPC_HA (off) != 0) 10646 size += 4; 10647 if (htab->opd_abi) 10648 { 10649 size += 4; 10650 if (htab->params->plt_static_chain) 10651 size += 4; 10652 if (htab->params->plt_thread_safe 10653 && htab->elf.dynamic_sections_created 10654 && stub_entry->h != NULL 10655 && stub_entry->h->elf.dynindx != -1) 10656 size += 8; 10657 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off)) 10658 size += 4; 10659 } 10660 if (stub_entry->h != NULL 10661 && (stub_entry->h == htab->tls_get_addr_fd 10662 || stub_entry->h == htab->tls_get_addr) 10663 && htab->params->tls_get_addr_opt) 10664 { 10665 size += 7 * 4; 10666 if (stub_entry->stub_type == ppc_stub_plt_call_r2save) 10667 size += 6 * 4; 10668 } 10669 return size; 10670 } 10671 10672 /* Depending on the sign of plt_stub_align: 10673 If positive, return the padding to align to a 2**plt_stub_align 10674 boundary. 10675 If negative, if this stub would cross fewer 2**plt_stub_align 10676 boundaries if we align, then return the padding needed to do so. */ 10677 10678 static inline unsigned int 10679 plt_stub_pad (struct ppc_link_hash_table *htab, 10680 struct ppc_stub_hash_entry *stub_entry, 10681 bfd_vma plt_off) 10682 { 10683 int stub_align; 10684 unsigned stub_size; 10685 bfd_vma stub_off = stub_entry->group->stub_sec->size; 10686 10687 if (htab->params->plt_stub_align >= 0) 10688 { 10689 stub_align = 1 << htab->params->plt_stub_align; 10690 if ((stub_off & (stub_align - 1)) != 0) 10691 return stub_align - (stub_off & (stub_align - 1)); 10692 return 0; 10693 } 10694 10695 stub_align = 1 << -htab->params->plt_stub_align; 10696 stub_size = plt_stub_size (htab, stub_entry, plt_off); 10697 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align) 10698 > ((stub_size - 1) & -stub_align)) 10699 return stub_align - (stub_off & (stub_align - 1)); 10700 return 0; 10701 } 10702 10703 /* Build a .plt call stub. */ 10704 10705 static inline bfd_byte * 10706 build_plt_stub (struct ppc_link_hash_table *htab, 10707 struct ppc_stub_hash_entry *stub_entry, 10708 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r) 10709 { 10710 bfd *obfd = htab->params->stub_bfd; 10711 bfd_boolean plt_load_toc = htab->opd_abi; 10712 bfd_boolean plt_static_chain = htab->params->plt_static_chain; 10713 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe 10714 && htab->elf.dynamic_sections_created 10715 && stub_entry->h != NULL 10716 && stub_entry->h->elf.dynindx != -1); 10717 bfd_boolean use_fake_dep = plt_thread_safe; 10718 bfd_vma cmp_branch_off = 0; 10719 10720 if (!ALWAYS_USE_FAKE_DEP 10721 && plt_load_toc 10722 && plt_thread_safe 10723 && !((stub_entry->h == htab->tls_get_addr_fd 10724 || stub_entry->h == htab->tls_get_addr) 10725 && htab->params->tls_get_addr_opt)) 10726 { 10727 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1; 10728 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab)) 10729 / PLT_ENTRY_SIZE (htab)); 10730 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8; 10731 bfd_vma to, from; 10732 10733 if (pltindex > 32768) 10734 glinkoff += (pltindex - 32768) * 4; 10735 to = (glinkoff 10736 + htab->glink->output_offset 10737 + htab->glink->output_section->vma); 10738 from = (p - stub_entry->group->stub_sec->contents 10739 + 4 * (ALWAYS_EMIT_R2SAVE 10740 || stub_entry->stub_type == ppc_stub_plt_call_r2save) 10741 + 4 * (PPC_HA (offset) != 0) 10742 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain) 10743 != PPC_HA (offset)) 10744 + 4 * (plt_static_chain != 0) 10745 + 20 10746 + stub_entry->group->stub_sec->output_offset 10747 + stub_entry->group->stub_sec->output_section->vma); 10748 cmp_branch_off = to - from; 10749 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26); 10750 } 10751 10752 if (PPC_HA (offset) != 0) 10753 { 10754 if (r != NULL) 10755 { 10756 if (ALWAYS_EMIT_R2SAVE 10757 || stub_entry->stub_type == ppc_stub_plt_call_r2save) 10758 r[0].r_offset += 4; 10759 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA); 10760 r[1].r_offset = r[0].r_offset + 4; 10761 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS); 10762 r[1].r_addend = r[0].r_addend; 10763 if (plt_load_toc) 10764 { 10765 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset)) 10766 { 10767 r[2].r_offset = r[1].r_offset + 4; 10768 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO); 10769 r[2].r_addend = r[0].r_addend; 10770 } 10771 else 10772 { 10773 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep; 10774 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS); 10775 r[2].r_addend = r[0].r_addend + 8; 10776 if (plt_static_chain) 10777 { 10778 r[3].r_offset = r[2].r_offset + 4; 10779 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS); 10780 r[3].r_addend = r[0].r_addend + 16; 10781 } 10782 } 10783 } 10784 } 10785 if (ALWAYS_EMIT_R2SAVE 10786 || stub_entry->stub_type == ppc_stub_plt_call_r2save) 10787 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4; 10788 if (plt_load_toc) 10789 { 10790 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4; 10791 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4; 10792 } 10793 else 10794 { 10795 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4; 10796 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4; 10797 } 10798 if (plt_load_toc 10799 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset)) 10800 { 10801 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4; 10802 offset = 0; 10803 } 10804 bfd_put_32 (obfd, MTCTR_R12, p), p += 4; 10805 if (plt_load_toc) 10806 { 10807 if (use_fake_dep) 10808 { 10809 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4; 10810 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4; 10811 } 10812 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4; 10813 if (plt_static_chain) 10814 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4; 10815 } 10816 } 10817 else 10818 { 10819 if (r != NULL) 10820 { 10821 if (ALWAYS_EMIT_R2SAVE 10822 || stub_entry->stub_type == ppc_stub_plt_call_r2save) 10823 r[0].r_offset += 4; 10824 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS); 10825 if (plt_load_toc) 10826 { 10827 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset)) 10828 { 10829 r[1].r_offset = r[0].r_offset + 4; 10830 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16); 10831 r[1].r_addend = r[0].r_addend; 10832 } 10833 else 10834 { 10835 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep; 10836 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS); 10837 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain; 10838 if (plt_static_chain) 10839 { 10840 r[2].r_offset = r[1].r_offset + 4; 10841 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS); 10842 r[2].r_addend = r[0].r_addend + 8; 10843 } 10844 } 10845 } 10846 } 10847 if (ALWAYS_EMIT_R2SAVE 10848 || stub_entry->stub_type == ppc_stub_plt_call_r2save) 10849 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4; 10850 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4; 10851 if (plt_load_toc 10852 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset)) 10853 { 10854 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4; 10855 offset = 0; 10856 } 10857 bfd_put_32 (obfd, MTCTR_R12, p), p += 4; 10858 if (plt_load_toc) 10859 { 10860 if (use_fake_dep) 10861 { 10862 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4; 10863 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4; 10864 } 10865 if (plt_static_chain) 10866 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4; 10867 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4; 10868 } 10869 } 10870 if (plt_load_toc && plt_thread_safe && !use_fake_dep) 10871 { 10872 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4; 10873 bfd_put_32 (obfd, BNECTR_P4, p), p += 4; 10874 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4; 10875 } 10876 else 10877 bfd_put_32 (obfd, BCTR, p), p += 4; 10878 return p; 10879 } 10880 10881 /* Build a special .plt call stub for __tls_get_addr. */ 10882 10883 #define LD_R11_0R3 0xe9630000 10884 #define LD_R12_0R3 0xe9830000 10885 #define MR_R0_R3 0x7c601b78 10886 #define CMPDI_R11_0 0x2c2b0000 10887 #define ADD_R3_R12_R13 0x7c6c6a14 10888 #define BEQLR 0x4d820020 10889 #define MR_R3_R0 0x7c030378 10890 #define STD_R11_0R1 0xf9610000 10891 #define BCTRL 0x4e800421 10892 #define LD_R11_0R1 0xe9610000 10893 #define MTLR_R11 0x7d6803a6 10894 10895 static inline bfd_byte * 10896 build_tls_get_addr_stub (struct ppc_link_hash_table *htab, 10897 struct ppc_stub_hash_entry *stub_entry, 10898 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r) 10899 { 10900 bfd *obfd = htab->params->stub_bfd; 10901 bfd_byte *loc = p; 10902 10903 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4; 10904 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4; 10905 bfd_put_32 (obfd, MR_R0_R3, p), p += 4; 10906 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4; 10907 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4; 10908 bfd_put_32 (obfd, BEQLR, p), p += 4; 10909 bfd_put_32 (obfd, MR_R3_R0, p), p += 4; 10910 if (r != NULL) 10911 r[0].r_offset += 7 * 4; 10912 if (stub_entry->stub_type != ppc_stub_plt_call_r2save) 10913 return build_plt_stub (htab, stub_entry, p, offset, r); 10914 10915 bfd_put_32 (obfd, MFLR_R11, p), p += 4; 10916 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4; 10917 10918 if (r != NULL) 10919 r[0].r_offset += 2 * 4; 10920 p = build_plt_stub (htab, stub_entry, p, offset, r); 10921 bfd_put_32 (obfd, BCTRL, p - 4); 10922 10923 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4; 10924 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4; 10925 bfd_put_32 (obfd, MTLR_R11, p), p += 4; 10926 bfd_put_32 (obfd, BLR, p), p += 4; 10927 10928 if (htab->glink_eh_frame != NULL 10929 && htab->glink_eh_frame->size != 0) 10930 { 10931 bfd_byte *base, *eh; 10932 unsigned int lr_used, delta; 10933 10934 base = htab->glink_eh_frame->contents + stub_entry->group->eh_base + 17; 10935 eh = base + stub_entry->group->eh_size; 10936 lr_used = stub_entry->stub_offset + (p - 20 - loc); 10937 delta = lr_used - stub_entry->group->lr_restore; 10938 stub_entry->group->lr_restore = lr_used + 16; 10939 eh = eh_advance (htab->elf.dynobj, eh, delta); 10940 *eh++ = DW_CFA_offset_extended_sf; 10941 *eh++ = 65; 10942 *eh++ = -(STK_LINKER (htab) / 8) & 0x7f; 10943 *eh++ = DW_CFA_advance_loc + 4; 10944 *eh++ = DW_CFA_restore_extended; 10945 *eh++ = 65; 10946 stub_entry->group->eh_size = eh - base; 10947 } 10948 return p; 10949 } 10950 10951 static Elf_Internal_Rela * 10952 get_relocs (asection *sec, int count) 10953 { 10954 Elf_Internal_Rela *relocs; 10955 struct bfd_elf_section_data *elfsec_data; 10956 10957 elfsec_data = elf_section_data (sec); 10958 relocs = elfsec_data->relocs; 10959 if (relocs == NULL) 10960 { 10961 bfd_size_type relsize; 10962 relsize = sec->reloc_count * sizeof (*relocs); 10963 relocs = bfd_alloc (sec->owner, relsize); 10964 if (relocs == NULL) 10965 return NULL; 10966 elfsec_data->relocs = relocs; 10967 elfsec_data->rela.hdr = bfd_zalloc (sec->owner, 10968 sizeof (Elf_Internal_Shdr)); 10969 if (elfsec_data->rela.hdr == NULL) 10970 return NULL; 10971 elfsec_data->rela.hdr->sh_size = (sec->reloc_count 10972 * sizeof (Elf64_External_Rela)); 10973 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela); 10974 sec->reloc_count = 0; 10975 } 10976 relocs += sec->reloc_count; 10977 sec->reloc_count += count; 10978 return relocs; 10979 } 10980 10981 /* Convert the relocs R[0] thru R[-NUM_REL+1], which are all no-symbol 10982 forms, to the equivalent relocs against the global symbol given by 10983 STUB_ENTRY->H. */ 10984 10985 static bfd_boolean 10986 use_global_in_relocs (struct ppc_link_hash_table *htab, 10987 struct ppc_stub_hash_entry *stub_entry, 10988 Elf_Internal_Rela *r, unsigned int num_rel) 10989 { 10990 struct elf_link_hash_entry **hashes; 10991 unsigned long symndx; 10992 struct ppc_link_hash_entry *h; 10993 bfd_vma symval; 10994 10995 /* Relocs are always against symbols in their own object file. Fake 10996 up global sym hashes for the stub bfd (which has no symbols). */ 10997 hashes = elf_sym_hashes (htab->params->stub_bfd); 10998 if (hashes == NULL) 10999 { 11000 bfd_size_type hsize; 11001 11002 /* When called the first time, stub_globals will contain the 11003 total number of symbols seen during stub sizing. After 11004 allocating, stub_globals is used as an index to fill the 11005 hashes array. */ 11006 hsize = (htab->stub_globals + 1) * sizeof (*hashes); 11007 hashes = bfd_zalloc (htab->params->stub_bfd, hsize); 11008 if (hashes == NULL) 11009 return FALSE; 11010 elf_sym_hashes (htab->params->stub_bfd) = hashes; 11011 htab->stub_globals = 1; 11012 } 11013 symndx = htab->stub_globals++; 11014 h = stub_entry->h; 11015 hashes[symndx] = &h->elf; 11016 if (h->oh != NULL && h->oh->is_func) 11017 h = ppc_follow_link (h->oh); 11018 BFD_ASSERT (h->elf.root.type == bfd_link_hash_defined 11019 || h->elf.root.type == bfd_link_hash_defweak); 11020 symval = (h->elf.root.u.def.value 11021 + h->elf.root.u.def.section->output_offset 11022 + h->elf.root.u.def.section->output_section->vma); 11023 while (num_rel-- != 0) 11024 { 11025 r->r_info = ELF64_R_INFO (symndx, ELF64_R_TYPE (r->r_info)); 11026 if (h->elf.root.u.def.section != stub_entry->target_section) 11027 { 11028 /* H is an opd symbol. The addend must be zero, and the 11029 branch reloc is the only one we can convert. */ 11030 r->r_addend = 0; 11031 break; 11032 } 11033 else 11034 r->r_addend -= symval; 11035 --r; 11036 } 11037 return TRUE; 11038 } 11039 11040 static bfd_vma 11041 get_r2off (struct bfd_link_info *info, 11042 struct ppc_stub_hash_entry *stub_entry) 11043 { 11044 struct ppc_link_hash_table *htab = ppc_hash_table (info); 11045 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off; 11046 11047 if (r2off == 0) 11048 { 11049 /* Support linking -R objects. Get the toc pointer from the 11050 opd entry. */ 11051 char buf[8]; 11052 if (!htab->opd_abi) 11053 return r2off; 11054 asection *opd = stub_entry->h->elf.root.u.def.section; 11055 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value; 11056 11057 if (strcmp (opd->name, ".opd") != 0 11058 || opd->reloc_count != 0) 11059 { 11060 info->callbacks->einfo 11061 (_("%P: cannot find opd entry toc for `%pT'\n"), 11062 stub_entry->h->elf.root.root.string); 11063 bfd_set_error (bfd_error_bad_value); 11064 return (bfd_vma) -1; 11065 } 11066 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8)) 11067 return (bfd_vma) -1; 11068 r2off = bfd_get_64 (opd->owner, buf); 11069 r2off -= elf_gp (info->output_bfd); 11070 } 11071 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off; 11072 return r2off; 11073 } 11074 11075 static bfd_boolean 11076 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) 11077 { 11078 struct ppc_stub_hash_entry *stub_entry; 11079 struct ppc_branch_hash_entry *br_entry; 11080 struct bfd_link_info *info; 11081 struct ppc_link_hash_table *htab; 11082 bfd_byte *loc; 11083 bfd_byte *p, *relp; 11084 bfd_vma targ, off; 11085 Elf_Internal_Rela *r; 11086 asection *plt; 11087 int num_rel; 11088 int odd; 11089 11090 /* Massage our args to the form they really have. */ 11091 stub_entry = (struct ppc_stub_hash_entry *) gen_entry; 11092 info = in_arg; 11093 11094 htab = ppc_hash_table (info); 11095 if (htab == NULL) 11096 return FALSE; 11097 11098 BFD_ASSERT (stub_entry->stub_offset >= stub_entry->group->stub_sec->size); 11099 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset; 11100 11101 htab->stub_count[stub_entry->stub_type - 1] += 1; 11102 switch (stub_entry->stub_type) 11103 { 11104 case ppc_stub_long_branch: 11105 case ppc_stub_long_branch_r2off: 11106 /* Branches are relative. This is where we are going to. */ 11107 targ = (stub_entry->target_value 11108 + stub_entry->target_section->output_offset 11109 + stub_entry->target_section->output_section->vma); 11110 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other); 11111 11112 /* And this is where we are coming from. */ 11113 off = (stub_entry->stub_offset 11114 + stub_entry->group->stub_sec->output_offset 11115 + stub_entry->group->stub_sec->output_section->vma); 11116 off = targ - off; 11117 11118 p = loc; 11119 if (stub_entry->stub_type == ppc_stub_long_branch_r2off) 11120 { 11121 bfd_vma r2off = get_r2off (info, stub_entry); 11122 11123 if (r2off == (bfd_vma) -1) 11124 { 11125 htab->stub_error = TRUE; 11126 return FALSE; 11127 } 11128 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p); 11129 p += 4; 11130 if (PPC_HA (r2off) != 0) 11131 { 11132 bfd_put_32 (htab->params->stub_bfd, 11133 ADDIS_R2_R2 | PPC_HA (r2off), p); 11134 p += 4; 11135 } 11136 if (PPC_LO (r2off) != 0) 11137 { 11138 bfd_put_32 (htab->params->stub_bfd, 11139 ADDI_R2_R2 | PPC_LO (r2off), p); 11140 p += 4; 11141 } 11142 off -= p - loc; 11143 } 11144 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p); 11145 p += 4; 11146 11147 if (off + (1 << 25) >= (bfd_vma) (1 << 26)) 11148 { 11149 _bfd_error_handler 11150 (_("long branch stub `%s' offset overflow"), 11151 stub_entry->root.string); 11152 htab->stub_error = TRUE; 11153 return FALSE; 11154 } 11155 11156 if (info->emitrelocations) 11157 { 11158 r = get_relocs (stub_entry->group->stub_sec, 1); 11159 if (r == NULL) 11160 return FALSE; 11161 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents; 11162 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24); 11163 r->r_addend = targ; 11164 if (stub_entry->h != NULL 11165 && !use_global_in_relocs (htab, stub_entry, r, 1)) 11166 return FALSE; 11167 } 11168 break; 11169 11170 case ppc_stub_plt_branch: 11171 case ppc_stub_plt_branch_r2off: 11172 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table, 11173 stub_entry->root.string + 9, 11174 FALSE, FALSE); 11175 if (br_entry == NULL) 11176 { 11177 _bfd_error_handler (_("can't find branch stub `%s'"), 11178 stub_entry->root.string); 11179 htab->stub_error = TRUE; 11180 return FALSE; 11181 } 11182 11183 targ = (stub_entry->target_value 11184 + stub_entry->target_section->output_offset 11185 + stub_entry->target_section->output_section->vma); 11186 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off) 11187 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other); 11188 11189 bfd_put_64 (htab->brlt->owner, targ, 11190 htab->brlt->contents + br_entry->offset); 11191 11192 if (br_entry->iter == htab->stub_iteration) 11193 { 11194 br_entry->iter = 0; 11195 11196 if (htab->relbrlt != NULL) 11197 { 11198 /* Create a reloc for the branch lookup table entry. */ 11199 Elf_Internal_Rela rela; 11200 bfd_byte *rl; 11201 11202 rela.r_offset = (br_entry->offset 11203 + htab->brlt->output_offset 11204 + htab->brlt->output_section->vma); 11205 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 11206 rela.r_addend = targ; 11207 11208 rl = htab->relbrlt->contents; 11209 rl += (htab->relbrlt->reloc_count++ 11210 * sizeof (Elf64_External_Rela)); 11211 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl); 11212 } 11213 else if (info->emitrelocations) 11214 { 11215 r = get_relocs (htab->brlt, 1); 11216 if (r == NULL) 11217 return FALSE; 11218 /* brlt, being SEC_LINKER_CREATED does not go through the 11219 normal reloc processing. Symbols and offsets are not 11220 translated from input file to output file form, so 11221 set up the offset per the output file. */ 11222 r->r_offset = (br_entry->offset 11223 + htab->brlt->output_offset 11224 + htab->brlt->output_section->vma); 11225 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 11226 r->r_addend = targ; 11227 } 11228 } 11229 11230 targ = (br_entry->offset 11231 + htab->brlt->output_offset 11232 + htab->brlt->output_section->vma); 11233 11234 off = (elf_gp (info->output_bfd) 11235 + htab->sec_info[stub_entry->group->link_sec->id].toc_off); 11236 off = targ - off; 11237 11238 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0) 11239 { 11240 info->callbacks->einfo 11241 (_("%P: linkage table error against `%pT'\n"), 11242 stub_entry->root.string); 11243 bfd_set_error (bfd_error_bad_value); 11244 htab->stub_error = TRUE; 11245 return FALSE; 11246 } 11247 11248 if (info->emitrelocations) 11249 { 11250 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0)); 11251 if (r == NULL) 11252 return FALSE; 11253 r[0].r_offset = loc - stub_entry->group->stub_sec->contents; 11254 if (bfd_big_endian (info->output_bfd)) 11255 r[0].r_offset += 2; 11256 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off) 11257 r[0].r_offset += 4; 11258 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS); 11259 r[0].r_addend = targ; 11260 if (PPC_HA (off) != 0) 11261 { 11262 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA); 11263 r[1].r_offset = r[0].r_offset + 4; 11264 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS); 11265 r[1].r_addend = r[0].r_addend; 11266 } 11267 } 11268 11269 p = loc; 11270 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off) 11271 { 11272 if (PPC_HA (off) != 0) 11273 { 11274 bfd_put_32 (htab->params->stub_bfd, 11275 ADDIS_R12_R2 | PPC_HA (off), p); 11276 p += 4; 11277 bfd_put_32 (htab->params->stub_bfd, 11278 LD_R12_0R12 | PPC_LO (off), p); 11279 } 11280 else 11281 bfd_put_32 (htab->params->stub_bfd, 11282 LD_R12_0R2 | PPC_LO (off), p); 11283 } 11284 else 11285 { 11286 bfd_vma r2off = get_r2off (info, stub_entry); 11287 11288 if (r2off == (bfd_vma) -1) 11289 { 11290 htab->stub_error = TRUE; 11291 return FALSE; 11292 } 11293 11294 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p); 11295 p += 4; 11296 if (PPC_HA (off) != 0) 11297 { 11298 bfd_put_32 (htab->params->stub_bfd, 11299 ADDIS_R12_R2 | PPC_HA (off), p); 11300 p += 4; 11301 bfd_put_32 (htab->params->stub_bfd, 11302 LD_R12_0R12 | PPC_LO (off), p); 11303 } 11304 else 11305 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p); 11306 11307 if (PPC_HA (r2off) != 0) 11308 { 11309 p += 4; 11310 bfd_put_32 (htab->params->stub_bfd, 11311 ADDIS_R2_R2 | PPC_HA (r2off), p); 11312 } 11313 if (PPC_LO (r2off) != 0) 11314 { 11315 p += 4; 11316 bfd_put_32 (htab->params->stub_bfd, 11317 ADDI_R2_R2 | PPC_LO (r2off), p); 11318 } 11319 } 11320 p += 4; 11321 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p); 11322 p += 4; 11323 bfd_put_32 (htab->params->stub_bfd, BCTR, p); 11324 p += 4; 11325 break; 11326 11327 case ppc_stub_long_branch_notoc: 11328 case ppc_stub_long_branch_both: 11329 case ppc_stub_plt_branch_notoc: 11330 case ppc_stub_plt_branch_both: 11331 case ppc_stub_plt_call_notoc: 11332 case ppc_stub_plt_call_both: 11333 p = loc; 11334 off = (stub_entry->stub_offset 11335 + stub_entry->group->stub_sec->output_offset 11336 + stub_entry->group->stub_sec->output_section->vma); 11337 if (stub_entry->stub_type == ppc_stub_long_branch_both 11338 || stub_entry->stub_type == ppc_stub_plt_branch_both 11339 || stub_entry->stub_type == ppc_stub_plt_call_both) 11340 { 11341 off += 4; 11342 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p); 11343 p += 4; 11344 } 11345 if (stub_entry->stub_type >= ppc_stub_plt_call_notoc) 11346 { 11347 targ = stub_entry->plt_ent->plt.offset & ~1; 11348 if (targ >= (bfd_vma) -2) 11349 abort (); 11350 11351 plt = htab->elf.splt; 11352 if (!htab->elf.dynamic_sections_created 11353 || stub_entry->h == NULL 11354 || stub_entry->h->elf.dynindx == -1) 11355 { 11356 if (stub_entry->symtype == STT_GNU_IFUNC) 11357 plt = htab->elf.iplt; 11358 else 11359 plt = htab->pltlocal; 11360 } 11361 targ += plt->output_offset + plt->output_section->vma; 11362 } 11363 else 11364 targ = (stub_entry->target_value 11365 + stub_entry->target_section->output_offset 11366 + stub_entry->target_section->output_section->vma); 11367 odd = off & 4; 11368 off = targ - off; 11369 11370 relp = p; 11371 num_rel = 0; 11372 if (htab->powerxx_stubs) 11373 { 11374 bfd_boolean load = stub_entry->stub_type >= ppc_stub_plt_call_notoc; 11375 p = build_powerxx_offset (htab->params->stub_bfd, p, off, odd, load); 11376 } 11377 else 11378 { 11379 /* The notoc stubs calculate their target (either a PLT entry or 11380 the global entry point of a function) relative to the PC 11381 returned by the "bcl" two instructions past the start of the 11382 sequence emitted by build_offset. The offset is therefore 8 11383 less than calculated from the start of the sequence. */ 11384 off -= 8; 11385 p = build_offset (htab->params->stub_bfd, p, off, 11386 stub_entry->stub_type >= ppc_stub_plt_call_notoc); 11387 } 11388 11389 if (stub_entry->stub_type <= ppc_stub_long_branch_both) 11390 { 11391 bfd_vma from; 11392 num_rel = 1; 11393 from = (stub_entry->stub_offset 11394 + stub_entry->group->stub_sec->output_offset 11395 + stub_entry->group->stub_sec->output_section->vma 11396 + (p - loc)); 11397 bfd_put_32 (htab->params->stub_bfd, 11398 B_DOT | ((targ - from) & 0x3fffffc), p); 11399 } 11400 else 11401 { 11402 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p); 11403 p += 4; 11404 bfd_put_32 (htab->params->stub_bfd, BCTR, p); 11405 } 11406 p += 4; 11407 11408 if (info->emitrelocations) 11409 { 11410 bfd_vma roff = relp - stub_entry->group->stub_sec->contents; 11411 if (htab->powerxx_stubs) 11412 num_rel += num_relocs_for_powerxx_offset (off, odd); 11413 else 11414 { 11415 num_rel += num_relocs_for_offset (off); 11416 roff += 16; 11417 } 11418 r = get_relocs (stub_entry->group->stub_sec, num_rel); 11419 if (r == NULL) 11420 return FALSE; 11421 if (htab->powerxx_stubs) 11422 r = emit_relocs_for_powerxx_offset (info, r, roff, targ, off, odd); 11423 else 11424 r = emit_relocs_for_offset (info, r, roff, targ, off); 11425 if (stub_entry->stub_type == ppc_stub_long_branch_notoc 11426 || stub_entry->stub_type == ppc_stub_long_branch_both) 11427 { 11428 ++r; 11429 roff = p - 4 - stub_entry->group->stub_sec->contents; 11430 r->r_offset = roff; 11431 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24); 11432 r->r_addend = targ; 11433 if (stub_entry->h != NULL 11434 && !use_global_in_relocs (htab, stub_entry, r, num_rel)) 11435 return FALSE; 11436 } 11437 } 11438 11439 if (!htab->powerxx_stubs 11440 && htab->glink_eh_frame != NULL 11441 && htab->glink_eh_frame->size != 0) 11442 { 11443 bfd_byte *base, *eh; 11444 unsigned int lr_used, delta; 11445 11446 base = (htab->glink_eh_frame->contents 11447 + stub_entry->group->eh_base + 17); 11448 eh = base + stub_entry->group->eh_size; 11449 lr_used = stub_entry->stub_offset + 8; 11450 if (stub_entry->stub_type == ppc_stub_long_branch_both 11451 || stub_entry->stub_type == ppc_stub_plt_branch_both 11452 || stub_entry->stub_type == ppc_stub_plt_call_both) 11453 lr_used += 4; 11454 delta = lr_used - stub_entry->group->lr_restore; 11455 stub_entry->group->lr_restore = lr_used + 8; 11456 eh = eh_advance (htab->elf.dynobj, eh, delta); 11457 *eh++ = DW_CFA_register; 11458 *eh++ = 65; 11459 *eh++ = 12; 11460 *eh++ = DW_CFA_advance_loc + 2; 11461 *eh++ = DW_CFA_restore_extended; 11462 *eh++ = 65; 11463 stub_entry->group->eh_size = eh - base; 11464 } 11465 break; 11466 11467 case ppc_stub_plt_call: 11468 case ppc_stub_plt_call_r2save: 11469 if (stub_entry->h != NULL 11470 && stub_entry->h->is_func_descriptor 11471 && stub_entry->h->oh != NULL) 11472 { 11473 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh); 11474 11475 /* If the old-ABI "dot-symbol" is undefined make it weak so 11476 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */ 11477 if (fh->elf.root.type == bfd_link_hash_undefined 11478 && (stub_entry->h->elf.root.type == bfd_link_hash_defined 11479 || stub_entry->h->elf.root.type == bfd_link_hash_defweak)) 11480 fh->elf.root.type = bfd_link_hash_undefweak; 11481 } 11482 11483 /* Now build the stub. */ 11484 targ = stub_entry->plt_ent->plt.offset & ~1; 11485 if (targ >= (bfd_vma) -2) 11486 abort (); 11487 11488 plt = htab->elf.splt; 11489 if (!htab->elf.dynamic_sections_created 11490 || stub_entry->h == NULL 11491 || stub_entry->h->elf.dynindx == -1) 11492 { 11493 if (stub_entry->symtype == STT_GNU_IFUNC) 11494 plt = htab->elf.iplt; 11495 else 11496 plt = htab->pltlocal; 11497 } 11498 targ += plt->output_offset + plt->output_section->vma; 11499 11500 off = (elf_gp (info->output_bfd) 11501 + htab->sec_info[stub_entry->group->link_sec->id].toc_off); 11502 off = targ - off; 11503 11504 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0) 11505 { 11506 info->callbacks->einfo 11507 /* xgettext:c-format */ 11508 (_("%P: linkage table error against `%pT'\n"), 11509 stub_entry->h != NULL 11510 ? stub_entry->h->elf.root.root.string 11511 : "<local sym>"); 11512 bfd_set_error (bfd_error_bad_value); 11513 htab->stub_error = TRUE; 11514 return FALSE; 11515 } 11516 11517 r = NULL; 11518 if (info->emitrelocations) 11519 { 11520 r = get_relocs (stub_entry->group->stub_sec, 11521 ((PPC_HA (off) != 0) 11522 + (htab->opd_abi 11523 ? 2 + (htab->params->plt_static_chain 11524 && PPC_HA (off + 16) == PPC_HA (off)) 11525 : 1))); 11526 if (r == NULL) 11527 return FALSE; 11528 r[0].r_offset = loc - stub_entry->group->stub_sec->contents; 11529 if (bfd_big_endian (info->output_bfd)) 11530 r[0].r_offset += 2; 11531 r[0].r_addend = targ; 11532 } 11533 if (stub_entry->h != NULL 11534 && (stub_entry->h == htab->tls_get_addr_fd 11535 || stub_entry->h == htab->tls_get_addr) 11536 && htab->params->tls_get_addr_opt) 11537 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r); 11538 else 11539 p = build_plt_stub (htab, stub_entry, loc, off, r); 11540 break; 11541 11542 case ppc_stub_save_res: 11543 return TRUE; 11544 11545 default: 11546 BFD_FAIL (); 11547 return FALSE; 11548 } 11549 11550 stub_entry->group->stub_sec->size = stub_entry->stub_offset + (p - loc); 11551 11552 if (htab->params->emit_stub_syms) 11553 { 11554 struct elf_link_hash_entry *h; 11555 size_t len1, len2; 11556 char *name; 11557 const char *const stub_str[] = { "long_branch", 11558 "long_branch", 11559 "long_branch", 11560 "long_branch", 11561 "plt_branch", 11562 "plt_branch", 11563 "plt_branch", 11564 "plt_branch", 11565 "plt_call", 11566 "plt_call", 11567 "plt_call", 11568 "plt_call" }; 11569 11570 len1 = strlen (stub_str[stub_entry->stub_type - 1]); 11571 len2 = strlen (stub_entry->root.string); 11572 name = bfd_malloc (len1 + len2 + 2); 11573 if (name == NULL) 11574 return FALSE; 11575 memcpy (name, stub_entry->root.string, 9); 11576 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1); 11577 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1); 11578 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE); 11579 if (h == NULL) 11580 return FALSE; 11581 if (h->root.type == bfd_link_hash_new) 11582 { 11583 h->root.type = bfd_link_hash_defined; 11584 h->root.u.def.section = stub_entry->group->stub_sec; 11585 h->root.u.def.value = stub_entry->stub_offset; 11586 h->ref_regular = 1; 11587 h->def_regular = 1; 11588 h->ref_regular_nonweak = 1; 11589 h->forced_local = 1; 11590 h->non_elf = 0; 11591 h->root.linker_def = 1; 11592 } 11593 } 11594 11595 return TRUE; 11596 } 11597 11598 /* As above, but don't actually build the stub. Just bump offset so 11599 we know stub section sizes, and select plt_branch stubs where 11600 long_branch stubs won't do. */ 11601 11602 static bfd_boolean 11603 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) 11604 { 11605 struct ppc_stub_hash_entry *stub_entry; 11606 struct bfd_link_info *info; 11607 struct ppc_link_hash_table *htab; 11608 asection *plt; 11609 bfd_vma targ, off, r2off; 11610 unsigned int size, extra, lr_used, delta, odd; 11611 11612 /* Massage our args to the form they really have. */ 11613 stub_entry = (struct ppc_stub_hash_entry *) gen_entry; 11614 info = in_arg; 11615 11616 htab = ppc_hash_table (info); 11617 if (htab == NULL) 11618 return FALSE; 11619 11620 /* Make a note of the offset within the stubs for this entry. */ 11621 stub_entry->stub_offset = stub_entry->group->stub_sec->size; 11622 11623 if (stub_entry->h != NULL 11624 && stub_entry->h->save_res 11625 && stub_entry->h->elf.root.type == bfd_link_hash_defined 11626 && stub_entry->h->elf.root.u.def.section == htab->sfpr) 11627 { 11628 /* Don't make stubs to out-of-line register save/restore 11629 functions. Instead, emit copies of the functions. */ 11630 stub_entry->group->needs_save_res = 1; 11631 stub_entry->stub_type = ppc_stub_save_res; 11632 return TRUE; 11633 } 11634 11635 switch (stub_entry->stub_type) 11636 { 11637 case ppc_stub_plt_branch: 11638 case ppc_stub_plt_branch_r2off: 11639 /* Reset the stub type from the plt branch variant in case we now 11640 can reach with a shorter stub. */ 11641 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch; 11642 /* Fall through. */ 11643 case ppc_stub_long_branch: 11644 case ppc_stub_long_branch_r2off: 11645 targ = (stub_entry->target_value 11646 + stub_entry->target_section->output_offset 11647 + stub_entry->target_section->output_section->vma); 11648 targ += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other); 11649 off = (stub_entry->stub_offset 11650 + stub_entry->group->stub_sec->output_offset 11651 + stub_entry->group->stub_sec->output_section->vma); 11652 11653 size = 4; 11654 r2off = 0; 11655 if (stub_entry->stub_type == ppc_stub_long_branch_r2off) 11656 { 11657 r2off = get_r2off (info, stub_entry); 11658 if (r2off == (bfd_vma) -1) 11659 { 11660 htab->stub_error = TRUE; 11661 return FALSE; 11662 } 11663 size = 8; 11664 if (PPC_HA (r2off) != 0) 11665 size += 4; 11666 if (PPC_LO (r2off) != 0) 11667 size += 4; 11668 off += size - 4; 11669 } 11670 off = targ - off; 11671 11672 /* If the branch offset is too big, use a ppc_stub_plt_branch. 11673 Do the same for -R objects without function descriptors. */ 11674 if ((stub_entry->stub_type == ppc_stub_long_branch_r2off 11675 && r2off == 0 11676 && htab->sec_info[stub_entry->target_section->id].toc_off == 0) 11677 || off + (1 << 25) >= (bfd_vma) (1 << 26)) 11678 { 11679 struct ppc_branch_hash_entry *br_entry; 11680 11681 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table, 11682 stub_entry->root.string + 9, 11683 TRUE, FALSE); 11684 if (br_entry == NULL) 11685 { 11686 _bfd_error_handler (_("can't build branch stub `%s'"), 11687 stub_entry->root.string); 11688 htab->stub_error = TRUE; 11689 return FALSE; 11690 } 11691 11692 if (br_entry->iter != htab->stub_iteration) 11693 { 11694 br_entry->iter = htab->stub_iteration; 11695 br_entry->offset = htab->brlt->size; 11696 htab->brlt->size += 8; 11697 11698 if (htab->relbrlt != NULL) 11699 htab->relbrlt->size += sizeof (Elf64_External_Rela); 11700 else if (info->emitrelocations) 11701 { 11702 htab->brlt->reloc_count += 1; 11703 htab->brlt->flags |= SEC_RELOC; 11704 } 11705 } 11706 11707 targ = (br_entry->offset 11708 + htab->brlt->output_offset 11709 + htab->brlt->output_section->vma); 11710 off = (elf_gp (info->output_bfd) 11711 + htab->sec_info[stub_entry->group->link_sec->id].toc_off); 11712 off = targ - off; 11713 11714 if (info->emitrelocations) 11715 { 11716 stub_entry->group->stub_sec->reloc_count 11717 += 1 + (PPC_HA (off) != 0); 11718 stub_entry->group->stub_sec->flags |= SEC_RELOC; 11719 } 11720 11721 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch; 11722 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off) 11723 { 11724 size = 12; 11725 if (PPC_HA (off) != 0) 11726 size = 16; 11727 } 11728 else 11729 { 11730 size = 16; 11731 if (PPC_HA (off) != 0) 11732 size += 4; 11733 11734 if (PPC_HA (r2off) != 0) 11735 size += 4; 11736 if (PPC_LO (r2off) != 0) 11737 size += 4; 11738 } 11739 } 11740 else if (info->emitrelocations) 11741 { 11742 stub_entry->group->stub_sec->reloc_count += 1; 11743 stub_entry->group->stub_sec->flags |= SEC_RELOC; 11744 } 11745 break; 11746 11747 case ppc_stub_plt_branch_notoc: 11748 case ppc_stub_plt_branch_both: 11749 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch; 11750 /* Fall through. */ 11751 case ppc_stub_long_branch_notoc: 11752 case ppc_stub_long_branch_both: 11753 off = (stub_entry->stub_offset 11754 + stub_entry->group->stub_sec->output_offset 11755 + stub_entry->group->stub_sec->output_section->vma); 11756 size = 0; 11757 if (stub_entry->stub_type == ppc_stub_long_branch_both) 11758 size = 4; 11759 off += size; 11760 targ = (stub_entry->target_value 11761 + stub_entry->target_section->output_offset 11762 + stub_entry->target_section->output_section->vma); 11763 odd = off & 4; 11764 off = targ - off; 11765 11766 if (info->emitrelocations) 11767 { 11768 unsigned int num_rel; 11769 if (htab->powerxx_stubs) 11770 num_rel = num_relocs_for_powerxx_offset (off, odd); 11771 else 11772 num_rel = num_relocs_for_offset (off - 8); 11773 stub_entry->group->stub_sec->reloc_count += num_rel; 11774 stub_entry->group->stub_sec->flags |= SEC_RELOC; 11775 } 11776 11777 if (htab->powerxx_stubs) 11778 extra = size_powerxx_offset (off, odd); 11779 else 11780 extra = size_offset (off - 8); 11781 /* Include branch insn plus those in the offset sequence. */ 11782 size += 4 + extra; 11783 /* The branch insn is at the end, or "extra" bytes along. So 11784 its offset will be "extra" bytes less that that already 11785 calculated. */ 11786 off -= extra; 11787 11788 if (!htab->powerxx_stubs) 11789 { 11790 /* After the bcl, lr has been modified so we need to emit 11791 .eh_frame info saying the return address is in r12. */ 11792 lr_used = stub_entry->stub_offset + 8; 11793 if (stub_entry->stub_type == ppc_stub_long_branch_both) 11794 lr_used += 4; 11795 /* The eh_frame info will consist of a DW_CFA_advance_loc or 11796 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2, 11797 DW_CFA_restore_extended 65. */ 11798 delta = lr_used - stub_entry->group->lr_restore; 11799 stub_entry->group->eh_size += eh_advance_size (delta) + 6; 11800 stub_entry->group->lr_restore = lr_used + 8; 11801 } 11802 11803 /* If the branch can't reach, use a plt_branch. */ 11804 if (off + (1 << 25) >= (bfd_vma) (1 << 26)) 11805 { 11806 stub_entry->stub_type += (ppc_stub_plt_branch_notoc 11807 - ppc_stub_long_branch_notoc); 11808 size += 4; 11809 } 11810 else if (info->emitrelocations) 11811 stub_entry->group->stub_sec->reloc_count +=1; 11812 break; 11813 11814 case ppc_stub_plt_call_notoc: 11815 case ppc_stub_plt_call_both: 11816 off = (stub_entry->stub_offset 11817 + stub_entry->group->stub_sec->output_offset 11818 + stub_entry->group->stub_sec->output_section->vma); 11819 if (stub_entry->stub_type == ppc_stub_plt_call_both) 11820 off += 4; 11821 targ = stub_entry->plt_ent->plt.offset & ~1; 11822 if (targ >= (bfd_vma) -2) 11823 abort (); 11824 11825 plt = htab->elf.splt; 11826 if (!htab->elf.dynamic_sections_created 11827 || stub_entry->h == NULL 11828 || stub_entry->h->elf.dynindx == -1) 11829 { 11830 if (stub_entry->symtype == STT_GNU_IFUNC) 11831 plt = htab->elf.iplt; 11832 else 11833 plt = htab->pltlocal; 11834 } 11835 targ += plt->output_offset + plt->output_section->vma; 11836 odd = off & 4; 11837 off = targ - off; 11838 11839 if (htab->params->plt_stub_align != 0) 11840 { 11841 unsigned pad = plt_stub_pad (htab, stub_entry, off); 11842 11843 stub_entry->group->stub_sec->size += pad; 11844 stub_entry->stub_offset = stub_entry->group->stub_sec->size; 11845 off -= pad; 11846 } 11847 11848 if (info->emitrelocations) 11849 { 11850 unsigned int num_rel; 11851 if (htab->powerxx_stubs) 11852 num_rel = num_relocs_for_powerxx_offset (off, odd); 11853 else 11854 num_rel = num_relocs_for_offset (off - 8); 11855 stub_entry->group->stub_sec->reloc_count += num_rel; 11856 stub_entry->group->stub_sec->flags |= SEC_RELOC; 11857 } 11858 11859 size = plt_stub_size (htab, stub_entry, off); 11860 11861 if (!htab->powerxx_stubs) 11862 { 11863 /* After the bcl, lr has been modified so we need to emit 11864 .eh_frame info saying the return address is in r12. */ 11865 lr_used = stub_entry->stub_offset + 8; 11866 if (stub_entry->stub_type == ppc_stub_plt_call_both) 11867 lr_used += 4; 11868 /* The eh_frame info will consist of a DW_CFA_advance_loc or 11869 variant, DW_CFA_register, 65, 12, DW_CFA_advance_loc+2, 11870 DW_CFA_restore_extended 65. */ 11871 delta = lr_used - stub_entry->group->lr_restore; 11872 stub_entry->group->eh_size += eh_advance_size (delta) + 6; 11873 stub_entry->group->lr_restore = lr_used + 8; 11874 } 11875 break; 11876 11877 case ppc_stub_plt_call: 11878 case ppc_stub_plt_call_r2save: 11879 targ = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1; 11880 if (targ >= (bfd_vma) -2) 11881 abort (); 11882 plt = htab->elf.splt; 11883 if (!htab->elf.dynamic_sections_created 11884 || stub_entry->h == NULL 11885 || stub_entry->h->elf.dynindx == -1) 11886 { 11887 if (stub_entry->symtype == STT_GNU_IFUNC) 11888 plt = htab->elf.iplt; 11889 else 11890 plt = htab->pltlocal; 11891 } 11892 targ += plt->output_offset + plt->output_section->vma; 11893 11894 off = (elf_gp (info->output_bfd) 11895 + htab->sec_info[stub_entry->group->link_sec->id].toc_off); 11896 off = targ - off; 11897 11898 if (htab->params->plt_stub_align != 0) 11899 { 11900 unsigned pad = plt_stub_pad (htab, stub_entry, off); 11901 11902 stub_entry->group->stub_sec->size += pad; 11903 stub_entry->stub_offset = stub_entry->group->stub_sec->size; 11904 } 11905 11906 if (info->emitrelocations) 11907 { 11908 stub_entry->group->stub_sec->reloc_count 11909 += ((PPC_HA (off) != 0) 11910 + (htab->opd_abi 11911 ? 2 + (htab->params->plt_static_chain 11912 && PPC_HA (off + 16) == PPC_HA (off)) 11913 : 1)); 11914 stub_entry->group->stub_sec->flags |= SEC_RELOC; 11915 } 11916 11917 size = plt_stub_size (htab, stub_entry, off); 11918 11919 if (stub_entry->h != NULL 11920 && (stub_entry->h == htab->tls_get_addr_fd 11921 || stub_entry->h == htab->tls_get_addr) 11922 && htab->params->tls_get_addr_opt 11923 && stub_entry->stub_type == ppc_stub_plt_call_r2save) 11924 { 11925 /* After the bctrl, lr has been modified so we need to 11926 emit .eh_frame info saying the return address is 11927 on the stack. In fact we put the EH info specifying 11928 that the return address is on the stack *at* the 11929 call rather than after it, because the EH info for a 11930 call needs to be specified by that point. 11931 See libgcc/unwind-dw2.c execute_cfa_program. */ 11932 lr_used = stub_entry->stub_offset + size - 20; 11933 /* The eh_frame info will consist of a DW_CFA_advance_loc 11934 or variant, DW_CFA_offset_externed_sf, 65, -stackoff, 11935 DW_CFA_advance_loc+4, DW_CFA_restore_extended, 65. */ 11936 delta = lr_used - stub_entry->group->lr_restore; 11937 stub_entry->group->eh_size += eh_advance_size (delta) + 6; 11938 stub_entry->group->lr_restore = size - 4; 11939 } 11940 break; 11941 11942 default: 11943 BFD_FAIL (); 11944 return FALSE; 11945 } 11946 11947 stub_entry->group->stub_sec->size += size; 11948 return TRUE; 11949 } 11950 11951 /* Set up various things so that we can make a list of input sections 11952 for each output section included in the link. Returns -1 on error, 11953 0 when no stubs will be needed, and 1 on success. */ 11954 11955 int 11956 ppc64_elf_setup_section_lists (struct bfd_link_info *info) 11957 { 11958 unsigned int id; 11959 bfd_size_type amt; 11960 struct ppc_link_hash_table *htab = ppc_hash_table (info); 11961 11962 if (htab == NULL) 11963 return -1; 11964 11965 htab->sec_info_arr_size = _bfd_section_id; 11966 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size); 11967 htab->sec_info = bfd_zmalloc (amt); 11968 if (htab->sec_info == NULL) 11969 return -1; 11970 11971 /* Set toc_off for com, und, abs and ind sections. */ 11972 for (id = 0; id < 3; id++) 11973 htab->sec_info[id].toc_off = TOC_BASE_OFF; 11974 11975 return 1; 11976 } 11977 11978 /* Set up for first pass at multitoc partitioning. */ 11979 11980 void 11981 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info) 11982 { 11983 struct ppc_link_hash_table *htab = ppc_hash_table (info); 11984 11985 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd); 11986 htab->toc_bfd = NULL; 11987 htab->toc_first_sec = NULL; 11988 } 11989 11990 /* The linker repeatedly calls this function for each TOC input section 11991 and linker generated GOT section. Group input bfds such that the toc 11992 within a group is less than 64k in size. */ 11993 11994 bfd_boolean 11995 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec) 11996 { 11997 struct ppc_link_hash_table *htab = ppc_hash_table (info); 11998 bfd_vma addr, off, limit; 11999 12000 if (htab == NULL) 12001 return FALSE; 12002 12003 if (!htab->second_toc_pass) 12004 { 12005 /* Keep track of the first .toc or .got section for this input bfd. */ 12006 bfd_boolean new_bfd = htab->toc_bfd != isec->owner; 12007 12008 if (new_bfd) 12009 { 12010 htab->toc_bfd = isec->owner; 12011 htab->toc_first_sec = isec; 12012 } 12013 12014 addr = isec->output_offset + isec->output_section->vma; 12015 off = addr - htab->toc_curr; 12016 limit = 0x80008000; 12017 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc) 12018 limit = 0x10000; 12019 if (off + isec->size > limit) 12020 { 12021 addr = (htab->toc_first_sec->output_offset 12022 + htab->toc_first_sec->output_section->vma); 12023 htab->toc_curr = addr; 12024 htab->toc_curr &= -TOC_BASE_ALIGN; 12025 } 12026 12027 /* toc_curr is the base address of this toc group. Set elf_gp 12028 for the input section to be the offset relative to the 12029 output toc base plus 0x8000. Making the input elf_gp an 12030 offset allows us to move the toc as a whole without 12031 recalculating input elf_gp. */ 12032 off = htab->toc_curr - elf_gp (info->output_bfd); 12033 off += TOC_BASE_OFF; 12034 12035 /* Die if someone uses a linker script that doesn't keep input 12036 file .toc and .got together. */ 12037 if (new_bfd 12038 && elf_gp (isec->owner) != 0 12039 && elf_gp (isec->owner) != off) 12040 return FALSE; 12041 12042 elf_gp (isec->owner) = off; 12043 return TRUE; 12044 } 12045 12046 /* During the second pass toc_first_sec points to the start of 12047 a toc group, and toc_curr is used to track the old elf_gp. 12048 We use toc_bfd to ensure we only look at each bfd once. */ 12049 if (htab->toc_bfd == isec->owner) 12050 return TRUE; 12051 htab->toc_bfd = isec->owner; 12052 12053 if (htab->toc_first_sec == NULL 12054 || htab->toc_curr != elf_gp (isec->owner)) 12055 { 12056 htab->toc_curr = elf_gp (isec->owner); 12057 htab->toc_first_sec = isec; 12058 } 12059 addr = (htab->toc_first_sec->output_offset 12060 + htab->toc_first_sec->output_section->vma); 12061 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF; 12062 elf_gp (isec->owner) = off; 12063 12064 return TRUE; 12065 } 12066 12067 /* Called via elf_link_hash_traverse to merge GOT entries for global 12068 symbol H. */ 12069 12070 static bfd_boolean 12071 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED) 12072 { 12073 if (h->root.type == bfd_link_hash_indirect) 12074 return TRUE; 12075 12076 merge_got_entries (&h->got.glist); 12077 12078 return TRUE; 12079 } 12080 12081 /* Called via elf_link_hash_traverse to allocate GOT entries for global 12082 symbol H. */ 12083 12084 static bfd_boolean 12085 reallocate_got (struct elf_link_hash_entry *h, void *inf) 12086 { 12087 struct got_entry *gent; 12088 12089 if (h->root.type == bfd_link_hash_indirect) 12090 return TRUE; 12091 12092 for (gent = h->got.glist; gent != NULL; gent = gent->next) 12093 if (!gent->is_indirect) 12094 allocate_got (h, (struct bfd_link_info *) inf, gent); 12095 return TRUE; 12096 } 12097 12098 /* Called on the first multitoc pass after the last call to 12099 ppc64_elf_next_toc_section. This function removes duplicate GOT 12100 entries. */ 12101 12102 bfd_boolean 12103 ppc64_elf_layout_multitoc (struct bfd_link_info *info) 12104 { 12105 struct ppc_link_hash_table *htab = ppc_hash_table (info); 12106 struct bfd *ibfd, *ibfd2; 12107 bfd_boolean done_something; 12108 12109 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd); 12110 12111 if (!htab->do_multi_toc) 12112 return FALSE; 12113 12114 /* Merge global sym got entries within a toc group. */ 12115 elf_link_hash_traverse (&htab->elf, merge_global_got, info); 12116 12117 /* And tlsld_got. */ 12118 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 12119 { 12120 struct got_entry *ent, *ent2; 12121 12122 if (!is_ppc64_elf (ibfd)) 12123 continue; 12124 12125 ent = ppc64_tlsld_got (ibfd); 12126 if (!ent->is_indirect 12127 && ent->got.offset != (bfd_vma) -1) 12128 { 12129 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next) 12130 { 12131 if (!is_ppc64_elf (ibfd2)) 12132 continue; 12133 12134 ent2 = ppc64_tlsld_got (ibfd2); 12135 if (!ent2->is_indirect 12136 && ent2->got.offset != (bfd_vma) -1 12137 && elf_gp (ibfd2) == elf_gp (ibfd)) 12138 { 12139 ent2->is_indirect = TRUE; 12140 ent2->got.ent = ent; 12141 } 12142 } 12143 } 12144 } 12145 12146 /* Zap sizes of got sections. */ 12147 htab->elf.irelplt->rawsize = htab->elf.irelplt->size; 12148 htab->elf.irelplt->size -= htab->got_reli_size; 12149 htab->got_reli_size = 0; 12150 12151 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 12152 { 12153 asection *got, *relgot; 12154 12155 if (!is_ppc64_elf (ibfd)) 12156 continue; 12157 12158 got = ppc64_elf_tdata (ibfd)->got; 12159 if (got != NULL) 12160 { 12161 got->rawsize = got->size; 12162 got->size = 0; 12163 relgot = ppc64_elf_tdata (ibfd)->relgot; 12164 relgot->rawsize = relgot->size; 12165 relgot->size = 0; 12166 } 12167 } 12168 12169 /* Now reallocate the got, local syms first. We don't need to 12170 allocate section contents again since we never increase size. */ 12171 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 12172 { 12173 struct got_entry **lgot_ents; 12174 struct got_entry **end_lgot_ents; 12175 struct plt_entry **local_plt; 12176 struct plt_entry **end_local_plt; 12177 unsigned char *lgot_masks; 12178 bfd_size_type locsymcount; 12179 Elf_Internal_Shdr *symtab_hdr; 12180 asection *s; 12181 12182 if (!is_ppc64_elf (ibfd)) 12183 continue; 12184 12185 lgot_ents = elf_local_got_ents (ibfd); 12186 if (!lgot_ents) 12187 continue; 12188 12189 symtab_hdr = &elf_symtab_hdr (ibfd); 12190 locsymcount = symtab_hdr->sh_info; 12191 end_lgot_ents = lgot_ents + locsymcount; 12192 local_plt = (struct plt_entry **) end_lgot_ents; 12193 end_local_plt = local_plt + locsymcount; 12194 lgot_masks = (unsigned char *) end_local_plt; 12195 s = ppc64_elf_tdata (ibfd)->got; 12196 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks) 12197 { 12198 struct got_entry *ent; 12199 12200 for (ent = *lgot_ents; ent != NULL; ent = ent->next) 12201 { 12202 unsigned int ent_size = 8; 12203 unsigned int rel_size = sizeof (Elf64_External_Rela); 12204 12205 ent->got.offset = s->size; 12206 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0) 12207 { 12208 ent_size *= 2; 12209 rel_size *= 2; 12210 } 12211 s->size += ent_size; 12212 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC) 12213 { 12214 htab->elf.irelplt->size += rel_size; 12215 htab->got_reli_size += rel_size; 12216 } 12217 else if (bfd_link_pic (info) 12218 && !(ent->tls_type != 0 12219 && bfd_link_executable (info))) 12220 { 12221 asection *srel = ppc64_elf_tdata (ibfd)->relgot; 12222 srel->size += rel_size; 12223 } 12224 } 12225 } 12226 } 12227 12228 elf_link_hash_traverse (&htab->elf, reallocate_got, info); 12229 12230 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 12231 { 12232 struct got_entry *ent; 12233 12234 if (!is_ppc64_elf (ibfd)) 12235 continue; 12236 12237 ent = ppc64_tlsld_got (ibfd); 12238 if (!ent->is_indirect 12239 && ent->got.offset != (bfd_vma) -1) 12240 { 12241 asection *s = ppc64_elf_tdata (ibfd)->got; 12242 ent->got.offset = s->size; 12243 s->size += 16; 12244 if (bfd_link_dll (info)) 12245 { 12246 asection *srel = ppc64_elf_tdata (ibfd)->relgot; 12247 srel->size += sizeof (Elf64_External_Rela); 12248 } 12249 } 12250 } 12251 12252 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size; 12253 if (!done_something) 12254 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 12255 { 12256 asection *got; 12257 12258 if (!is_ppc64_elf (ibfd)) 12259 continue; 12260 12261 got = ppc64_elf_tdata (ibfd)->got; 12262 if (got != NULL) 12263 { 12264 done_something = got->rawsize != got->size; 12265 if (done_something) 12266 break; 12267 } 12268 } 12269 12270 if (done_something) 12271 (*htab->params->layout_sections_again) (); 12272 12273 /* Set up for second pass over toc sections to recalculate elf_gp 12274 on input sections. */ 12275 htab->toc_bfd = NULL; 12276 htab->toc_first_sec = NULL; 12277 htab->second_toc_pass = TRUE; 12278 return done_something; 12279 } 12280 12281 /* Called after second pass of multitoc partitioning. */ 12282 12283 void 12284 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info) 12285 { 12286 struct ppc_link_hash_table *htab = ppc_hash_table (info); 12287 12288 /* After the second pass, toc_curr tracks the TOC offset used 12289 for code sections below in ppc64_elf_next_input_section. */ 12290 htab->toc_curr = TOC_BASE_OFF; 12291 } 12292 12293 /* No toc references were found in ISEC. If the code in ISEC makes no 12294 calls, then there's no need to use toc adjusting stubs when branching 12295 into ISEC. Actually, indirect calls from ISEC are OK as they will 12296 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub 12297 needed, and 2 if a cyclical call-graph was found but no other reason 12298 for a stub was detected. If called from the top level, a return of 12299 2 means the same as a return of 0. */ 12300 12301 static int 12302 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec) 12303 { 12304 int ret; 12305 12306 /* Mark this section as checked. */ 12307 isec->call_check_done = 1; 12308 12309 /* We know none of our code bearing sections will need toc stubs. */ 12310 if ((isec->flags & SEC_LINKER_CREATED) != 0) 12311 return 0; 12312 12313 if (isec->size == 0) 12314 return 0; 12315 12316 if (isec->output_section == NULL) 12317 return 0; 12318 12319 ret = 0; 12320 if (isec->reloc_count != 0) 12321 { 12322 Elf_Internal_Rela *relstart, *rel; 12323 Elf_Internal_Sym *local_syms; 12324 struct ppc_link_hash_table *htab; 12325 12326 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL, 12327 info->keep_memory); 12328 if (relstart == NULL) 12329 return -1; 12330 12331 /* Look for branches to outside of this section. */ 12332 local_syms = NULL; 12333 htab = ppc_hash_table (info); 12334 if (htab == NULL) 12335 return -1; 12336 12337 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel) 12338 { 12339 enum elf_ppc64_reloc_type r_type; 12340 unsigned long r_symndx; 12341 struct elf_link_hash_entry *h; 12342 struct ppc_link_hash_entry *eh; 12343 Elf_Internal_Sym *sym; 12344 asection *sym_sec; 12345 struct _opd_sec_data *opd; 12346 bfd_vma sym_value; 12347 bfd_vma dest; 12348 12349 r_type = ELF64_R_TYPE (rel->r_info); 12350 if (r_type != R_PPC64_REL24 12351 && r_type != R_PPC64_REL24_NOTOC 12352 && r_type != R_PPC64_REL14 12353 && r_type != R_PPC64_REL14_BRTAKEN 12354 && r_type != R_PPC64_REL14_BRNTAKEN 12355 && r_type != R_PPC64_PLTCALL 12356 && r_type != R_PPC64_PLTCALL_NOTOC) 12357 continue; 12358 12359 r_symndx = ELF64_R_SYM (rel->r_info); 12360 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx, 12361 isec->owner)) 12362 { 12363 ret = -1; 12364 break; 12365 } 12366 12367 /* Calls to dynamic lib functions go through a plt call stub 12368 that uses r2. */ 12369 eh = (struct ppc_link_hash_entry *) h; 12370 if (eh != NULL 12371 && (eh->elf.plt.plist != NULL 12372 || (eh->oh != NULL 12373 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL))) 12374 { 12375 ret = 1; 12376 break; 12377 } 12378 12379 if (sym_sec == NULL) 12380 /* Ignore other undefined symbols. */ 12381 continue; 12382 12383 /* Assume branches to other sections not included in the 12384 link need stubs too, to cover -R and absolute syms. */ 12385 if (sym_sec->output_section == NULL) 12386 { 12387 ret = 1; 12388 break; 12389 } 12390 12391 if (h == NULL) 12392 sym_value = sym->st_value; 12393 else 12394 { 12395 if (h->root.type != bfd_link_hash_defined 12396 && h->root.type != bfd_link_hash_defweak) 12397 abort (); 12398 sym_value = h->root.u.def.value; 12399 } 12400 sym_value += rel->r_addend; 12401 12402 /* If this branch reloc uses an opd sym, find the code section. */ 12403 opd = get_opd_info (sym_sec); 12404 if (opd != NULL) 12405 { 12406 if (h == NULL && opd->adjust != NULL) 12407 { 12408 long adjust; 12409 12410 adjust = opd->adjust[OPD_NDX (sym_value)]; 12411 if (adjust == -1) 12412 /* Assume deleted functions won't ever be called. */ 12413 continue; 12414 sym_value += adjust; 12415 } 12416 12417 dest = opd_entry_value (sym_sec, sym_value, 12418 &sym_sec, NULL, FALSE); 12419 if (dest == (bfd_vma) -1) 12420 continue; 12421 } 12422 else 12423 dest = (sym_value 12424 + sym_sec->output_offset 12425 + sym_sec->output_section->vma); 12426 12427 /* Ignore branch to self. */ 12428 if (sym_sec == isec) 12429 continue; 12430 12431 /* If the called function uses the toc, we need a stub. */ 12432 if (sym_sec->has_toc_reloc 12433 || sym_sec->makes_toc_func_call) 12434 { 12435 ret = 1; 12436 break; 12437 } 12438 12439 /* Assume any branch that needs a long branch stub might in fact 12440 need a plt_branch stub. A plt_branch stub uses r2. */ 12441 else if (dest - (isec->output_offset 12442 + isec->output_section->vma 12443 + rel->r_offset) + (1 << 25) 12444 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h 12445 ? h->other 12446 : sym->st_other)) 12447 { 12448 ret = 1; 12449 break; 12450 } 12451 12452 /* If calling back to a section in the process of being 12453 tested, we can't say for sure that no toc adjusting stubs 12454 are needed, so don't return zero. */ 12455 else if (sym_sec->call_check_in_progress) 12456 ret = 2; 12457 12458 /* Branches to another section that itself doesn't have any TOC 12459 references are OK. Recursively call ourselves to check. */ 12460 else if (!sym_sec->call_check_done) 12461 { 12462 int recur; 12463 12464 /* Mark current section as indeterminate, so that other 12465 sections that call back to current won't be marked as 12466 known. */ 12467 isec->call_check_in_progress = 1; 12468 recur = toc_adjusting_stub_needed (info, sym_sec); 12469 isec->call_check_in_progress = 0; 12470 12471 if (recur != 0) 12472 { 12473 ret = recur; 12474 if (recur != 2) 12475 break; 12476 } 12477 } 12478 } 12479 12480 if (local_syms != NULL 12481 && (elf_symtab_hdr (isec->owner).contents 12482 != (unsigned char *) local_syms)) 12483 free (local_syms); 12484 if (elf_section_data (isec)->relocs != relstart) 12485 free (relstart); 12486 } 12487 12488 if ((ret & 1) == 0 12489 && isec->map_head.s != NULL 12490 && (strcmp (isec->output_section->name, ".init") == 0 12491 || strcmp (isec->output_section->name, ".fini") == 0)) 12492 { 12493 if (isec->map_head.s->has_toc_reloc 12494 || isec->map_head.s->makes_toc_func_call) 12495 ret = 1; 12496 else if (!isec->map_head.s->call_check_done) 12497 { 12498 int recur; 12499 isec->call_check_in_progress = 1; 12500 recur = toc_adjusting_stub_needed (info, isec->map_head.s); 12501 isec->call_check_in_progress = 0; 12502 if (recur != 0) 12503 ret = recur; 12504 } 12505 } 12506 12507 if (ret == 1) 12508 isec->makes_toc_func_call = 1; 12509 12510 return ret; 12511 } 12512 12513 /* The linker repeatedly calls this function for each input section, 12514 in the order that input sections are linked into output sections. 12515 Build lists of input sections to determine groupings between which 12516 we may insert linker stubs. */ 12517 12518 bfd_boolean 12519 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec) 12520 { 12521 struct ppc_link_hash_table *htab = ppc_hash_table (info); 12522 12523 if (htab == NULL) 12524 return FALSE; 12525 12526 if ((isec->output_section->flags & SEC_CODE) != 0 12527 && isec->output_section->id < htab->sec_info_arr_size) 12528 { 12529 /* This happens to make the list in reverse order, 12530 which is what we want. */ 12531 htab->sec_info[isec->id].u.list 12532 = htab->sec_info[isec->output_section->id].u.list; 12533 htab->sec_info[isec->output_section->id].u.list = isec; 12534 } 12535 12536 if (htab->multi_toc_needed) 12537 { 12538 /* Analyse sections that aren't already flagged as needing a 12539 valid toc pointer. Exclude .fixup for the linux kernel. 12540 .fixup contains branches, but only back to the function that 12541 hit an exception. */ 12542 if (!(isec->has_toc_reloc 12543 || (isec->flags & SEC_CODE) == 0 12544 || strcmp (isec->name, ".fixup") == 0 12545 || isec->call_check_done)) 12546 { 12547 if (toc_adjusting_stub_needed (info, isec) < 0) 12548 return FALSE; 12549 } 12550 /* Make all sections use the TOC assigned for this object file. 12551 This will be wrong for pasted sections; We fix that in 12552 check_pasted_section(). */ 12553 if (elf_gp (isec->owner) != 0) 12554 htab->toc_curr = elf_gp (isec->owner); 12555 } 12556 12557 htab->sec_info[isec->id].toc_off = htab->toc_curr; 12558 return TRUE; 12559 } 12560 12561 /* Check that all .init and .fini sections use the same toc, if they 12562 have toc relocs. */ 12563 12564 static bfd_boolean 12565 check_pasted_section (struct bfd_link_info *info, const char *name) 12566 { 12567 asection *o = bfd_get_section_by_name (info->output_bfd, name); 12568 12569 if (o != NULL) 12570 { 12571 struct ppc_link_hash_table *htab = ppc_hash_table (info); 12572 bfd_vma toc_off = 0; 12573 asection *i; 12574 12575 for (i = o->map_head.s; i != NULL; i = i->map_head.s) 12576 if (i->has_toc_reloc) 12577 { 12578 if (toc_off == 0) 12579 toc_off = htab->sec_info[i->id].toc_off; 12580 else if (toc_off != htab->sec_info[i->id].toc_off) 12581 return FALSE; 12582 } 12583 12584 if (toc_off == 0) 12585 for (i = o->map_head.s; i != NULL; i = i->map_head.s) 12586 if (i->makes_toc_func_call) 12587 { 12588 toc_off = htab->sec_info[i->id].toc_off; 12589 break; 12590 } 12591 12592 /* Make sure the whole pasted function uses the same toc offset. */ 12593 if (toc_off != 0) 12594 for (i = o->map_head.s; i != NULL; i = i->map_head.s) 12595 htab->sec_info[i->id].toc_off = toc_off; 12596 } 12597 return TRUE; 12598 } 12599 12600 bfd_boolean 12601 ppc64_elf_check_init_fini (struct bfd_link_info *info) 12602 { 12603 return (check_pasted_section (info, ".init") 12604 & check_pasted_section (info, ".fini")); 12605 } 12606 12607 /* See whether we can group stub sections together. Grouping stub 12608 sections may result in fewer stubs. More importantly, we need to 12609 put all .init* and .fini* stubs at the beginning of the .init or 12610 .fini output sections respectively, because glibc splits the 12611 _init and _fini functions into multiple parts. Putting a stub in 12612 the middle of a function is not a good idea. */ 12613 12614 static bfd_boolean 12615 group_sections (struct bfd_link_info *info, 12616 bfd_size_type stub_group_size, 12617 bfd_boolean stubs_always_before_branch) 12618 { 12619 struct ppc_link_hash_table *htab; 12620 asection *osec; 12621 bfd_boolean suppress_size_errors; 12622 12623 htab = ppc_hash_table (info); 12624 if (htab == NULL) 12625 return FALSE; 12626 12627 suppress_size_errors = FALSE; 12628 if (stub_group_size == 1) 12629 { 12630 /* Default values. */ 12631 if (stubs_always_before_branch) 12632 stub_group_size = 0x1e00000; 12633 else 12634 stub_group_size = 0x1c00000; 12635 suppress_size_errors = TRUE; 12636 } 12637 12638 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next) 12639 { 12640 asection *tail; 12641 12642 if (osec->id >= htab->sec_info_arr_size) 12643 continue; 12644 12645 tail = htab->sec_info[osec->id].u.list; 12646 while (tail != NULL) 12647 { 12648 asection *curr; 12649 asection *prev; 12650 bfd_size_type total; 12651 bfd_boolean big_sec; 12652 bfd_vma curr_toc; 12653 struct map_stub *group; 12654 bfd_size_type group_size; 12655 12656 curr = tail; 12657 total = tail->size; 12658 group_size = (ppc64_elf_section_data (tail) != NULL 12659 && ppc64_elf_section_data (tail)->has_14bit_branch 12660 ? stub_group_size >> 10 : stub_group_size); 12661 12662 big_sec = total > group_size; 12663 if (big_sec && !suppress_size_errors) 12664 /* xgettext:c-format */ 12665 _bfd_error_handler (_("%pB section %pA exceeds stub group size"), 12666 tail->owner, tail); 12667 curr_toc = htab->sec_info[tail->id].toc_off; 12668 12669 while ((prev = htab->sec_info[curr->id].u.list) != NULL 12670 && ((total += curr->output_offset - prev->output_offset) 12671 < (ppc64_elf_section_data (prev) != NULL 12672 && ppc64_elf_section_data (prev)->has_14bit_branch 12673 ? (group_size = stub_group_size >> 10) : group_size)) 12674 && htab->sec_info[prev->id].toc_off == curr_toc) 12675 curr = prev; 12676 12677 /* OK, the size from the start of CURR to the end is less 12678 than group_size and thus can be handled by one stub 12679 section. (or the tail section is itself larger than 12680 group_size, in which case we may be toast.) We should 12681 really be keeping track of the total size of stubs added 12682 here, as stubs contribute to the final output section 12683 size. That's a little tricky, and this way will only 12684 break if stubs added make the total size more than 2^25, 12685 ie. for the default stub_group_size, if stubs total more 12686 than 2097152 bytes, or nearly 75000 plt call stubs. */ 12687 group = bfd_alloc (curr->owner, sizeof (*group)); 12688 if (group == NULL) 12689 return FALSE; 12690 group->link_sec = curr; 12691 group->stub_sec = NULL; 12692 group->needs_save_res = 0; 12693 group->lr_restore = 0; 12694 group->eh_size = 0; 12695 group->eh_base = 0; 12696 group->next = htab->group; 12697 htab->group = group; 12698 do 12699 { 12700 prev = htab->sec_info[tail->id].u.list; 12701 /* Set up this stub group. */ 12702 htab->sec_info[tail->id].u.group = group; 12703 } 12704 while (tail != curr && (tail = prev) != NULL); 12705 12706 /* But wait, there's more! Input sections up to group_size 12707 bytes before the stub section can be handled by it too. 12708 Don't do this if we have a really large section after the 12709 stubs, as adding more stubs increases the chance that 12710 branches may not reach into the stub section. */ 12711 if (!stubs_always_before_branch && !big_sec) 12712 { 12713 total = 0; 12714 while (prev != NULL 12715 && ((total += tail->output_offset - prev->output_offset) 12716 < (ppc64_elf_section_data (prev) != NULL 12717 && ppc64_elf_section_data (prev)->has_14bit_branch 12718 ? (group_size = stub_group_size >> 10) 12719 : group_size)) 12720 && htab->sec_info[prev->id].toc_off == curr_toc) 12721 { 12722 tail = prev; 12723 prev = htab->sec_info[tail->id].u.list; 12724 htab->sec_info[tail->id].u.group = group; 12725 } 12726 } 12727 tail = prev; 12728 } 12729 } 12730 return TRUE; 12731 } 12732 12733 static const unsigned char glink_eh_frame_cie[] = 12734 { 12735 0, 0, 0, 16, /* length. */ 12736 0, 0, 0, 0, /* id. */ 12737 1, /* CIE version. */ 12738 'z', 'R', 0, /* Augmentation string. */ 12739 4, /* Code alignment. */ 12740 0x78, /* Data alignment. */ 12741 65, /* RA reg. */ 12742 1, /* Augmentation size. */ 12743 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */ 12744 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */ 12745 }; 12746 12747 /* Stripping output sections is normally done before dynamic section 12748 symbols have been allocated. This function is called later, and 12749 handles cases like htab->brlt which is mapped to its own output 12750 section. */ 12751 12752 static void 12753 maybe_strip_output (struct bfd_link_info *info, asection *isec) 12754 { 12755 if (isec->size == 0 12756 && isec->output_section->size == 0 12757 && !(isec->output_section->flags & SEC_KEEP) 12758 && !bfd_section_removed_from_list (info->output_bfd, 12759 isec->output_section) 12760 && elf_section_data (isec->output_section)->dynindx == 0) 12761 { 12762 isec->output_section->flags |= SEC_EXCLUDE; 12763 bfd_section_list_remove (info->output_bfd, isec->output_section); 12764 info->output_bfd->section_count--; 12765 } 12766 } 12767 12768 /* Determine and set the size of the stub section for a final link. 12769 12770 The basic idea here is to examine all the relocations looking for 12771 PC-relative calls to a target that is unreachable with a "bl" 12772 instruction. */ 12773 12774 bfd_boolean 12775 ppc64_elf_size_stubs (struct bfd_link_info *info) 12776 { 12777 bfd_size_type stub_group_size; 12778 bfd_boolean stubs_always_before_branch; 12779 struct ppc_link_hash_table *htab = ppc_hash_table (info); 12780 12781 if (htab == NULL) 12782 return FALSE; 12783 12784 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info)) 12785 htab->params->plt_thread_safe = 1; 12786 if (!htab->opd_abi) 12787 htab->params->plt_thread_safe = 0; 12788 else if (htab->params->plt_thread_safe == -1) 12789 { 12790 static const char *const thread_starter[] = 12791 { 12792 "pthread_create", 12793 /* libstdc++ */ 12794 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE", 12795 /* librt */ 12796 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio", 12797 "mq_notify", "create_timer", 12798 /* libanl */ 12799 "getaddrinfo_a", 12800 /* libgomp */ 12801 "GOMP_parallel", 12802 "GOMP_parallel_start", 12803 "GOMP_parallel_loop_static", 12804 "GOMP_parallel_loop_static_start", 12805 "GOMP_parallel_loop_dynamic", 12806 "GOMP_parallel_loop_dynamic_start", 12807 "GOMP_parallel_loop_guided", 12808 "GOMP_parallel_loop_guided_start", 12809 "GOMP_parallel_loop_runtime", 12810 "GOMP_parallel_loop_runtime_start", 12811 "GOMP_parallel_sections", 12812 "GOMP_parallel_sections_start", 12813 /* libgo */ 12814 "__go_go", 12815 }; 12816 unsigned i; 12817 12818 for (i = 0; i < ARRAY_SIZE (thread_starter); i++) 12819 { 12820 struct elf_link_hash_entry *h; 12821 h = elf_link_hash_lookup (&htab->elf, thread_starter[i], 12822 FALSE, FALSE, TRUE); 12823 htab->params->plt_thread_safe = h != NULL && h->ref_regular; 12824 if (htab->params->plt_thread_safe) 12825 break; 12826 } 12827 } 12828 stubs_always_before_branch = htab->params->group_size < 0; 12829 if (htab->params->group_size < 0) 12830 stub_group_size = -htab->params->group_size; 12831 else 12832 stub_group_size = htab->params->group_size; 12833 12834 if (!group_sections (info, stub_group_size, stubs_always_before_branch)) 12835 return FALSE; 12836 12837 #define STUB_SHRINK_ITER 20 12838 /* Loop until no stubs added. After iteration 20 of this loop we may 12839 exit on a stub section shrinking. This is to break out of a 12840 pathological case where adding stubs on one iteration decreases 12841 section gaps (perhaps due to alignment), which then requires 12842 fewer or smaller stubs on the next iteration. */ 12843 12844 while (1) 12845 { 12846 bfd *input_bfd; 12847 unsigned int bfd_indx; 12848 struct map_stub *group; 12849 12850 htab->stub_iteration += 1; 12851 12852 for (input_bfd = info->input_bfds, bfd_indx = 0; 12853 input_bfd != NULL; 12854 input_bfd = input_bfd->link.next, bfd_indx++) 12855 { 12856 Elf_Internal_Shdr *symtab_hdr; 12857 asection *section; 12858 Elf_Internal_Sym *local_syms = NULL; 12859 12860 if (!is_ppc64_elf (input_bfd)) 12861 continue; 12862 12863 /* We'll need the symbol table in a second. */ 12864 symtab_hdr = &elf_symtab_hdr (input_bfd); 12865 if (symtab_hdr->sh_info == 0) 12866 continue; 12867 12868 /* Walk over each section attached to the input bfd. */ 12869 for (section = input_bfd->sections; 12870 section != NULL; 12871 section = section->next) 12872 { 12873 Elf_Internal_Rela *internal_relocs, *irelaend, *irela; 12874 12875 /* If there aren't any relocs, then there's nothing more 12876 to do. */ 12877 if ((section->flags & SEC_RELOC) == 0 12878 || (section->flags & SEC_ALLOC) == 0 12879 || (section->flags & SEC_LOAD) == 0 12880 || (section->flags & SEC_CODE) == 0 12881 || section->reloc_count == 0) 12882 continue; 12883 12884 /* If this section is a link-once section that will be 12885 discarded, then don't create any stubs. */ 12886 if (section->output_section == NULL 12887 || section->output_section->owner != info->output_bfd) 12888 continue; 12889 12890 /* Get the relocs. */ 12891 internal_relocs 12892 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL, 12893 info->keep_memory); 12894 if (internal_relocs == NULL) 12895 goto error_ret_free_local; 12896 12897 /* Now examine each relocation. */ 12898 irela = internal_relocs; 12899 irelaend = irela + section->reloc_count; 12900 for (; irela < irelaend; irela++) 12901 { 12902 enum elf_ppc64_reloc_type r_type; 12903 unsigned int r_indx; 12904 enum ppc_stub_type stub_type; 12905 struct ppc_stub_hash_entry *stub_entry; 12906 asection *sym_sec, *code_sec; 12907 bfd_vma sym_value, code_value; 12908 bfd_vma destination; 12909 unsigned long local_off; 12910 bfd_boolean ok_dest; 12911 struct ppc_link_hash_entry *hash; 12912 struct ppc_link_hash_entry *fdh; 12913 struct elf_link_hash_entry *h; 12914 Elf_Internal_Sym *sym; 12915 char *stub_name; 12916 const asection *id_sec; 12917 struct _opd_sec_data *opd; 12918 struct plt_entry *plt_ent; 12919 12920 r_type = ELF64_R_TYPE (irela->r_info); 12921 r_indx = ELF64_R_SYM (irela->r_info); 12922 12923 if (r_type >= R_PPC64_max) 12924 { 12925 bfd_set_error (bfd_error_bad_value); 12926 goto error_ret_free_internal; 12927 } 12928 12929 /* Only look for stubs on branch instructions. */ 12930 if (r_type != R_PPC64_REL24 12931 && r_type != R_PPC64_REL24_NOTOC 12932 && r_type != R_PPC64_REL14 12933 && r_type != R_PPC64_REL14_BRTAKEN 12934 && r_type != R_PPC64_REL14_BRNTAKEN) 12935 continue; 12936 12937 /* Now determine the call target, its name, value, 12938 section. */ 12939 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, 12940 r_indx, input_bfd)) 12941 goto error_ret_free_internal; 12942 hash = (struct ppc_link_hash_entry *) h; 12943 12944 ok_dest = FALSE; 12945 fdh = NULL; 12946 sym_value = 0; 12947 if (hash == NULL) 12948 { 12949 sym_value = sym->st_value; 12950 if (sym_sec != NULL 12951 && sym_sec->output_section != NULL) 12952 ok_dest = TRUE; 12953 } 12954 else if (hash->elf.root.type == bfd_link_hash_defined 12955 || hash->elf.root.type == bfd_link_hash_defweak) 12956 { 12957 sym_value = hash->elf.root.u.def.value; 12958 if (sym_sec->output_section != NULL) 12959 ok_dest = TRUE; 12960 } 12961 else if (hash->elf.root.type == bfd_link_hash_undefweak 12962 || hash->elf.root.type == bfd_link_hash_undefined) 12963 { 12964 /* Recognise an old ABI func code entry sym, and 12965 use the func descriptor sym instead if it is 12966 defined. */ 12967 if (hash->elf.root.root.string[0] == '.' 12968 && hash->oh != NULL) 12969 { 12970 fdh = ppc_follow_link (hash->oh); 12971 if (fdh->elf.root.type == bfd_link_hash_defined 12972 || fdh->elf.root.type == bfd_link_hash_defweak) 12973 { 12974 sym_sec = fdh->elf.root.u.def.section; 12975 sym_value = fdh->elf.root.u.def.value; 12976 if (sym_sec->output_section != NULL) 12977 ok_dest = TRUE; 12978 } 12979 else 12980 fdh = NULL; 12981 } 12982 } 12983 else 12984 { 12985 bfd_set_error (bfd_error_bad_value); 12986 goto error_ret_free_internal; 12987 } 12988 12989 destination = 0; 12990 local_off = 0; 12991 if (ok_dest) 12992 { 12993 sym_value += irela->r_addend; 12994 destination = (sym_value 12995 + sym_sec->output_offset 12996 + sym_sec->output_section->vma); 12997 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash 12998 ? hash->elf.other 12999 : sym->st_other); 13000 } 13001 13002 code_sec = sym_sec; 13003 code_value = sym_value; 13004 opd = get_opd_info (sym_sec); 13005 if (opd != NULL) 13006 { 13007 bfd_vma dest; 13008 13009 if (hash == NULL && opd->adjust != NULL) 13010 { 13011 long adjust = opd->adjust[OPD_NDX (sym_value)]; 13012 if (adjust == -1) 13013 continue; 13014 code_value += adjust; 13015 sym_value += adjust; 13016 } 13017 dest = opd_entry_value (sym_sec, sym_value, 13018 &code_sec, &code_value, FALSE); 13019 if (dest != (bfd_vma) -1) 13020 { 13021 destination = dest; 13022 if (fdh != NULL) 13023 { 13024 /* Fixup old ABI sym to point at code 13025 entry. */ 13026 hash->elf.root.type = bfd_link_hash_defweak; 13027 hash->elf.root.u.def.section = code_sec; 13028 hash->elf.root.u.def.value = code_value; 13029 } 13030 } 13031 } 13032 13033 /* Determine what (if any) linker stub is needed. */ 13034 plt_ent = NULL; 13035 stub_type = ppc_type_of_stub (section, irela, &hash, 13036 &plt_ent, destination, 13037 local_off); 13038 13039 if (r_type == R_PPC64_REL24_NOTOC) 13040 { 13041 if (stub_type == ppc_stub_plt_call) 13042 stub_type = ppc_stub_plt_call_notoc; 13043 else if (stub_type == ppc_stub_long_branch 13044 || (code_sec != NULL 13045 && code_sec->output_section != NULL 13046 && (((hash ? hash->elf.other : sym->st_other) 13047 & STO_PPC64_LOCAL_MASK) 13048 > 1 << STO_PPC64_LOCAL_BIT))) 13049 stub_type = ppc_stub_long_branch_notoc; 13050 } 13051 else if (stub_type != ppc_stub_plt_call) 13052 { 13053 /* Check whether we need a TOC adjusting stub. 13054 Since the linker pastes together pieces from 13055 different object files when creating the 13056 _init and _fini functions, it may be that a 13057 call to what looks like a local sym is in 13058 fact a call needing a TOC adjustment. */ 13059 if ((code_sec != NULL 13060 && code_sec->output_section != NULL 13061 && (htab->sec_info[code_sec->id].toc_off 13062 != htab->sec_info[section->id].toc_off) 13063 && (code_sec->has_toc_reloc 13064 || code_sec->makes_toc_func_call)) 13065 || (((hash ? hash->elf.other : sym->st_other) 13066 & STO_PPC64_LOCAL_MASK) 13067 == 1 << STO_PPC64_LOCAL_BIT)) 13068 stub_type = ppc_stub_long_branch_r2off; 13069 } 13070 13071 if (stub_type == ppc_stub_none) 13072 continue; 13073 13074 /* __tls_get_addr calls might be eliminated. */ 13075 if (stub_type != ppc_stub_plt_call 13076 && stub_type != ppc_stub_plt_call_notoc 13077 && hash != NULL 13078 && (hash == htab->tls_get_addr 13079 || hash == htab->tls_get_addr_fd) 13080 && section->has_tls_reloc 13081 && irela != internal_relocs) 13082 { 13083 /* Get tls info. */ 13084 unsigned char *tls_mask; 13085 13086 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms, 13087 irela - 1, input_bfd)) 13088 goto error_ret_free_internal; 13089 if ((*tls_mask & TLS_TLS) != 0 13090 && (*tls_mask & (TLS_GD | TLS_LD)) == 0) 13091 continue; 13092 } 13093 13094 if (stub_type == ppc_stub_plt_call) 13095 { 13096 if (!htab->opd_abi 13097 && htab->params->plt_localentry0 != 0 13098 && is_elfv2_localentry0 (&hash->elf)) 13099 htab->has_plt_localentry0 = 1; 13100 else if (irela + 1 < irelaend 13101 && irela[1].r_offset == irela->r_offset + 4 13102 && (ELF64_R_TYPE (irela[1].r_info) 13103 == R_PPC64_TOCSAVE)) 13104 { 13105 if (!tocsave_find (htab, INSERT, 13106 &local_syms, irela + 1, input_bfd)) 13107 goto error_ret_free_internal; 13108 } 13109 else 13110 stub_type = ppc_stub_plt_call_r2save; 13111 } 13112 13113 /* Support for grouping stub sections. */ 13114 id_sec = htab->sec_info[section->id].u.group->link_sec; 13115 13116 /* Get the name of this stub. */ 13117 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela); 13118 if (!stub_name) 13119 goto error_ret_free_internal; 13120 13121 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, 13122 stub_name, FALSE, FALSE); 13123 if (stub_entry != NULL) 13124 { 13125 enum ppc_stub_type old_type; 13126 /* A stub has already been created, but it may 13127 not be the required type. We shouldn't be 13128 transitioning from plt_call to long_branch 13129 stubs or vice versa, but we might be 13130 upgrading from plt_call to plt_call_r2save or 13131 from long_branch to long_branch_r2off. */ 13132 free (stub_name); 13133 old_type = stub_entry->stub_type; 13134 switch (old_type) 13135 { 13136 default: 13137 abort (); 13138 13139 case ppc_stub_save_res: 13140 continue; 13141 13142 case ppc_stub_plt_call: 13143 case ppc_stub_plt_call_r2save: 13144 case ppc_stub_plt_call_notoc: 13145 case ppc_stub_plt_call_both: 13146 if (stub_type == ppc_stub_plt_call) 13147 continue; 13148 else if (stub_type == ppc_stub_plt_call_r2save) 13149 { 13150 if (old_type == ppc_stub_plt_call_notoc) 13151 stub_type = ppc_stub_plt_call_both; 13152 } 13153 else if (stub_type == ppc_stub_plt_call_notoc) 13154 { 13155 if (old_type == ppc_stub_plt_call_r2save) 13156 stub_type = ppc_stub_plt_call_both; 13157 } 13158 else 13159 abort (); 13160 break; 13161 13162 case ppc_stub_plt_branch: 13163 case ppc_stub_plt_branch_r2off: 13164 case ppc_stub_plt_branch_notoc: 13165 case ppc_stub_plt_branch_both: 13166 old_type += (ppc_stub_long_branch 13167 - ppc_stub_plt_branch); 13168 /* Fall through. */ 13169 case ppc_stub_long_branch: 13170 case ppc_stub_long_branch_r2off: 13171 case ppc_stub_long_branch_notoc: 13172 case ppc_stub_long_branch_both: 13173 if (stub_type == ppc_stub_long_branch) 13174 continue; 13175 else if (stub_type == ppc_stub_long_branch_r2off) 13176 { 13177 if (old_type == ppc_stub_long_branch_notoc) 13178 stub_type = ppc_stub_long_branch_both; 13179 } 13180 else if (stub_type == ppc_stub_long_branch_notoc) 13181 { 13182 if (old_type == ppc_stub_long_branch_r2off) 13183 stub_type = ppc_stub_long_branch_both; 13184 } 13185 else 13186 abort (); 13187 break; 13188 } 13189 if (old_type < stub_type) 13190 stub_entry->stub_type = stub_type; 13191 continue; 13192 } 13193 13194 stub_entry = ppc_add_stub (stub_name, section, info); 13195 if (stub_entry == NULL) 13196 { 13197 free (stub_name); 13198 error_ret_free_internal: 13199 if (elf_section_data (section)->relocs == NULL) 13200 free (internal_relocs); 13201 error_ret_free_local: 13202 if (local_syms != NULL 13203 && (symtab_hdr->contents 13204 != (unsigned char *) local_syms)) 13205 free (local_syms); 13206 return FALSE; 13207 } 13208 13209 stub_entry->stub_type = stub_type; 13210 if (stub_type >= ppc_stub_plt_call 13211 && stub_type <= ppc_stub_plt_call_both) 13212 { 13213 stub_entry->target_value = sym_value; 13214 stub_entry->target_section = sym_sec; 13215 } 13216 else 13217 { 13218 stub_entry->target_value = code_value; 13219 stub_entry->target_section = code_sec; 13220 } 13221 stub_entry->h = hash; 13222 stub_entry->plt_ent = plt_ent; 13223 stub_entry->symtype 13224 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info); 13225 stub_entry->other = hash ? hash->elf.other : sym->st_other; 13226 13227 if (hash != NULL 13228 && (hash->elf.root.type == bfd_link_hash_defined 13229 || hash->elf.root.type == bfd_link_hash_defweak)) 13230 htab->stub_globals += 1; 13231 } 13232 13233 /* We're done with the internal relocs, free them. */ 13234 if (elf_section_data (section)->relocs != internal_relocs) 13235 free (internal_relocs); 13236 } 13237 13238 if (local_syms != NULL 13239 && symtab_hdr->contents != (unsigned char *) local_syms) 13240 { 13241 if (!info->keep_memory) 13242 free (local_syms); 13243 else 13244 symtab_hdr->contents = (unsigned char *) local_syms; 13245 } 13246 } 13247 13248 /* We may have added some stubs. Find out the new size of the 13249 stub sections. */ 13250 for (group = htab->group; group != NULL; group = group->next) 13251 { 13252 group->lr_restore = 0; 13253 group->eh_size = 0; 13254 if (group->stub_sec != NULL) 13255 { 13256 asection *stub_sec = group->stub_sec; 13257 13258 if (htab->stub_iteration <= STUB_SHRINK_ITER 13259 || stub_sec->rawsize < stub_sec->size) 13260 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */ 13261 stub_sec->rawsize = stub_sec->size; 13262 stub_sec->size = 0; 13263 stub_sec->reloc_count = 0; 13264 stub_sec->flags &= ~SEC_RELOC; 13265 } 13266 } 13267 13268 if (htab->stub_iteration <= STUB_SHRINK_ITER 13269 || htab->brlt->rawsize < htab->brlt->size) 13270 htab->brlt->rawsize = htab->brlt->size; 13271 htab->brlt->size = 0; 13272 htab->brlt->reloc_count = 0; 13273 htab->brlt->flags &= ~SEC_RELOC; 13274 if (htab->relbrlt != NULL) 13275 htab->relbrlt->size = 0; 13276 13277 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info); 13278 13279 for (group = htab->group; group != NULL; group = group->next) 13280 if (group->needs_save_res) 13281 group->stub_sec->size += htab->sfpr->size; 13282 13283 if (info->emitrelocations 13284 && htab->glink != NULL && htab->glink->size != 0) 13285 { 13286 htab->glink->reloc_count = 1; 13287 htab->glink->flags |= SEC_RELOC; 13288 } 13289 13290 if (htab->glink_eh_frame != NULL 13291 && !bfd_is_abs_section (htab->glink_eh_frame->output_section) 13292 && htab->glink_eh_frame->output_section->size > 8) 13293 { 13294 size_t size = 0, align = 4; 13295 13296 for (group = htab->group; group != NULL; group = group->next) 13297 if (group->eh_size != 0) 13298 size += (group->eh_size + 17 + align - 1) & -align; 13299 if (htab->glink != NULL && htab->glink->size != 0) 13300 size += (24 + align - 1) & -align; 13301 if (size != 0) 13302 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align; 13303 align = 1ul << htab->glink_eh_frame->output_section->alignment_power; 13304 size = (size + align - 1) & -align; 13305 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size; 13306 htab->glink_eh_frame->size = size; 13307 } 13308 13309 if (htab->params->plt_stub_align != 0) 13310 for (group = htab->group; group != NULL; group = group->next) 13311 if (group->stub_sec != NULL) 13312 { 13313 int align = abs (htab->params->plt_stub_align); 13314 group->stub_sec->size 13315 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align); 13316 } 13317 13318 for (group = htab->group; group != NULL; group = group->next) 13319 if (group->stub_sec != NULL 13320 && group->stub_sec->rawsize != group->stub_sec->size 13321 && (htab->stub_iteration <= STUB_SHRINK_ITER 13322 || group->stub_sec->rawsize < group->stub_sec->size)) 13323 break; 13324 13325 if (group == NULL 13326 && (htab->brlt->rawsize == htab->brlt->size 13327 || (htab->stub_iteration > STUB_SHRINK_ITER 13328 && htab->brlt->rawsize > htab->brlt->size)) 13329 && (htab->glink_eh_frame == NULL 13330 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size)) 13331 break; 13332 13333 /* Ask the linker to do its stuff. */ 13334 (*htab->params->layout_sections_again) (); 13335 } 13336 13337 if (htab->glink_eh_frame != NULL 13338 && htab->glink_eh_frame->size != 0) 13339 { 13340 bfd_vma val; 13341 bfd_byte *p, *last_fde; 13342 size_t last_fde_len, size, align, pad; 13343 struct map_stub *group; 13344 13345 /* It is necessary to at least have a rough outline of the 13346 linker generated CIEs and FDEs written before 13347 bfd_elf_discard_info is run, in order for these FDEs to be 13348 indexed in .eh_frame_hdr. */ 13349 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size); 13350 if (p == NULL) 13351 return FALSE; 13352 htab->glink_eh_frame->contents = p; 13353 last_fde = p; 13354 align = 4; 13355 13356 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie)); 13357 /* CIE length (rewrite in case little-endian). */ 13358 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4; 13359 bfd_put_32 (htab->elf.dynobj, last_fde_len, p); 13360 p += last_fde_len + 4; 13361 13362 for (group = htab->group; group != NULL; group = group->next) 13363 if (group->eh_size != 0) 13364 { 13365 group->eh_base = p - htab->glink_eh_frame->contents; 13366 last_fde = p; 13367 last_fde_len = ((group->eh_size + 17 + align - 1) & -align) - 4; 13368 /* FDE length. */ 13369 bfd_put_32 (htab->elf.dynobj, last_fde_len, p); 13370 p += 4; 13371 /* CIE pointer. */ 13372 val = p - htab->glink_eh_frame->contents; 13373 bfd_put_32 (htab->elf.dynobj, val, p); 13374 p += 4; 13375 /* Offset to stub section, written later. */ 13376 p += 4; 13377 /* stub section size. */ 13378 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p); 13379 p += 4; 13380 /* Augmentation. */ 13381 p += 1; 13382 /* Make sure we don't have all nops. This is enough for 13383 elf-eh-frame.c to detect the last non-nop opcode. */ 13384 p[group->eh_size - 1] = DW_CFA_advance_loc + 1; 13385 p = last_fde + last_fde_len + 4; 13386 } 13387 if (htab->glink != NULL && htab->glink->size != 0) 13388 { 13389 last_fde = p; 13390 last_fde_len = ((24 + align - 1) & -align) - 4; 13391 /* FDE length. */ 13392 bfd_put_32 (htab->elf.dynobj, last_fde_len, p); 13393 p += 4; 13394 /* CIE pointer. */ 13395 val = p - htab->glink_eh_frame->contents; 13396 bfd_put_32 (htab->elf.dynobj, val, p); 13397 p += 4; 13398 /* Offset to .glink, written later. */ 13399 p += 4; 13400 /* .glink size. */ 13401 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p); 13402 p += 4; 13403 /* Augmentation. */ 13404 p += 1; 13405 13406 *p++ = DW_CFA_advance_loc + 1; 13407 *p++ = DW_CFA_register; 13408 *p++ = 65; 13409 *p++ = htab->opd_abi ? 12 : 0; 13410 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7); 13411 *p++ = DW_CFA_restore_extended; 13412 *p++ = 65; 13413 p += ((24 + align - 1) & -align) - 24; 13414 } 13415 /* Subsume any padding into the last FDE if user .eh_frame 13416 sections are aligned more than glink_eh_frame. Otherwise any 13417 zero padding will be seen as a terminator. */ 13418 align = 1ul << htab->glink_eh_frame->output_section->alignment_power; 13419 size = p - htab->glink_eh_frame->contents; 13420 pad = ((size + align - 1) & -align) - size; 13421 htab->glink_eh_frame->size = size + pad; 13422 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde); 13423 } 13424 13425 maybe_strip_output (info, htab->brlt); 13426 if (htab->glink_eh_frame != NULL) 13427 maybe_strip_output (info, htab->glink_eh_frame); 13428 13429 return TRUE; 13430 } 13431 13432 /* Called after we have determined section placement. If sections 13433 move, we'll be called again. Provide a value for TOCstart. */ 13434 13435 bfd_vma 13436 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd) 13437 { 13438 asection *s; 13439 bfd_vma TOCstart, adjust; 13440 13441 if (info != NULL) 13442 { 13443 struct elf_link_hash_entry *h; 13444 struct elf_link_hash_table *htab = elf_hash_table (info); 13445 13446 if (is_elf_hash_table (htab) 13447 && htab->hgot != NULL) 13448 h = htab->hgot; 13449 else 13450 { 13451 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE); 13452 if (is_elf_hash_table (htab)) 13453 htab->hgot = h; 13454 } 13455 if (h != NULL 13456 && h->root.type == bfd_link_hash_defined 13457 && !h->root.linker_def 13458 && (!is_elf_hash_table (htab) 13459 || h->def_regular)) 13460 { 13461 TOCstart = (h->root.u.def.value - TOC_BASE_OFF 13462 + h->root.u.def.section->output_offset 13463 + h->root.u.def.section->output_section->vma); 13464 _bfd_set_gp_value (obfd, TOCstart); 13465 return TOCstart; 13466 } 13467 } 13468 13469 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that 13470 order. The TOC starts where the first of these sections starts. */ 13471 s = bfd_get_section_by_name (obfd, ".got"); 13472 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0) 13473 s = bfd_get_section_by_name (obfd, ".toc"); 13474 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0) 13475 s = bfd_get_section_by_name (obfd, ".tocbss"); 13476 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0) 13477 s = bfd_get_section_by_name (obfd, ".plt"); 13478 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0) 13479 { 13480 /* This may happen for 13481 o references to TOC base (SYM@toc / TOC[tc0]) without a 13482 .toc directive 13483 o bad linker script 13484 o --gc-sections and empty TOC sections 13485 13486 FIXME: Warn user? */ 13487 13488 /* Look for a likely section. We probably won't even be 13489 using TOCstart. */ 13490 for (s = obfd->sections; s != NULL; s = s->next) 13491 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY 13492 | SEC_EXCLUDE)) 13493 == (SEC_ALLOC | SEC_SMALL_DATA)) 13494 break; 13495 if (s == NULL) 13496 for (s = obfd->sections; s != NULL; s = s->next) 13497 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE)) 13498 == (SEC_ALLOC | SEC_SMALL_DATA)) 13499 break; 13500 if (s == NULL) 13501 for (s = obfd->sections; s != NULL; s = s->next) 13502 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE)) 13503 == SEC_ALLOC) 13504 break; 13505 if (s == NULL) 13506 for (s = obfd->sections; s != NULL; s = s->next) 13507 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC) 13508 break; 13509 } 13510 13511 TOCstart = 0; 13512 if (s != NULL) 13513 TOCstart = s->output_section->vma + s->output_offset; 13514 13515 /* Force alignment. */ 13516 adjust = TOCstart & (TOC_BASE_ALIGN - 1); 13517 TOCstart -= adjust; 13518 _bfd_set_gp_value (obfd, TOCstart); 13519 13520 if (info != NULL && s != NULL) 13521 { 13522 struct ppc_link_hash_table *htab = ppc_hash_table (info); 13523 13524 if (htab != NULL) 13525 { 13526 if (htab->elf.hgot != NULL) 13527 { 13528 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust; 13529 htab->elf.hgot->root.u.def.section = s; 13530 } 13531 } 13532 else 13533 { 13534 struct bfd_link_hash_entry *bh = NULL; 13535 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL, 13536 s, TOC_BASE_OFF - adjust, 13537 NULL, FALSE, FALSE, &bh); 13538 } 13539 } 13540 return TOCstart; 13541 } 13542 13543 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to 13544 write out any global entry stubs, and PLT relocations. */ 13545 13546 static bfd_boolean 13547 build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf) 13548 { 13549 struct bfd_link_info *info; 13550 struct ppc_link_hash_table *htab; 13551 struct plt_entry *ent; 13552 asection *s; 13553 13554 if (h->root.type == bfd_link_hash_indirect) 13555 return TRUE; 13556 13557 info = inf; 13558 htab = ppc_hash_table (info); 13559 if (htab == NULL) 13560 return FALSE; 13561 13562 for (ent = h->plt.plist; ent != NULL; ent = ent->next) 13563 if (ent->plt.offset != (bfd_vma) -1) 13564 { 13565 /* This symbol has an entry in the procedure linkage 13566 table. Set it up. */ 13567 Elf_Internal_Rela rela; 13568 asection *plt, *relplt; 13569 bfd_byte *loc; 13570 13571 if (!htab->elf.dynamic_sections_created 13572 || h->dynindx == -1) 13573 { 13574 if (!(h->def_regular 13575 && (h->root.type == bfd_link_hash_defined 13576 || h->root.type == bfd_link_hash_defweak))) 13577 continue; 13578 if (h->type == STT_GNU_IFUNC) 13579 { 13580 plt = htab->elf.iplt; 13581 relplt = htab->elf.irelplt; 13582 htab->local_ifunc_resolver = 1; 13583 if (htab->opd_abi) 13584 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL); 13585 else 13586 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE); 13587 } 13588 else 13589 { 13590 plt = htab->pltlocal; 13591 if (bfd_link_pic (info)) 13592 { 13593 relplt = htab->relpltlocal; 13594 if (htab->opd_abi) 13595 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT); 13596 else 13597 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 13598 } 13599 else 13600 relplt = NULL; 13601 } 13602 rela.r_addend = (h->root.u.def.value 13603 + h->root.u.def.section->output_offset 13604 + h->root.u.def.section->output_section->vma 13605 + ent->addend); 13606 13607 if (relplt == NULL) 13608 { 13609 loc = plt->contents + ent->plt.offset; 13610 bfd_put_64 (info->output_bfd, rela.r_addend, loc); 13611 if (htab->opd_abi) 13612 { 13613 bfd_vma toc = elf_gp (info->output_bfd); 13614 toc += htab->sec_info[h->root.u.def.section->id].toc_off; 13615 bfd_put_64 (info->output_bfd, toc, loc + 8); 13616 } 13617 } 13618 else 13619 { 13620 rela.r_offset = (plt->output_section->vma 13621 + plt->output_offset 13622 + ent->plt.offset); 13623 loc = relplt->contents + (relplt->reloc_count++ 13624 * sizeof (Elf64_External_Rela)); 13625 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc); 13626 } 13627 } 13628 else 13629 { 13630 rela.r_offset = (htab->elf.splt->output_section->vma 13631 + htab->elf.splt->output_offset 13632 + ent->plt.offset); 13633 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT); 13634 rela.r_addend = ent->addend; 13635 loc = (htab->elf.srelplt->contents 13636 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab)) 13637 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela))); 13638 if (h->type == STT_GNU_IFUNC && is_static_defined (h)) 13639 htab->maybe_local_ifunc_resolver = 1; 13640 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc); 13641 } 13642 } 13643 13644 if (!h->pointer_equality_needed) 13645 return TRUE; 13646 13647 if (h->def_regular) 13648 return TRUE; 13649 13650 s = htab->global_entry; 13651 if (s == NULL || s->size == 0) 13652 return TRUE; 13653 13654 for (ent = h->plt.plist; ent != NULL; ent = ent->next) 13655 if (ent->plt.offset != (bfd_vma) -1 13656 && ent->addend == 0) 13657 { 13658 bfd_byte *p; 13659 asection *plt; 13660 bfd_vma off; 13661 13662 p = s->contents + h->root.u.def.value; 13663 plt = htab->elf.splt; 13664 if (!htab->elf.dynamic_sections_created 13665 || h->dynindx == -1) 13666 { 13667 if (h->type == STT_GNU_IFUNC) 13668 plt = htab->elf.iplt; 13669 else 13670 plt = htab->pltlocal; 13671 } 13672 off = ent->plt.offset + plt->output_offset + plt->output_section->vma; 13673 off -= h->root.u.def.value + s->output_offset + s->output_section->vma; 13674 13675 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0) 13676 { 13677 info->callbacks->einfo 13678 (_("%P: linkage table error against `%pT'\n"), 13679 h->root.root.string); 13680 bfd_set_error (bfd_error_bad_value); 13681 htab->stub_error = TRUE; 13682 } 13683 13684 htab->stub_count[ppc_stub_global_entry - 1] += 1; 13685 if (htab->params->emit_stub_syms) 13686 { 13687 size_t len = strlen (h->root.root.string); 13688 char *name = bfd_malloc (sizeof "12345678.global_entry." + len); 13689 13690 if (name == NULL) 13691 return FALSE; 13692 13693 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string); 13694 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE); 13695 if (h == NULL) 13696 return FALSE; 13697 if (h->root.type == bfd_link_hash_new) 13698 { 13699 h->root.type = bfd_link_hash_defined; 13700 h->root.u.def.section = s; 13701 h->root.u.def.value = p - s->contents; 13702 h->ref_regular = 1; 13703 h->def_regular = 1; 13704 h->ref_regular_nonweak = 1; 13705 h->forced_local = 1; 13706 h->non_elf = 0; 13707 h->root.linker_def = 1; 13708 } 13709 } 13710 13711 if (PPC_HA (off) != 0) 13712 { 13713 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p); 13714 p += 4; 13715 } 13716 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p); 13717 p += 4; 13718 bfd_put_32 (s->owner, MTCTR_R12, p); 13719 p += 4; 13720 bfd_put_32 (s->owner, BCTR, p); 13721 break; 13722 } 13723 return TRUE; 13724 } 13725 13726 /* Write PLT relocs for locals. */ 13727 13728 static bfd_boolean 13729 write_plt_relocs_for_local_syms (struct bfd_link_info *info) 13730 { 13731 struct ppc_link_hash_table *htab = ppc_hash_table (info); 13732 bfd *ibfd; 13733 13734 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 13735 { 13736 struct got_entry **lgot_ents, **end_lgot_ents; 13737 struct plt_entry **local_plt, **lplt, **end_local_plt; 13738 Elf_Internal_Shdr *symtab_hdr; 13739 bfd_size_type locsymcount; 13740 Elf_Internal_Sym *local_syms = NULL; 13741 struct plt_entry *ent; 13742 13743 if (!is_ppc64_elf (ibfd)) 13744 continue; 13745 13746 lgot_ents = elf_local_got_ents (ibfd); 13747 if (!lgot_ents) 13748 continue; 13749 13750 symtab_hdr = &elf_symtab_hdr (ibfd); 13751 locsymcount = symtab_hdr->sh_info; 13752 end_lgot_ents = lgot_ents + locsymcount; 13753 local_plt = (struct plt_entry **) end_lgot_ents; 13754 end_local_plt = local_plt + locsymcount; 13755 for (lplt = local_plt; lplt < end_local_plt; ++lplt) 13756 for (ent = *lplt; ent != NULL; ent = ent->next) 13757 if (ent->plt.offset != (bfd_vma) -1) 13758 { 13759 Elf_Internal_Sym *sym; 13760 asection *sym_sec; 13761 asection *plt, *relplt; 13762 bfd_byte *loc; 13763 bfd_vma val; 13764 13765 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms, 13766 lplt - local_plt, ibfd)) 13767 { 13768 if (local_syms != NULL 13769 && symtab_hdr->contents != (unsigned char *) local_syms) 13770 free (local_syms); 13771 return FALSE; 13772 } 13773 13774 val = sym->st_value + ent->addend; 13775 if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC) 13776 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other); 13777 if (sym_sec != NULL && sym_sec->output_section != NULL) 13778 val += sym_sec->output_offset + sym_sec->output_section->vma; 13779 13780 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 13781 { 13782 htab->local_ifunc_resolver = 1; 13783 plt = htab->elf.iplt; 13784 relplt = htab->elf.irelplt; 13785 } 13786 else 13787 { 13788 plt = htab->pltlocal; 13789 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL; 13790 } 13791 13792 if (relplt == NULL) 13793 { 13794 loc = plt->contents + ent->plt.offset; 13795 bfd_put_64 (info->output_bfd, val, loc); 13796 if (htab->opd_abi) 13797 { 13798 bfd_vma toc = elf_gp (ibfd); 13799 bfd_put_64 (info->output_bfd, toc, loc + 8); 13800 } 13801 } 13802 else 13803 { 13804 Elf_Internal_Rela rela; 13805 rela.r_offset = (ent->plt.offset 13806 + plt->output_offset 13807 + plt->output_section->vma); 13808 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 13809 { 13810 if (htab->opd_abi) 13811 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL); 13812 else 13813 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE); 13814 } 13815 else 13816 { 13817 if (htab->opd_abi) 13818 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT); 13819 else 13820 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 13821 } 13822 rela.r_addend = val; 13823 loc = relplt->contents + (relplt->reloc_count++ 13824 * sizeof (Elf64_External_Rela)); 13825 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc); 13826 } 13827 } 13828 13829 if (local_syms != NULL 13830 && symtab_hdr->contents != (unsigned char *) local_syms) 13831 { 13832 if (!info->keep_memory) 13833 free (local_syms); 13834 else 13835 symtab_hdr->contents = (unsigned char *) local_syms; 13836 } 13837 } 13838 return TRUE; 13839 } 13840 13841 /* Build all the stubs associated with the current output file. 13842 The stubs are kept in a hash table attached to the main linker 13843 hash table. This function is called via gldelf64ppc_finish. */ 13844 13845 bfd_boolean 13846 ppc64_elf_build_stubs (struct bfd_link_info *info, 13847 char **stats) 13848 { 13849 struct ppc_link_hash_table *htab = ppc_hash_table (info); 13850 struct map_stub *group; 13851 asection *stub_sec; 13852 bfd_byte *p; 13853 int stub_sec_count = 0; 13854 13855 if (htab == NULL) 13856 return FALSE; 13857 13858 /* Allocate memory to hold the linker stubs. */ 13859 for (group = htab->group; group != NULL; group = group->next) 13860 { 13861 group->eh_size = 0; 13862 group->lr_restore = 0; 13863 if ((stub_sec = group->stub_sec) != NULL 13864 && stub_sec->size != 0) 13865 { 13866 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, 13867 stub_sec->size); 13868 if (stub_sec->contents == NULL) 13869 return FALSE; 13870 stub_sec->size = 0; 13871 } 13872 } 13873 13874 if (htab->glink != NULL && htab->glink->size != 0) 13875 { 13876 unsigned int indx; 13877 bfd_vma plt0; 13878 13879 /* Build the .glink plt call stub. */ 13880 if (htab->params->emit_stub_syms) 13881 { 13882 struct elf_link_hash_entry *h; 13883 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve", 13884 TRUE, FALSE, FALSE); 13885 if (h == NULL) 13886 return FALSE; 13887 if (h->root.type == bfd_link_hash_new) 13888 { 13889 h->root.type = bfd_link_hash_defined; 13890 h->root.u.def.section = htab->glink; 13891 h->root.u.def.value = 8; 13892 h->ref_regular = 1; 13893 h->def_regular = 1; 13894 h->ref_regular_nonweak = 1; 13895 h->forced_local = 1; 13896 h->non_elf = 0; 13897 h->root.linker_def = 1; 13898 } 13899 } 13900 plt0 = (htab->elf.splt->output_section->vma 13901 + htab->elf.splt->output_offset 13902 - 16); 13903 if (info->emitrelocations) 13904 { 13905 Elf_Internal_Rela *r = get_relocs (htab->glink, 1); 13906 if (r == NULL) 13907 return FALSE; 13908 r->r_offset = (htab->glink->output_offset 13909 + htab->glink->output_section->vma); 13910 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64); 13911 r->r_addend = plt0; 13912 } 13913 p = htab->glink->contents; 13914 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset; 13915 bfd_put_64 (htab->glink->owner, plt0, p); 13916 p += 8; 13917 if (htab->opd_abi) 13918 { 13919 bfd_put_32 (htab->glink->owner, MFLR_R12, p); 13920 p += 4; 13921 bfd_put_32 (htab->glink->owner, BCL_20_31, p); 13922 p += 4; 13923 bfd_put_32 (htab->glink->owner, MFLR_R11, p); 13924 p += 4; 13925 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p); 13926 p += 4; 13927 bfd_put_32 (htab->glink->owner, MTLR_R12, p); 13928 p += 4; 13929 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p); 13930 p += 4; 13931 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p); 13932 p += 4; 13933 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p); 13934 p += 4; 13935 bfd_put_32 (htab->glink->owner, MTCTR_R12, p); 13936 p += 4; 13937 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p); 13938 p += 4; 13939 } 13940 else 13941 { 13942 bfd_put_32 (htab->glink->owner, MFLR_R0, p); 13943 p += 4; 13944 bfd_put_32 (htab->glink->owner, BCL_20_31, p); 13945 p += 4; 13946 bfd_put_32 (htab->glink->owner, MFLR_R11, p); 13947 p += 4; 13948 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p); 13949 p += 4; 13950 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p); 13951 p += 4; 13952 bfd_put_32 (htab->glink->owner, MTLR_R0, p); 13953 p += 4; 13954 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p); 13955 p += 4; 13956 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p); 13957 p += 4; 13958 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p); 13959 p += 4; 13960 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p); 13961 p += 4; 13962 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p); 13963 p += 4; 13964 bfd_put_32 (htab->glink->owner, MTCTR_R12, p); 13965 p += 4; 13966 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p); 13967 p += 4; 13968 } 13969 bfd_put_32 (htab->glink->owner, BCTR, p); 13970 p += 4; 13971 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab)); 13972 13973 /* Build the .glink lazy link call stubs. */ 13974 indx = 0; 13975 while (p < htab->glink->contents + htab->glink->size) 13976 { 13977 if (htab->opd_abi) 13978 { 13979 if (indx < 0x8000) 13980 { 13981 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p); 13982 p += 4; 13983 } 13984 else 13985 { 13986 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p); 13987 p += 4; 13988 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), 13989 p); 13990 p += 4; 13991 } 13992 } 13993 bfd_put_32 (htab->glink->owner, 13994 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p); 13995 indx++; 13996 p += 4; 13997 } 13998 } 13999 14000 /* Build .glink global entry stubs, and PLT relocs for globals. */ 14001 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info); 14002 14003 if (!write_plt_relocs_for_local_syms (info)) 14004 return FALSE; 14005 14006 if (htab->brlt != NULL && htab->brlt->size != 0) 14007 { 14008 htab->brlt->contents = bfd_zalloc (htab->brlt->owner, 14009 htab->brlt->size); 14010 if (htab->brlt->contents == NULL) 14011 return FALSE; 14012 } 14013 if (htab->relbrlt != NULL && htab->relbrlt->size != 0) 14014 { 14015 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner, 14016 htab->relbrlt->size); 14017 if (htab->relbrlt->contents == NULL) 14018 return FALSE; 14019 } 14020 14021 /* Build the stubs as directed by the stub hash table. */ 14022 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info); 14023 14024 for (group = htab->group; group != NULL; group = group->next) 14025 if (group->needs_save_res) 14026 group->stub_sec->size += htab->sfpr->size; 14027 14028 if (htab->relbrlt != NULL) 14029 htab->relbrlt->reloc_count = 0; 14030 14031 if (htab->params->plt_stub_align != 0) 14032 for (group = htab->group; group != NULL; group = group->next) 14033 if ((stub_sec = group->stub_sec) != NULL) 14034 { 14035 int align = abs (htab->params->plt_stub_align); 14036 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align); 14037 } 14038 14039 for (group = htab->group; group != NULL; group = group->next) 14040 if (group->needs_save_res) 14041 { 14042 stub_sec = group->stub_sec; 14043 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size, 14044 htab->sfpr->contents, htab->sfpr->size); 14045 if (htab->params->emit_stub_syms) 14046 { 14047 unsigned int i; 14048 14049 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++) 14050 if (!sfpr_define (info, &save_res_funcs[i], stub_sec)) 14051 return FALSE; 14052 } 14053 } 14054 14055 if (htab->glink_eh_frame != NULL 14056 && htab->glink_eh_frame->size != 0) 14057 { 14058 bfd_vma val; 14059 size_t align = 4; 14060 14061 p = htab->glink_eh_frame->contents; 14062 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align; 14063 14064 for (group = htab->group; group != NULL; group = group->next) 14065 if (group->eh_size != 0) 14066 { 14067 /* Offset to stub section. */ 14068 val = (group->stub_sec->output_section->vma 14069 + group->stub_sec->output_offset); 14070 val -= (htab->glink_eh_frame->output_section->vma 14071 + htab->glink_eh_frame->output_offset 14072 + (p + 8 - htab->glink_eh_frame->contents)); 14073 if (val + 0x80000000 > 0xffffffff) 14074 { 14075 _bfd_error_handler 14076 (_("%s offset too large for .eh_frame sdata4 encoding"), 14077 group->stub_sec->name); 14078 return FALSE; 14079 } 14080 bfd_put_32 (htab->elf.dynobj, val, p + 8); 14081 p += (group->eh_size + 17 + 3) & -4; 14082 } 14083 if (htab->glink != NULL && htab->glink->size != 0) 14084 { 14085 /* Offset to .glink. */ 14086 val = (htab->glink->output_section->vma 14087 + htab->glink->output_offset 14088 + 8); 14089 val -= (htab->glink_eh_frame->output_section->vma 14090 + htab->glink_eh_frame->output_offset 14091 + (p + 8 - htab->glink_eh_frame->contents)); 14092 if (val + 0x80000000 > 0xffffffff) 14093 { 14094 _bfd_error_handler 14095 (_("%s offset too large for .eh_frame sdata4 encoding"), 14096 htab->glink->name); 14097 return FALSE; 14098 } 14099 bfd_put_32 (htab->elf.dynobj, val, p + 8); 14100 p += (24 + align - 1) & -align; 14101 } 14102 } 14103 14104 for (group = htab->group; group != NULL; group = group->next) 14105 if ((stub_sec = group->stub_sec) != NULL) 14106 { 14107 stub_sec_count += 1; 14108 if (stub_sec->rawsize != stub_sec->size 14109 && (htab->stub_iteration <= STUB_SHRINK_ITER 14110 || stub_sec->rawsize < stub_sec->size)) 14111 break; 14112 } 14113 14114 if (group != NULL) 14115 { 14116 htab->stub_error = TRUE; 14117 _bfd_error_handler (_("stubs don't match calculated size")); 14118 } 14119 14120 if (htab->stub_error) 14121 return FALSE; 14122 14123 if (stats != NULL) 14124 { 14125 size_t len; 14126 *stats = bfd_malloc (500); 14127 if (*stats == NULL) 14128 return FALSE; 14129 14130 len = sprintf (*stats, 14131 ngettext ("linker stubs in %u group\n", 14132 "linker stubs in %u groups\n", 14133 stub_sec_count), 14134 stub_sec_count); 14135 sprintf (*stats + len, _(" branch %lu\n" 14136 " branch toc adj %lu\n" 14137 " branch notoc %lu\n" 14138 " branch both %lu\n" 14139 " long branch %lu\n" 14140 " long toc adj %lu\n" 14141 " long notoc %lu\n" 14142 " long both %lu\n" 14143 " plt call %lu\n" 14144 " plt call save %lu\n" 14145 " plt call notoc %lu\n" 14146 " plt call both %lu\n" 14147 " global entry %lu"), 14148 htab->stub_count[ppc_stub_long_branch - 1], 14149 htab->stub_count[ppc_stub_long_branch_r2off - 1], 14150 htab->stub_count[ppc_stub_long_branch_notoc - 1], 14151 htab->stub_count[ppc_stub_long_branch_both - 1], 14152 htab->stub_count[ppc_stub_plt_branch - 1], 14153 htab->stub_count[ppc_stub_plt_branch_r2off - 1], 14154 htab->stub_count[ppc_stub_plt_branch_notoc - 1], 14155 htab->stub_count[ppc_stub_plt_branch_both - 1], 14156 htab->stub_count[ppc_stub_plt_call - 1], 14157 htab->stub_count[ppc_stub_plt_call_r2save - 1], 14158 htab->stub_count[ppc_stub_plt_call_notoc - 1], 14159 htab->stub_count[ppc_stub_plt_call_both - 1], 14160 htab->stub_count[ppc_stub_global_entry - 1]); 14161 } 14162 return TRUE; 14163 } 14164 14165 /* What to do when ld finds relocations against symbols defined in 14166 discarded sections. */ 14167 14168 static unsigned int 14169 ppc64_elf_action_discarded (asection *sec) 14170 { 14171 if (strcmp (".opd", sec->name) == 0) 14172 return 0; 14173 14174 if (strcmp (".toc", sec->name) == 0) 14175 return 0; 14176 14177 if (strcmp (".toc1", sec->name) == 0) 14178 return 0; 14179 14180 return _bfd_elf_default_action_discarded (sec); 14181 } 14182 14183 /* These are the dynamic relocations supported by glibc. */ 14184 14185 static bfd_boolean 14186 ppc64_glibc_dynamic_reloc (enum elf_ppc64_reloc_type r_type) 14187 { 14188 switch (r_type) 14189 { 14190 case R_PPC64_RELATIVE: 14191 case R_PPC64_NONE: 14192 case R_PPC64_ADDR64: 14193 case R_PPC64_GLOB_DAT: 14194 case R_PPC64_IRELATIVE: 14195 case R_PPC64_JMP_IREL: 14196 case R_PPC64_JMP_SLOT: 14197 case R_PPC64_DTPMOD64: 14198 case R_PPC64_DTPREL64: 14199 case R_PPC64_TPREL64: 14200 case R_PPC64_TPREL16_LO_DS: 14201 case R_PPC64_TPREL16_DS: 14202 case R_PPC64_TPREL16: 14203 case R_PPC64_TPREL16_LO: 14204 case R_PPC64_TPREL16_HI: 14205 case R_PPC64_TPREL16_HIGH: 14206 case R_PPC64_TPREL16_HA: 14207 case R_PPC64_TPREL16_HIGHA: 14208 case R_PPC64_TPREL16_HIGHER: 14209 case R_PPC64_TPREL16_HIGHEST: 14210 case R_PPC64_TPREL16_HIGHERA: 14211 case R_PPC64_TPREL16_HIGHESTA: 14212 case R_PPC64_ADDR16_LO_DS: 14213 case R_PPC64_ADDR16_LO: 14214 case R_PPC64_ADDR16_HI: 14215 case R_PPC64_ADDR16_HIGH: 14216 case R_PPC64_ADDR16_HA: 14217 case R_PPC64_ADDR16_HIGHA: 14218 case R_PPC64_REL30: 14219 case R_PPC64_COPY: 14220 case R_PPC64_UADDR64: 14221 case R_PPC64_UADDR32: 14222 case R_PPC64_ADDR32: 14223 case R_PPC64_ADDR24: 14224 case R_PPC64_ADDR16: 14225 case R_PPC64_UADDR16: 14226 case R_PPC64_ADDR16_DS: 14227 case R_PPC64_ADDR16_HIGHER: 14228 case R_PPC64_ADDR16_HIGHEST: 14229 case R_PPC64_ADDR16_HIGHERA: 14230 case R_PPC64_ADDR16_HIGHESTA: 14231 case R_PPC64_ADDR14: 14232 case R_PPC64_ADDR14_BRTAKEN: 14233 case R_PPC64_ADDR14_BRNTAKEN: 14234 case R_PPC64_REL32: 14235 case R_PPC64_REL64: 14236 return TRUE; 14237 14238 default: 14239 return FALSE; 14240 } 14241 } 14242 14243 /* The RELOCATE_SECTION function is called by the ELF backend linker 14244 to handle the relocations for a section. 14245 14246 The relocs are always passed as Rela structures; if the section 14247 actually uses Rel structures, the r_addend field will always be 14248 zero. 14249 14250 This function is responsible for adjust the section contents as 14251 necessary, and (if using Rela relocs and generating a 14252 relocatable output file) adjusting the reloc addend as 14253 necessary. 14254 14255 This function does not have to worry about setting the reloc 14256 address or the reloc symbol index. 14257 14258 LOCAL_SYMS is a pointer to the swapped in local symbols. 14259 14260 LOCAL_SECTIONS is an array giving the section in the input file 14261 corresponding to the st_shndx field of each local symbol. 14262 14263 The global hash table entry for the global symbols can be found 14264 via elf_sym_hashes (input_bfd). 14265 14266 When generating relocatable output, this function must handle 14267 STB_LOCAL/STT_SECTION symbols specially. The output symbol is 14268 going to be the section symbol corresponding to the output 14269 section, which means that the addend must be adjusted 14270 accordingly. */ 14271 14272 static bfd_boolean 14273 ppc64_elf_relocate_section (bfd *output_bfd, 14274 struct bfd_link_info *info, 14275 bfd *input_bfd, 14276 asection *input_section, 14277 bfd_byte *contents, 14278 Elf_Internal_Rela *relocs, 14279 Elf_Internal_Sym *local_syms, 14280 asection **local_sections) 14281 { 14282 struct ppc_link_hash_table *htab; 14283 Elf_Internal_Shdr *symtab_hdr; 14284 struct elf_link_hash_entry **sym_hashes; 14285 Elf_Internal_Rela *rel; 14286 Elf_Internal_Rela *wrel; 14287 Elf_Internal_Rela *relend; 14288 Elf_Internal_Rela outrel; 14289 bfd_byte *loc; 14290 struct got_entry **local_got_ents; 14291 bfd_vma TOCstart; 14292 bfd_boolean ret = TRUE; 14293 bfd_boolean is_opd; 14294 /* Assume 'at' branch hints. */ 14295 bfd_boolean is_isa_v2 = TRUE; 14296 bfd_boolean warned_dynamic = FALSE; 14297 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0); 14298 14299 /* Initialize howto table if needed. */ 14300 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 14301 ppc_howto_init (); 14302 14303 htab = ppc_hash_table (info); 14304 if (htab == NULL) 14305 return FALSE; 14306 14307 /* Don't relocate stub sections. */ 14308 if (input_section->owner == htab->params->stub_bfd) 14309 return TRUE; 14310 14311 if (!is_ppc64_elf (input_bfd)) 14312 { 14313 bfd_set_error (bfd_error_wrong_format); 14314 return FALSE; 14315 } 14316 14317 local_got_ents = elf_local_got_ents (input_bfd); 14318 TOCstart = elf_gp (output_bfd); 14319 symtab_hdr = &elf_symtab_hdr (input_bfd); 14320 sym_hashes = elf_sym_hashes (input_bfd); 14321 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd; 14322 14323 rel = wrel = relocs; 14324 relend = relocs + input_section->reloc_count; 14325 for (; rel < relend; wrel++, rel++) 14326 { 14327 enum elf_ppc64_reloc_type r_type; 14328 bfd_vma addend; 14329 bfd_reloc_status_type r; 14330 Elf_Internal_Sym *sym; 14331 asection *sec; 14332 struct elf_link_hash_entry *h_elf; 14333 struct ppc_link_hash_entry *h; 14334 struct ppc_link_hash_entry *fdh; 14335 const char *sym_name; 14336 unsigned long r_symndx, toc_symndx; 14337 bfd_vma toc_addend; 14338 unsigned char tls_mask, tls_gd, tls_type; 14339 unsigned char sym_type; 14340 bfd_vma relocation; 14341 bfd_boolean unresolved_reloc, save_unresolved_reloc; 14342 bfd_boolean warned; 14343 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest; 14344 unsigned int insn; 14345 unsigned int mask; 14346 struct ppc_stub_hash_entry *stub_entry; 14347 bfd_vma max_br_offset; 14348 bfd_vma from; 14349 Elf_Internal_Rela orig_rel; 14350 reloc_howto_type *howto; 14351 struct reloc_howto_struct alt_howto; 14352 uint64_t pinsn; 14353 bfd_vma offset; 14354 14355 again: 14356 orig_rel = *rel; 14357 14358 r_type = ELF64_R_TYPE (rel->r_info); 14359 r_symndx = ELF64_R_SYM (rel->r_info); 14360 14361 /* For old style R_PPC64_TOC relocs with a zero symbol, use the 14362 symbol of the previous ADDR64 reloc. The symbol gives us the 14363 proper TOC base to use. */ 14364 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC) 14365 && wrel != relocs 14366 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64 14367 && is_opd) 14368 r_symndx = ELF64_R_SYM (wrel[-1].r_info); 14369 14370 sym = NULL; 14371 sec = NULL; 14372 h_elf = NULL; 14373 sym_name = NULL; 14374 unresolved_reloc = FALSE; 14375 warned = FALSE; 14376 14377 if (r_symndx < symtab_hdr->sh_info) 14378 { 14379 /* It's a local symbol. */ 14380 struct _opd_sec_data *opd; 14381 14382 sym = local_syms + r_symndx; 14383 sec = local_sections[r_symndx]; 14384 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec); 14385 sym_type = ELF64_ST_TYPE (sym->st_info); 14386 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 14387 opd = get_opd_info (sec); 14388 if (opd != NULL && opd->adjust != NULL) 14389 { 14390 long adjust = opd->adjust[OPD_NDX (sym->st_value 14391 + rel->r_addend)]; 14392 if (adjust == -1) 14393 relocation = 0; 14394 else 14395 { 14396 /* If this is a relocation against the opd section sym 14397 and we have edited .opd, adjust the reloc addend so 14398 that ld -r and ld --emit-relocs output is correct. 14399 If it is a reloc against some other .opd symbol, 14400 then the symbol value will be adjusted later. */ 14401 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) 14402 rel->r_addend += adjust; 14403 else 14404 relocation += adjust; 14405 } 14406 } 14407 } 14408 else 14409 { 14410 bfd_boolean ignored; 14411 14412 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 14413 r_symndx, symtab_hdr, sym_hashes, 14414 h_elf, sec, relocation, 14415 unresolved_reloc, warned, ignored); 14416 sym_name = h_elf->root.root.string; 14417 sym_type = h_elf->type; 14418 if (sec != NULL 14419 && sec->owner == output_bfd 14420 && strcmp (sec->name, ".opd") == 0) 14421 { 14422 /* This is a symbol defined in a linker script. All 14423 such are defined in output sections, even those 14424 defined by simple assignment from a symbol defined in 14425 an input section. Transfer the symbol to an 14426 appropriate input .opd section, so that a branch to 14427 this symbol will be mapped to the location specified 14428 by the opd entry. */ 14429 struct bfd_link_order *lo; 14430 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next) 14431 if (lo->type == bfd_indirect_link_order) 14432 { 14433 asection *isec = lo->u.indirect.section; 14434 if (h_elf->root.u.def.value >= isec->output_offset 14435 && h_elf->root.u.def.value < (isec->output_offset 14436 + isec->size)) 14437 { 14438 h_elf->root.u.def.value -= isec->output_offset; 14439 h_elf->root.u.def.section = isec; 14440 sec = isec; 14441 break; 14442 } 14443 } 14444 } 14445 } 14446 h = (struct ppc_link_hash_entry *) h_elf; 14447 14448 if (sec != NULL && discarded_section (sec)) 14449 { 14450 _bfd_clear_contents (ppc64_elf_howto_table[r_type], 14451 input_bfd, input_section, 14452 contents, rel->r_offset); 14453 wrel->r_offset = rel->r_offset; 14454 wrel->r_info = 0; 14455 wrel->r_addend = 0; 14456 14457 /* For ld -r, remove relocations in debug sections against 14458 symbols defined in discarded sections. Not done for 14459 non-debug to preserve relocs in .eh_frame which the 14460 eh_frame editing code expects to be present. */ 14461 if (bfd_link_relocatable (info) 14462 && (input_section->flags & SEC_DEBUGGING)) 14463 wrel--; 14464 14465 continue; 14466 } 14467 14468 if (bfd_link_relocatable (info)) 14469 goto copy_reloc; 14470 14471 if (h != NULL && &h->elf == htab->elf.hgot) 14472 { 14473 relocation = TOCstart + htab->sec_info[input_section->id].toc_off; 14474 sec = bfd_abs_section_ptr; 14475 unresolved_reloc = FALSE; 14476 } 14477 14478 /* TLS optimizations. Replace instruction sequences and relocs 14479 based on information we collected in tls_optimize. We edit 14480 RELOCS so that --emit-relocs will output something sensible 14481 for the final instruction stream. */ 14482 tls_mask = 0; 14483 tls_gd = 0; 14484 toc_symndx = 0; 14485 if (h != NULL) 14486 tls_mask = h->tls_mask; 14487 else if (local_got_ents != NULL) 14488 { 14489 struct plt_entry **local_plt = (struct plt_entry **) 14490 (local_got_ents + symtab_hdr->sh_info); 14491 unsigned char *lgot_masks = (unsigned char *) 14492 (local_plt + symtab_hdr->sh_info); 14493 tls_mask = lgot_masks[r_symndx]; 14494 } 14495 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK)) 14496 && (r_type == R_PPC64_TLS 14497 || r_type == R_PPC64_TLSGD 14498 || r_type == R_PPC64_TLSLD)) 14499 { 14500 /* Check for toc tls entries. */ 14501 unsigned char *toc_tls; 14502 14503 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend, 14504 &local_syms, rel, input_bfd)) 14505 return FALSE; 14506 14507 if (toc_tls) 14508 tls_mask = *toc_tls; 14509 } 14510 14511 /* Check that tls relocs are used with tls syms, and non-tls 14512 relocs are used with non-tls syms. */ 14513 if (r_symndx != STN_UNDEF 14514 && r_type != R_PPC64_NONE 14515 && (h == NULL 14516 || h->elf.root.type == bfd_link_hash_defined 14517 || h->elf.root.type == bfd_link_hash_defweak) 14518 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS)) 14519 { 14520 if ((tls_mask & TLS_TLS) != 0 14521 && (r_type == R_PPC64_TLS 14522 || r_type == R_PPC64_TLSGD 14523 || r_type == R_PPC64_TLSLD)) 14524 /* R_PPC64_TLS is OK against a symbol in the TOC. */ 14525 ; 14526 else 14527 info->callbacks->einfo 14528 (!IS_PPC64_TLS_RELOC (r_type) 14529 /* xgettext:c-format */ 14530 ? _("%H: %s used with TLS symbol `%pT'\n") 14531 /* xgettext:c-format */ 14532 : _("%H: %s used with non-TLS symbol `%pT'\n"), 14533 input_bfd, input_section, rel->r_offset, 14534 ppc64_elf_howto_table[r_type]->name, 14535 sym_name); 14536 } 14537 14538 /* Ensure reloc mapping code below stays sane. */ 14539 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1 14540 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1 14541 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3) 14542 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3) 14543 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3) 14544 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3) 14545 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3) 14546 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3) 14547 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3) 14548 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3)) 14549 abort (); 14550 14551 switch (r_type) 14552 { 14553 default: 14554 break; 14555 14556 case R_PPC64_LO_DS_OPT: 14557 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset); 14558 if ((insn & (0x3fu << 26)) != 58u << 26) 14559 abort (); 14560 insn += (14u << 26) - (58u << 26); 14561 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset); 14562 r_type = R_PPC64_TOC16_LO; 14563 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14564 break; 14565 14566 case R_PPC64_TOC16: 14567 case R_PPC64_TOC16_LO: 14568 case R_PPC64_TOC16_DS: 14569 case R_PPC64_TOC16_LO_DS: 14570 { 14571 /* Check for toc tls entries. */ 14572 unsigned char *toc_tls; 14573 int retval; 14574 14575 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend, 14576 &local_syms, rel, input_bfd); 14577 if (retval == 0) 14578 return FALSE; 14579 14580 if (toc_tls) 14581 { 14582 tls_mask = *toc_tls; 14583 if (r_type == R_PPC64_TOC16_DS 14584 || r_type == R_PPC64_TOC16_LO_DS) 14585 { 14586 if ((tls_mask & TLS_TLS) != 0 14587 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0) 14588 goto toctprel; 14589 } 14590 else 14591 { 14592 /* If we found a GD reloc pair, then we might be 14593 doing a GD->IE transition. */ 14594 if (retval == 2) 14595 { 14596 tls_gd = TLS_GDIE; 14597 if ((tls_mask & TLS_TLS) != 0 14598 && (tls_mask & TLS_GD) == 0) 14599 goto tls_ldgd_opt; 14600 } 14601 else if (retval == 3) 14602 { 14603 if ((tls_mask & TLS_TLS) != 0 14604 && (tls_mask & TLS_LD) == 0) 14605 goto tls_ldgd_opt; 14606 } 14607 } 14608 } 14609 } 14610 break; 14611 14612 case R_PPC64_GOT_TPREL16_HI: 14613 case R_PPC64_GOT_TPREL16_HA: 14614 if ((tls_mask & TLS_TLS) != 0 14615 && (tls_mask & TLS_TPREL) == 0) 14616 { 14617 rel->r_offset -= d_offset; 14618 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset); 14619 r_type = R_PPC64_NONE; 14620 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14621 } 14622 break; 14623 14624 case R_PPC64_GOT_TPREL16_DS: 14625 case R_PPC64_GOT_TPREL16_LO_DS: 14626 if ((tls_mask & TLS_TLS) != 0 14627 && (tls_mask & TLS_TPREL) == 0) 14628 { 14629 toctprel: 14630 insn = bfd_get_32 (input_bfd, 14631 contents + rel->r_offset - d_offset); 14632 insn &= 31 << 21; 14633 insn |= 0x3c0d0000; /* addis 0,13,0 */ 14634 bfd_put_32 (input_bfd, insn, 14635 contents + rel->r_offset - d_offset); 14636 r_type = R_PPC64_TPREL16_HA; 14637 if (toc_symndx != 0) 14638 { 14639 rel->r_info = ELF64_R_INFO (toc_symndx, r_type); 14640 rel->r_addend = toc_addend; 14641 /* We changed the symbol. Start over in order to 14642 get h, sym, sec etc. right. */ 14643 goto again; 14644 } 14645 else 14646 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14647 } 14648 break; 14649 14650 case R_PPC64_GOT_TPREL34: 14651 if ((tls_mask & TLS_TLS) != 0 14652 && (tls_mask & TLS_TPREL) == 0) 14653 { 14654 /* pld ra,sym@got@tprel@pcrel -> paddi ra,r13,sym@tprel */ 14655 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset); 14656 pinsn <<= 32; 14657 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 14658 pinsn += ((2ULL << 56) + (-1ULL << 52) 14659 + (14ULL << 26) - (57ULL << 26) + (13ULL << 16)); 14660 bfd_put_32 (input_bfd, pinsn >> 32, 14661 contents + rel->r_offset); 14662 bfd_put_32 (input_bfd, pinsn & 0xffffffff, 14663 contents + rel->r_offset + 4); 14664 r_type = R_PPC64_TPREL34; 14665 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14666 } 14667 break; 14668 14669 case R_PPC64_TLS: 14670 if ((tls_mask & TLS_TLS) != 0 14671 && (tls_mask & TLS_TPREL) == 0) 14672 { 14673 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3)); 14674 insn = _bfd_elf_ppc_at_tls_transform (insn, 13); 14675 if (insn == 0) 14676 break; 14677 if ((rel->r_offset & 3) == 0) 14678 { 14679 bfd_put_32 (input_bfd, insn, contents + rel->r_offset); 14680 /* Was PPC64_TLS which sits on insn boundary, now 14681 PPC64_TPREL16_LO which is at low-order half-word. */ 14682 rel->r_offset += d_offset; 14683 r_type = R_PPC64_TPREL16_LO; 14684 if (toc_symndx != 0) 14685 { 14686 rel->r_info = ELF64_R_INFO (toc_symndx, r_type); 14687 rel->r_addend = toc_addend; 14688 /* We changed the symbol. Start over in order to 14689 get h, sym, sec etc. right. */ 14690 goto again; 14691 } 14692 else 14693 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14694 } 14695 else if ((rel->r_offset & 3) == 1) 14696 { 14697 /* For pcrel IE to LE we already have the full 14698 offset and thus don't need an addi here. A nop 14699 or mr will do. */ 14700 if ((insn & (0x3fu << 26)) == 14 << 26) 14701 { 14702 /* Extract regs from addi rt,ra,si. */ 14703 unsigned int rt = (insn >> 21) & 0x1f; 14704 unsigned int ra = (insn >> 16) & 0x1f; 14705 if (rt == ra) 14706 insn = NOP; 14707 else 14708 { 14709 /* Build or ra,rs,rb with rb==rs, ie. mr ra,rs. */ 14710 insn = (rt << 16) | (ra << 21) | (ra << 11); 14711 insn |= (31u << 26) | (444u << 1); 14712 } 14713 } 14714 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - 1); 14715 } 14716 } 14717 break; 14718 14719 case R_PPC64_GOT_TLSGD16_HI: 14720 case R_PPC64_GOT_TLSGD16_HA: 14721 tls_gd = TLS_GDIE; 14722 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0) 14723 goto tls_gdld_hi; 14724 break; 14725 14726 case R_PPC64_GOT_TLSLD16_HI: 14727 case R_PPC64_GOT_TLSLD16_HA: 14728 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0) 14729 { 14730 tls_gdld_hi: 14731 if ((tls_mask & tls_gd) != 0) 14732 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3) 14733 + R_PPC64_GOT_TPREL16_DS); 14734 else 14735 { 14736 rel->r_offset -= d_offset; 14737 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset); 14738 r_type = R_PPC64_NONE; 14739 } 14740 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14741 } 14742 break; 14743 14744 case R_PPC64_GOT_TLSGD16: 14745 case R_PPC64_GOT_TLSGD16_LO: 14746 tls_gd = TLS_GDIE; 14747 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0) 14748 goto tls_ldgd_opt; 14749 break; 14750 14751 case R_PPC64_GOT_TLSLD16: 14752 case R_PPC64_GOT_TLSLD16_LO: 14753 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0) 14754 { 14755 unsigned int insn1, insn2; 14756 14757 tls_ldgd_opt: 14758 offset = (bfd_vma) -1; 14759 /* If not using the newer R_PPC64_TLSGD/LD to mark 14760 __tls_get_addr calls, we must trust that the call 14761 stays with its arg setup insns, ie. that the next 14762 reloc is the __tls_get_addr call associated with 14763 the current reloc. Edit both insns. */ 14764 if (input_section->nomark_tls_get_addr 14765 && rel + 1 < relend 14766 && branch_reloc_hash_match (input_bfd, rel + 1, 14767 htab->tls_get_addr, 14768 htab->tls_get_addr_fd)) 14769 offset = rel[1].r_offset; 14770 /* We read the low GOT_TLS (or TOC16) insn because we 14771 need to keep the destination reg. It may be 14772 something other than the usual r3, and moved to r3 14773 before the call by intervening code. */ 14774 insn1 = bfd_get_32 (input_bfd, 14775 contents + rel->r_offset - d_offset); 14776 if ((tls_mask & tls_gd) != 0) 14777 { 14778 /* IE */ 14779 insn1 &= (0x1f << 21) | (0x1f << 16); 14780 insn1 |= 58u << 26; /* ld */ 14781 insn2 = 0x7c636a14; /* add 3,3,13 */ 14782 if (offset != (bfd_vma) -1) 14783 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE); 14784 if (r_type == R_PPC64_TOC16 14785 || r_type == R_PPC64_TOC16_LO) 14786 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16; 14787 else 14788 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 1)) & 1) 14789 + R_PPC64_GOT_TPREL16_DS); 14790 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14791 } 14792 else 14793 { 14794 /* LE */ 14795 insn1 &= 0x1f << 21; 14796 insn1 |= 0x3c0d0000; /* addis r,13,0 */ 14797 insn2 = 0x38630000; /* addi 3,3,0 */ 14798 if (tls_gd == 0) 14799 { 14800 /* Was an LD reloc. */ 14801 r_symndx = STN_UNDEF; 14802 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET; 14803 } 14804 else if (toc_symndx != 0) 14805 { 14806 r_symndx = toc_symndx; 14807 rel->r_addend = toc_addend; 14808 } 14809 r_type = R_PPC64_TPREL16_HA; 14810 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14811 if (offset != (bfd_vma) -1) 14812 { 14813 rel[1].r_info = ELF64_R_INFO (r_symndx, 14814 R_PPC64_TPREL16_LO); 14815 rel[1].r_offset = offset + d_offset; 14816 rel[1].r_addend = rel->r_addend; 14817 } 14818 } 14819 bfd_put_32 (input_bfd, insn1, 14820 contents + rel->r_offset - d_offset); 14821 if (offset != (bfd_vma) -1) 14822 { 14823 bfd_put_32 (input_bfd, insn2, contents + offset); 14824 if (offset + 8 <= input_section->size) 14825 { 14826 insn2 = bfd_get_32 (input_bfd, contents + offset + 4); 14827 if (insn2 == LD_R2_0R1 + STK_TOC (htab)) 14828 bfd_put_32 (input_bfd, NOP, contents + offset + 4); 14829 } 14830 } 14831 if ((tls_mask & tls_gd) == 0 14832 && (tls_gd == 0 || toc_symndx != 0)) 14833 { 14834 /* We changed the symbol. Start over in order 14835 to get h, sym, sec etc. right. */ 14836 goto again; 14837 } 14838 } 14839 break; 14840 14841 case R_PPC64_GOT_TLSGD34: 14842 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0) 14843 { 14844 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset); 14845 pinsn <<= 32; 14846 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 14847 if ((tls_mask & TLS_GDIE) != 0) 14848 { 14849 /* IE, pla -> pld */ 14850 pinsn += (-2ULL << 56) + (57ULL << 26) - (14ULL << 26); 14851 r_type = R_PPC64_GOT_TPREL34; 14852 } 14853 else 14854 { 14855 /* LE, pla pcrel -> paddi r13 */ 14856 pinsn += (-1ULL << 52) + (13ULL << 16); 14857 r_type = R_PPC64_TPREL34; 14858 } 14859 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14860 bfd_put_32 (input_bfd, pinsn >> 32, 14861 contents + rel->r_offset); 14862 bfd_put_32 (input_bfd, pinsn & 0xffffffff, 14863 contents + rel->r_offset + 4); 14864 } 14865 break; 14866 14867 case R_PPC64_GOT_TLSLD34: 14868 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0) 14869 { 14870 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset); 14871 pinsn <<= 32; 14872 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 14873 pinsn += (-1ULL << 52) + (13ULL << 16); 14874 bfd_put_32 (input_bfd, pinsn >> 32, 14875 contents + rel->r_offset); 14876 bfd_put_32 (input_bfd, pinsn & 0xffffffff, 14877 contents + rel->r_offset + 4); 14878 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET; 14879 r_symndx = STN_UNDEF; 14880 r_type = R_PPC64_TPREL34; 14881 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14882 goto again; 14883 } 14884 break; 14885 14886 case R_PPC64_TLSGD: 14887 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0 14888 && rel + 1 < relend) 14889 { 14890 unsigned int insn2; 14891 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info); 14892 14893 offset = rel->r_offset; 14894 if (is_plt_seq_reloc (r_type1)) 14895 { 14896 bfd_put_32 (output_bfd, NOP, contents + offset); 14897 if (r_type1 == R_PPC64_PLT_PCREL34 14898 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC) 14899 bfd_put_32 (output_bfd, NOP, contents + offset + 4); 14900 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE); 14901 break; 14902 } 14903 14904 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL) 14905 bfd_put_32 (output_bfd, NOP, contents + offset + 4); 14906 14907 if ((tls_mask & TLS_GDIE) != 0) 14908 { 14909 /* IE */ 14910 r_type = R_PPC64_NONE; 14911 insn2 = 0x7c636a14; /* add 3,3,13 */ 14912 } 14913 else 14914 { 14915 /* LE */ 14916 if (toc_symndx != 0) 14917 { 14918 r_symndx = toc_symndx; 14919 rel->r_addend = toc_addend; 14920 } 14921 if (r_type1 == R_PPC64_REL24_NOTOC 14922 || r_type1 == R_PPC64_PLTCALL_NOTOC) 14923 { 14924 r_type = R_PPC64_NONE; 14925 insn2 = NOP; 14926 } 14927 else 14928 { 14929 rel->r_offset = offset + d_offset; 14930 r_type = R_PPC64_TPREL16_LO; 14931 insn2 = 0x38630000; /* addi 3,3,0 */ 14932 } 14933 } 14934 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14935 /* Zap the reloc on the _tls_get_addr call too. */ 14936 BFD_ASSERT (offset == rel[1].r_offset); 14937 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE); 14938 bfd_put_32 (input_bfd, insn2, contents + offset); 14939 if ((tls_mask & TLS_GDIE) == 0 14940 && toc_symndx != 0 14941 && r_type != R_PPC64_NONE) 14942 goto again; 14943 } 14944 break; 14945 14946 case R_PPC64_TLSLD: 14947 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0 14948 && rel + 1 < relend) 14949 { 14950 unsigned int insn2; 14951 enum elf_ppc64_reloc_type r_type1 = ELF64_R_TYPE (rel[1].r_info); 14952 14953 offset = rel->r_offset; 14954 if (is_plt_seq_reloc (r_type1)) 14955 { 14956 bfd_put_32 (output_bfd, NOP, contents + offset); 14957 if (r_type1 == R_PPC64_PLT_PCREL34 14958 || r_type1 == R_PPC64_PLT_PCREL34_NOTOC) 14959 bfd_put_32 (output_bfd, NOP, contents + offset + 4); 14960 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE); 14961 break; 14962 } 14963 14964 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL) 14965 bfd_put_32 (output_bfd, NOP, contents + offset + 4); 14966 14967 if (r_type1 == R_PPC64_REL24_NOTOC 14968 || r_type1 == R_PPC64_PLTCALL_NOTOC) 14969 { 14970 r_type = R_PPC64_NONE; 14971 insn2 = NOP; 14972 } 14973 else 14974 { 14975 rel->r_offset = offset + d_offset; 14976 r_symndx = STN_UNDEF; 14977 r_type = R_PPC64_TPREL16_LO; 14978 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET; 14979 insn2 = 0x38630000; /* addi 3,3,0 */ 14980 } 14981 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 14982 /* Zap the reloc on the _tls_get_addr call too. */ 14983 BFD_ASSERT (offset == rel[1].r_offset); 14984 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE); 14985 bfd_put_32 (input_bfd, insn2, contents + offset); 14986 if (r_type != R_PPC64_NONE) 14987 goto again; 14988 } 14989 break; 14990 14991 case R_PPC64_DTPMOD64: 14992 if (rel + 1 < relend 14993 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64) 14994 && rel[1].r_offset == rel->r_offset + 8) 14995 { 14996 if ((tls_mask & TLS_GD) == 0) 14997 { 14998 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE); 14999 if ((tls_mask & TLS_GDIE) != 0) 15000 r_type = R_PPC64_TPREL64; 15001 else 15002 { 15003 bfd_put_64 (output_bfd, 1, contents + rel->r_offset); 15004 r_type = R_PPC64_NONE; 15005 } 15006 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15007 } 15008 } 15009 else 15010 { 15011 if ((tls_mask & TLS_LD) == 0) 15012 { 15013 bfd_put_64 (output_bfd, 1, contents + rel->r_offset); 15014 r_type = R_PPC64_NONE; 15015 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15016 } 15017 } 15018 break; 15019 15020 case R_PPC64_TPREL64: 15021 if ((tls_mask & TLS_TPREL) == 0) 15022 { 15023 r_type = R_PPC64_NONE; 15024 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15025 } 15026 break; 15027 15028 case R_PPC64_ENTRY: 15029 relocation = TOCstart + htab->sec_info[input_section->id].toc_off; 15030 if (!bfd_link_pic (info) 15031 && !info->traditional_format 15032 && relocation + 0x80008000 <= 0xffffffff) 15033 { 15034 unsigned int insn1, insn2; 15035 15036 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset); 15037 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 15038 if ((insn1 & ~0xfffc) == LD_R2_0R12 15039 && insn2 == ADD_R2_R2_R12) 15040 { 15041 bfd_put_32 (input_bfd, 15042 LIS_R2 + PPC_HA (relocation), 15043 contents + rel->r_offset); 15044 bfd_put_32 (input_bfd, 15045 ADDI_R2_R2 + PPC_LO (relocation), 15046 contents + rel->r_offset + 4); 15047 } 15048 } 15049 else 15050 { 15051 relocation -= (rel->r_offset 15052 + input_section->output_offset 15053 + input_section->output_section->vma); 15054 if (relocation + 0x80008000 <= 0xffffffff) 15055 { 15056 unsigned int insn1, insn2; 15057 15058 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset); 15059 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 15060 if ((insn1 & ~0xfffc) == LD_R2_0R12 15061 && insn2 == ADD_R2_R2_R12) 15062 { 15063 bfd_put_32 (input_bfd, 15064 ADDIS_R2_R12 + PPC_HA (relocation), 15065 contents + rel->r_offset); 15066 bfd_put_32 (input_bfd, 15067 ADDI_R2_R2 + PPC_LO (relocation), 15068 contents + rel->r_offset + 4); 15069 } 15070 } 15071 } 15072 break; 15073 15074 case R_PPC64_REL16_HA: 15075 /* If we are generating a non-PIC executable, edit 15076 . 0: addis 2,12,.TOC.-0b@ha 15077 . addi 2,2,.TOC.-0b@l 15078 used by ELFv2 global entry points to set up r2, to 15079 . lis 2,.TOC.@ha 15080 . addi 2,2,.TOC.@l 15081 if .TOC. is in range. */ 15082 if (!bfd_link_pic (info) 15083 && !info->traditional_format 15084 && !htab->opd_abi 15085 && rel->r_addend == d_offset 15086 && h != NULL && &h->elf == htab->elf.hgot 15087 && rel + 1 < relend 15088 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO) 15089 && rel[1].r_offset == rel->r_offset + 4 15090 && rel[1].r_addend == rel->r_addend + 4 15091 && relocation + 0x80008000 <= 0xffffffff) 15092 { 15093 unsigned int insn1, insn2; 15094 offset = rel->r_offset - d_offset; 15095 insn1 = bfd_get_32 (input_bfd, contents + offset); 15096 insn2 = bfd_get_32 (input_bfd, contents + offset + 4); 15097 if ((insn1 & 0xffff0000) == ADDIS_R2_R12 15098 && (insn2 & 0xffff0000) == ADDI_R2_R2) 15099 { 15100 r_type = R_PPC64_ADDR16_HA; 15101 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15102 rel->r_addend -= d_offset; 15103 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO); 15104 rel[1].r_addend -= d_offset + 4; 15105 bfd_put_32 (input_bfd, LIS_R2, contents + offset); 15106 } 15107 } 15108 break; 15109 } 15110 15111 /* Handle other relocations that tweak non-addend part of insn. */ 15112 insn = 0; 15113 max_br_offset = 1 << 25; 15114 addend = rel->r_addend; 15115 reloc_dest = DEST_NORMAL; 15116 switch (r_type) 15117 { 15118 default: 15119 break; 15120 15121 case R_PPC64_TOCSAVE: 15122 if (relocation + addend == (rel->r_offset 15123 + input_section->output_offset 15124 + input_section->output_section->vma) 15125 && tocsave_find (htab, NO_INSERT, 15126 &local_syms, rel, input_bfd)) 15127 { 15128 insn = bfd_get_32 (input_bfd, contents + rel->r_offset); 15129 if (insn == NOP 15130 || insn == CROR_151515 || insn == CROR_313131) 15131 bfd_put_32 (input_bfd, 15132 STD_R2_0R1 + STK_TOC (htab), 15133 contents + rel->r_offset); 15134 } 15135 break; 15136 15137 /* Branch taken prediction relocations. */ 15138 case R_PPC64_ADDR14_BRTAKEN: 15139 case R_PPC64_REL14_BRTAKEN: 15140 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */ 15141 /* Fall through. */ 15142 15143 /* Branch not taken prediction relocations. */ 15144 case R_PPC64_ADDR14_BRNTAKEN: 15145 case R_PPC64_REL14_BRNTAKEN: 15146 insn |= bfd_get_32 (input_bfd, 15147 contents + rel->r_offset) & ~(0x01 << 21); 15148 /* Fall through. */ 15149 15150 case R_PPC64_REL14: 15151 max_br_offset = 1 << 15; 15152 /* Fall through. */ 15153 15154 case R_PPC64_REL24: 15155 case R_PPC64_REL24_NOTOC: 15156 case R_PPC64_PLTCALL: 15157 case R_PPC64_PLTCALL_NOTOC: 15158 /* Calls to functions with a different TOC, such as calls to 15159 shared objects, need to alter the TOC pointer. This is 15160 done using a linkage stub. A REL24 branching to these 15161 linkage stubs needs to be followed by a nop, as the nop 15162 will be replaced with an instruction to restore the TOC 15163 base pointer. */ 15164 fdh = h; 15165 if (h != NULL 15166 && h->oh != NULL 15167 && h->oh->is_func_descriptor) 15168 fdh = ppc_follow_link (h->oh); 15169 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel, 15170 htab); 15171 if ((r_type == R_PPC64_PLTCALL 15172 || r_type == R_PPC64_PLTCALL_NOTOC) 15173 && stub_entry != NULL 15174 && stub_entry->stub_type >= ppc_stub_plt_call 15175 && stub_entry->stub_type <= ppc_stub_plt_call_both) 15176 stub_entry = NULL; 15177 15178 if (stub_entry != NULL 15179 && ((stub_entry->stub_type >= ppc_stub_plt_call 15180 && stub_entry->stub_type <= ppc_stub_plt_call_both) 15181 || stub_entry->stub_type == ppc_stub_plt_branch_r2off 15182 || stub_entry->stub_type == ppc_stub_plt_branch_both 15183 || stub_entry->stub_type == ppc_stub_long_branch_r2off 15184 || stub_entry->stub_type == ppc_stub_long_branch_both)) 15185 { 15186 bfd_boolean can_plt_call = FALSE; 15187 15188 if (stub_entry->stub_type == ppc_stub_plt_call 15189 && !htab->opd_abi 15190 && htab->params->plt_localentry0 != 0 15191 && is_elfv2_localentry0 (&h->elf)) 15192 { 15193 /* The function doesn't use or change r2. */ 15194 can_plt_call = TRUE; 15195 } 15196 else if (r_type == R_PPC64_REL24_NOTOC) 15197 { 15198 /* NOTOC calls don't need to restore r2. */ 15199 can_plt_call = TRUE; 15200 } 15201 15202 /* All of these stubs may modify r2, so there must be a 15203 branch and link followed by a nop. The nop is 15204 replaced by an insn to restore r2. */ 15205 else if (rel->r_offset + 8 <= input_section->size) 15206 { 15207 unsigned long br; 15208 15209 br = bfd_get_32 (input_bfd, 15210 contents + rel->r_offset); 15211 if ((br & 1) != 0) 15212 { 15213 unsigned long nop; 15214 15215 nop = bfd_get_32 (input_bfd, 15216 contents + rel->r_offset + 4); 15217 if (nop == LD_R2_0R1 + STK_TOC (htab)) 15218 can_plt_call = TRUE; 15219 else if (nop == NOP 15220 || nop == CROR_151515 15221 || nop == CROR_313131) 15222 { 15223 if (h != NULL 15224 && (h == htab->tls_get_addr_fd 15225 || h == htab->tls_get_addr) 15226 && htab->params->tls_get_addr_opt) 15227 { 15228 /* Special stub used, leave nop alone. */ 15229 } 15230 else 15231 bfd_put_32 (input_bfd, 15232 LD_R2_0R1 + STK_TOC (htab), 15233 contents + rel->r_offset + 4); 15234 can_plt_call = TRUE; 15235 } 15236 } 15237 else 15238 { 15239 /* Tail calls don't need to worry about restoring TOC. */ 15240 can_plt_call = TRUE; 15241 } 15242 } 15243 15244 if (!can_plt_call && h != NULL) 15245 { 15246 const char *name = h->elf.root.root.string; 15247 15248 if (*name == '.') 15249 ++name; 15250 15251 if (strncmp (name, "__libc_start_main", 17) == 0 15252 && (name[17] == 0 || name[17] == '@')) 15253 { 15254 /* Allow crt1 branch to go via a toc adjusting 15255 stub. Other calls that never return could do 15256 the same, if we could detect such. */ 15257 can_plt_call = TRUE; 15258 } 15259 } 15260 15261 if (!can_plt_call && h != NULL) 15262 { 15263 /* g++ as of 20130507 emits self-calls without a 15264 following nop. This is arguably wrong since we 15265 have conflicting information. On the one hand a 15266 global symbol and on the other a local call 15267 sequence, but don't error for this special case. 15268 It isn't possible to cheaply verify we have 15269 exactly such a call. Allow all calls to the same 15270 section. */ 15271 asection *code_sec = sec; 15272 15273 if (get_opd_info (sec) != NULL) 15274 { 15275 bfd_vma off = (relocation + addend 15276 - sec->output_section->vma 15277 - sec->output_offset); 15278 15279 opd_entry_value (sec, off, &code_sec, NULL, FALSE); 15280 } 15281 if (code_sec == input_section) 15282 can_plt_call = TRUE; 15283 } 15284 15285 if (!can_plt_call) 15286 { 15287 if (stub_entry->stub_type >= ppc_stub_plt_call 15288 && stub_entry->stub_type <= ppc_stub_plt_call_both) 15289 info->callbacks->einfo 15290 /* xgettext:c-format */ 15291 (_("%H: call to `%pT' lacks nop, can't restore toc; " 15292 "(plt call stub)\n"), 15293 input_bfd, input_section, rel->r_offset, sym_name); 15294 else 15295 info->callbacks->einfo 15296 /* xgettext:c-format */ 15297 (_("%H: call to `%pT' lacks nop, can't restore toc; " 15298 "(toc save/adjust stub)\n"), 15299 input_bfd, input_section, rel->r_offset, sym_name); 15300 15301 bfd_set_error (bfd_error_bad_value); 15302 ret = FALSE; 15303 } 15304 15305 if (can_plt_call 15306 && stub_entry->stub_type >= ppc_stub_plt_call 15307 && stub_entry->stub_type <= ppc_stub_plt_call_both) 15308 unresolved_reloc = FALSE; 15309 } 15310 15311 if ((stub_entry == NULL 15312 || stub_entry->stub_type == ppc_stub_long_branch 15313 || stub_entry->stub_type == ppc_stub_plt_branch) 15314 && get_opd_info (sec) != NULL) 15315 { 15316 /* The branch destination is the value of the opd entry. */ 15317 bfd_vma off = (relocation + addend 15318 - sec->output_section->vma 15319 - sec->output_offset); 15320 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE); 15321 if (dest != (bfd_vma) -1) 15322 { 15323 relocation = dest; 15324 addend = 0; 15325 reloc_dest = DEST_OPD; 15326 } 15327 } 15328 15329 /* If the branch is out of reach we ought to have a long 15330 branch stub. */ 15331 from = (rel->r_offset 15332 + input_section->output_offset 15333 + input_section->output_section->vma); 15334 15335 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh 15336 ? fdh->elf.other 15337 : sym->st_other); 15338 15339 if (stub_entry != NULL 15340 && (stub_entry->stub_type == ppc_stub_long_branch 15341 || stub_entry->stub_type == ppc_stub_plt_branch) 15342 && (r_type == R_PPC64_ADDR14_BRTAKEN 15343 || r_type == R_PPC64_ADDR14_BRNTAKEN 15344 || (relocation + addend - from + max_br_offset 15345 < 2 * max_br_offset))) 15346 /* Don't use the stub if this branch is in range. */ 15347 stub_entry = NULL; 15348 15349 if (stub_entry != NULL 15350 && (stub_entry->stub_type == ppc_stub_long_branch_notoc 15351 || stub_entry->stub_type == ppc_stub_long_branch_both 15352 || stub_entry->stub_type == ppc_stub_plt_branch_notoc 15353 || stub_entry->stub_type == ppc_stub_plt_branch_both) 15354 && (r_type != R_PPC64_REL24_NOTOC 15355 || ((fdh ? fdh->elf.other : sym->st_other) 15356 & STO_PPC64_LOCAL_MASK) <= 1 << STO_PPC64_LOCAL_BIT) 15357 && (relocation + addend - from + max_br_offset 15358 < 2 * max_br_offset)) 15359 stub_entry = NULL; 15360 15361 if (stub_entry != NULL 15362 && (stub_entry->stub_type == ppc_stub_long_branch_r2off 15363 || stub_entry->stub_type == ppc_stub_long_branch_both 15364 || stub_entry->stub_type == ppc_stub_plt_branch_r2off 15365 || stub_entry->stub_type == ppc_stub_plt_branch_both) 15366 && r_type == R_PPC64_REL24_NOTOC 15367 && (relocation + addend - from + max_br_offset 15368 < 2 * max_br_offset)) 15369 stub_entry = NULL; 15370 15371 if (stub_entry != NULL) 15372 { 15373 /* Munge up the value and addend so that we call the stub 15374 rather than the procedure directly. */ 15375 asection *stub_sec = stub_entry->group->stub_sec; 15376 15377 if (stub_entry->stub_type == ppc_stub_save_res) 15378 relocation += (stub_sec->output_offset 15379 + stub_sec->output_section->vma 15380 + stub_sec->size - htab->sfpr->size 15381 - htab->sfpr->output_offset 15382 - htab->sfpr->output_section->vma); 15383 else 15384 relocation = (stub_entry->stub_offset 15385 + stub_sec->output_offset 15386 + stub_sec->output_section->vma); 15387 addend = 0; 15388 reloc_dest = DEST_STUB; 15389 15390 if (((stub_entry->stub_type == ppc_stub_plt_call 15391 && ALWAYS_EMIT_R2SAVE) 15392 || stub_entry->stub_type == ppc_stub_plt_call_r2save 15393 || stub_entry->stub_type == ppc_stub_plt_call_both) 15394 && !(h != NULL 15395 && (h == htab->tls_get_addr_fd 15396 || h == htab->tls_get_addr) 15397 && htab->params->tls_get_addr_opt) 15398 && rel + 1 < relend 15399 && rel[1].r_offset == rel->r_offset + 4 15400 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE) 15401 relocation += 4; 15402 else if ((stub_entry->stub_type == ppc_stub_long_branch_both 15403 || stub_entry->stub_type == ppc_stub_plt_branch_both 15404 || stub_entry->stub_type == ppc_stub_plt_call_both) 15405 && r_type == R_PPC64_REL24_NOTOC) 15406 relocation += 4; 15407 15408 if (r_type == R_PPC64_REL24_NOTOC 15409 && (stub_entry->stub_type == ppc_stub_plt_call_notoc 15410 || stub_entry->stub_type == ppc_stub_plt_call_both)) 15411 htab->notoc_plt = 1; 15412 } 15413 15414 if (insn != 0) 15415 { 15416 if (is_isa_v2) 15417 { 15418 /* Set 'a' bit. This is 0b00010 in BO field for branch 15419 on CR(BI) insns (BO == 001at or 011at), and 0b01000 15420 for branch on CTR insns (BO == 1a00t or 1a01t). */ 15421 if ((insn & (0x14 << 21)) == (0x04 << 21)) 15422 insn |= 0x02 << 21; 15423 else if ((insn & (0x14 << 21)) == (0x10 << 21)) 15424 insn |= 0x08 << 21; 15425 else 15426 break; 15427 } 15428 else 15429 { 15430 /* Invert 'y' bit if not the default. */ 15431 if ((bfd_signed_vma) (relocation + addend - from) < 0) 15432 insn ^= 0x01 << 21; 15433 } 15434 15435 bfd_put_32 (input_bfd, insn, contents + rel->r_offset); 15436 } 15437 15438 /* NOP out calls to undefined weak functions. 15439 We can thus call a weak function without first 15440 checking whether the function is defined. */ 15441 else if (h != NULL 15442 && h->elf.root.type == bfd_link_hash_undefweak 15443 && h->elf.dynindx == -1 15444 && (r_type == R_PPC64_REL24 15445 || r_type == R_PPC64_REL24_NOTOC) 15446 && relocation == 0 15447 && addend == 0) 15448 { 15449 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset); 15450 goto copy_reloc; 15451 } 15452 break; 15453 15454 case R_PPC64_GOT16_DS: 15455 from = TOCstart + htab->sec_info[input_section->id].toc_off; 15456 if (relocation + addend - from + 0x8000 < 0x10000 15457 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)) 15458 { 15459 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3)); 15460 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */) 15461 { 15462 insn += (14u << 26) - (58u << 26); 15463 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3)); 15464 r_type = R_PPC64_TOC16; 15465 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15466 } 15467 } 15468 break; 15469 15470 case R_PPC64_GOT16_LO_DS: 15471 case R_PPC64_GOT16_HA: 15472 from = TOCstart + htab->sec_info[input_section->id].toc_off; 15473 if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL 15474 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)) 15475 { 15476 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3)); 15477 if ((insn & (0x3fu << 26 | 0x3)) == 58u << 26 /* ld */) 15478 { 15479 insn += (14u << 26) - (58u << 26); 15480 bfd_put_32 (input_bfd, insn, contents + (rel->r_offset & ~3)); 15481 r_type = R_PPC64_TOC16_LO; 15482 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15483 } 15484 else if ((insn & (0x3fu << 26)) == 15u << 26 /* addis */) 15485 { 15486 r_type = R_PPC64_TOC16_HA; 15487 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15488 } 15489 } 15490 break; 15491 15492 case R_PPC64_GOT_PCREL34: 15493 from = (rel->r_offset 15494 + input_section->output_section->vma 15495 + input_section->output_offset); 15496 if (relocation - from + (1ULL << 33) < 1ULL << 34 15497 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)) 15498 { 15499 offset = rel->r_offset; 15500 pinsn = bfd_get_32 (input_bfd, contents + offset); 15501 pinsn <<= 32; 15502 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4); 15503 if ((pinsn & ((-1ULL << 50) | (63ULL << 26))) 15504 == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */)) 15505 { 15506 /* Replace with paddi. */ 15507 pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26); 15508 r_type = R_PPC64_PCREL34; 15509 rel->r_info = ELF64_R_INFO (r_symndx, r_type); 15510 bfd_put_32 (input_bfd, pinsn >> 32, contents + offset); 15511 bfd_put_32 (input_bfd, pinsn, contents + offset + 4); 15512 goto pcrelopt; 15513 } 15514 } 15515 break; 15516 15517 case R_PPC64_PCREL34: 15518 if (SYMBOL_REFERENCES_LOCAL (info, &h->elf)) 15519 { 15520 offset = rel->r_offset; 15521 pinsn = bfd_get_32 (input_bfd, contents + offset); 15522 pinsn <<= 32; 15523 pinsn |= bfd_get_32 (input_bfd, contents + offset + 4); 15524 if ((pinsn & ((-1ULL << 50) | (63ULL << 26))) 15525 == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52) 15526 | (14ULL << 26) /* paddi */)) 15527 { 15528 pcrelopt: 15529 if (rel + 1 < relend 15530 && rel[1].r_offset == offset 15531 && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT)) 15532 { 15533 bfd_vma off2 = rel[1].r_addend; 15534 if (off2 == 0) 15535 /* zero means next insn. */ 15536 off2 = 8; 15537 off2 += offset; 15538 if (off2 + 4 <= input_section->size) 15539 { 15540 uint64_t pinsn2; 15541 bfd_signed_vma addend_off; 15542 pinsn2 = bfd_get_32 (input_bfd, contents + off2); 15543 pinsn2 <<= 32; 15544 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58) 15545 { 15546 if (off2 + 8 > input_section->size) 15547 break; 15548 pinsn2 |= bfd_get_32 (input_bfd, 15549 contents + off2 + 4); 15550 } 15551 if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off)) 15552 { 15553 addend += addend_off; 15554 rel->r_addend = addend; 15555 bfd_put_32 (input_bfd, pinsn >> 32, 15556 contents + offset); 15557 bfd_put_32 (input_bfd, pinsn, 15558 contents + offset + 4); 15559 bfd_put_32 (input_bfd, pinsn2 >> 32, 15560 contents + off2); 15561 if ((pinsn2 & (63ULL << 58)) == 1ULL << 58) 15562 bfd_put_32 (input_bfd, pinsn2, 15563 contents + off2 + 4); 15564 } 15565 } 15566 } 15567 } 15568 } 15569 break; 15570 } 15571 15572 tls_type = 0; 15573 save_unresolved_reloc = unresolved_reloc; 15574 switch (r_type) 15575 { 15576 default: 15577 /* xgettext:c-format */ 15578 _bfd_error_handler (_("%pB: %s unsupported"), 15579 input_bfd, ppc64_elf_howto_table[r_type]->name); 15580 15581 bfd_set_error (bfd_error_bad_value); 15582 ret = FALSE; 15583 goto copy_reloc; 15584 15585 case R_PPC64_NONE: 15586 case R_PPC64_TLS: 15587 case R_PPC64_TLSGD: 15588 case R_PPC64_TLSLD: 15589 case R_PPC64_TOCSAVE: 15590 case R_PPC64_GNU_VTINHERIT: 15591 case R_PPC64_GNU_VTENTRY: 15592 case R_PPC64_ENTRY: 15593 case R_PPC64_PCREL_OPT: 15594 goto copy_reloc; 15595 15596 /* GOT16 relocations. Like an ADDR16 using the symbol's 15597 address in the GOT as relocation value instead of the 15598 symbol's value itself. Also, create a GOT entry for the 15599 symbol and put the symbol value there. */ 15600 case R_PPC64_GOT_TLSGD16: 15601 case R_PPC64_GOT_TLSGD16_LO: 15602 case R_PPC64_GOT_TLSGD16_HI: 15603 case R_PPC64_GOT_TLSGD16_HA: 15604 case R_PPC64_GOT_TLSGD34: 15605 tls_type = TLS_TLS | TLS_GD; 15606 goto dogot; 15607 15608 case R_PPC64_GOT_TLSLD16: 15609 case R_PPC64_GOT_TLSLD16_LO: 15610 case R_PPC64_GOT_TLSLD16_HI: 15611 case R_PPC64_GOT_TLSLD16_HA: 15612 case R_PPC64_GOT_TLSLD34: 15613 tls_type = TLS_TLS | TLS_LD; 15614 goto dogot; 15615 15616 case R_PPC64_GOT_TPREL16_DS: 15617 case R_PPC64_GOT_TPREL16_LO_DS: 15618 case R_PPC64_GOT_TPREL16_HI: 15619 case R_PPC64_GOT_TPREL16_HA: 15620 case R_PPC64_GOT_TPREL34: 15621 tls_type = TLS_TLS | TLS_TPREL; 15622 goto dogot; 15623 15624 case R_PPC64_GOT_DTPREL16_DS: 15625 case R_PPC64_GOT_DTPREL16_LO_DS: 15626 case R_PPC64_GOT_DTPREL16_HI: 15627 case R_PPC64_GOT_DTPREL16_HA: 15628 case R_PPC64_GOT_DTPREL34: 15629 tls_type = TLS_TLS | TLS_DTPREL; 15630 goto dogot; 15631 15632 case R_PPC64_GOT16: 15633 case R_PPC64_GOT16_LO: 15634 case R_PPC64_GOT16_HI: 15635 case R_PPC64_GOT16_HA: 15636 case R_PPC64_GOT16_DS: 15637 case R_PPC64_GOT16_LO_DS: 15638 case R_PPC64_GOT_PCREL34: 15639 dogot: 15640 { 15641 /* Relocation is to the entry for this symbol in the global 15642 offset table. */ 15643 asection *got; 15644 bfd_vma *offp; 15645 bfd_vma off; 15646 unsigned long indx = 0; 15647 struct got_entry *ent; 15648 15649 if (tls_type == (TLS_TLS | TLS_LD) 15650 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)) 15651 ent = ppc64_tlsld_got (input_bfd); 15652 else 15653 { 15654 if (h != NULL) 15655 { 15656 if (!htab->elf.dynamic_sections_created 15657 || h->elf.dynindx == -1 15658 || SYMBOL_REFERENCES_LOCAL (info, &h->elf) 15659 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf)) 15660 /* This is actually a static link, or it is a 15661 -Bsymbolic link and the symbol is defined 15662 locally, or the symbol was forced to be local 15663 because of a version file. */ 15664 ; 15665 else 15666 { 15667 indx = h->elf.dynindx; 15668 unresolved_reloc = FALSE; 15669 } 15670 ent = h->elf.got.glist; 15671 } 15672 else 15673 { 15674 if (local_got_ents == NULL) 15675 abort (); 15676 ent = local_got_ents[r_symndx]; 15677 } 15678 15679 for (; ent != NULL; ent = ent->next) 15680 if (ent->addend == orig_rel.r_addend 15681 && ent->owner == input_bfd 15682 && ent->tls_type == tls_type) 15683 break; 15684 } 15685 15686 if (ent == NULL) 15687 abort (); 15688 if (ent->is_indirect) 15689 ent = ent->got.ent; 15690 offp = &ent->got.offset; 15691 got = ppc64_elf_tdata (ent->owner)->got; 15692 if (got == NULL) 15693 abort (); 15694 15695 /* The offset must always be a multiple of 8. We use the 15696 least significant bit to record whether we have already 15697 processed this entry. */ 15698 off = *offp; 15699 if ((off & 1) != 0) 15700 off &= ~1; 15701 else 15702 { 15703 /* Generate relocs for the dynamic linker, except in 15704 the case of TLSLD where we'll use one entry per 15705 module. */ 15706 asection *relgot; 15707 bfd_boolean ifunc; 15708 15709 *offp = off | 1; 15710 relgot = NULL; 15711 ifunc = (h != NULL 15712 ? h->elf.type == STT_GNU_IFUNC 15713 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC); 15714 if (ifunc) 15715 { 15716 relgot = htab->elf.irelplt; 15717 if (indx == 0) 15718 htab->local_ifunc_resolver = 1; 15719 else if (is_static_defined (&h->elf)) 15720 htab->maybe_local_ifunc_resolver = 1; 15721 } 15722 else if (indx != 0 15723 || (bfd_link_pic (info) 15724 && (h == NULL 15725 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf)) 15726 && !(tls_type != 0 15727 && bfd_link_executable (info) 15728 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))) 15729 relgot = ppc64_elf_tdata (ent->owner)->relgot; 15730 if (relgot != NULL) 15731 { 15732 outrel.r_offset = (got->output_section->vma 15733 + got->output_offset 15734 + off); 15735 outrel.r_addend = orig_rel.r_addend; 15736 if (tls_type & (TLS_LD | TLS_GD)) 15737 { 15738 outrel.r_addend = 0; 15739 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64); 15740 if (tls_type == (TLS_TLS | TLS_GD)) 15741 { 15742 loc = relgot->contents; 15743 loc += (relgot->reloc_count++ 15744 * sizeof (Elf64_External_Rela)); 15745 bfd_elf64_swap_reloca_out (output_bfd, 15746 &outrel, loc); 15747 outrel.r_offset += 8; 15748 outrel.r_addend = orig_rel.r_addend; 15749 outrel.r_info 15750 = ELF64_R_INFO (indx, R_PPC64_DTPREL64); 15751 } 15752 } 15753 else if (tls_type == (TLS_TLS | TLS_DTPREL)) 15754 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64); 15755 else if (tls_type == (TLS_TLS | TLS_TPREL)) 15756 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64); 15757 else if (indx != 0) 15758 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT); 15759 else 15760 { 15761 if (ifunc) 15762 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE); 15763 else 15764 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 15765 15766 /* Write the .got section contents for the sake 15767 of prelink. */ 15768 loc = got->contents + off; 15769 bfd_put_64 (output_bfd, outrel.r_addend + relocation, 15770 loc); 15771 } 15772 15773 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD)) 15774 { 15775 outrel.r_addend += relocation; 15776 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL)) 15777 { 15778 if (htab->elf.tls_sec == NULL) 15779 outrel.r_addend = 0; 15780 else 15781 outrel.r_addend -= htab->elf.tls_sec->vma; 15782 } 15783 } 15784 loc = relgot->contents; 15785 loc += (relgot->reloc_count++ 15786 * sizeof (Elf64_External_Rela)); 15787 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); 15788 } 15789 15790 /* Init the .got section contents here if we're not 15791 emitting a reloc. */ 15792 else 15793 { 15794 relocation += orig_rel.r_addend; 15795 if (tls_type != 0) 15796 { 15797 if (htab->elf.tls_sec == NULL) 15798 relocation = 0; 15799 else 15800 { 15801 if (tls_type & TLS_LD) 15802 relocation = 0; 15803 else 15804 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET; 15805 if (tls_type & TLS_TPREL) 15806 relocation += DTP_OFFSET - TP_OFFSET; 15807 } 15808 15809 if (tls_type & (TLS_GD | TLS_LD)) 15810 { 15811 bfd_put_64 (output_bfd, relocation, 15812 got->contents + off + 8); 15813 relocation = 1; 15814 } 15815 } 15816 bfd_put_64 (output_bfd, relocation, 15817 got->contents + off); 15818 } 15819 } 15820 15821 if (off >= (bfd_vma) -2) 15822 abort (); 15823 15824 relocation = got->output_section->vma + got->output_offset + off; 15825 addend = 0; 15826 if (!(r_type == R_PPC64_GOT_PCREL34 15827 || r_type == R_PPC64_GOT_TLSGD34 15828 || r_type == R_PPC64_GOT_TLSLD34 15829 || r_type == R_PPC64_GOT_TPREL34 15830 || r_type == R_PPC64_GOT_DTPREL34)) 15831 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off); 15832 } 15833 break; 15834 15835 case R_PPC64_PLT16_HA: 15836 case R_PPC64_PLT16_HI: 15837 case R_PPC64_PLT16_LO: 15838 case R_PPC64_PLT16_LO_DS: 15839 case R_PPC64_PLT_PCREL34: 15840 case R_PPC64_PLT_PCREL34_NOTOC: 15841 case R_PPC64_PLT32: 15842 case R_PPC64_PLT64: 15843 case R_PPC64_PLTSEQ: 15844 case R_PPC64_PLTSEQ_NOTOC: 15845 case R_PPC64_PLTCALL: 15846 case R_PPC64_PLTCALL_NOTOC: 15847 /* Relocation is to the entry for this symbol in the 15848 procedure linkage table. */ 15849 unresolved_reloc = TRUE; 15850 { 15851 struct plt_entry **plt_list = NULL; 15852 if (h != NULL) 15853 plt_list = &h->elf.plt.plist; 15854 else if (local_got_ents != NULL) 15855 { 15856 struct plt_entry **local_plt = (struct plt_entry **) 15857 (local_got_ents + symtab_hdr->sh_info); 15858 plt_list = local_plt + r_symndx; 15859 } 15860 if (plt_list) 15861 { 15862 struct plt_entry *ent; 15863 15864 for (ent = *plt_list; ent != NULL; ent = ent->next) 15865 if (ent->plt.offset != (bfd_vma) -1 15866 && ent->addend == orig_rel.r_addend) 15867 { 15868 asection *plt; 15869 bfd_vma got; 15870 15871 plt = htab->elf.splt; 15872 if (!htab->elf.dynamic_sections_created 15873 || h == NULL 15874 || h->elf.dynindx == -1) 15875 { 15876 if (h != NULL 15877 ? h->elf.type == STT_GNU_IFUNC 15878 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 15879 plt = htab->elf.iplt; 15880 else 15881 plt = htab->pltlocal; 15882 } 15883 relocation = (plt->output_section->vma 15884 + plt->output_offset 15885 + ent->plt.offset); 15886 if (r_type == R_PPC64_PLT16_HA 15887 || r_type == R_PPC64_PLT16_HI 15888 || r_type == R_PPC64_PLT16_LO 15889 || r_type == R_PPC64_PLT16_LO_DS) 15890 { 15891 got = (elf_gp (output_bfd) 15892 + htab->sec_info[input_section->id].toc_off); 15893 relocation -= got; 15894 } 15895 addend = 0; 15896 unresolved_reloc = FALSE; 15897 break; 15898 } 15899 } 15900 } 15901 break; 15902 15903 case R_PPC64_TOC: 15904 /* Relocation value is TOC base. */ 15905 relocation = TOCstart; 15906 if (r_symndx == STN_UNDEF) 15907 relocation += htab->sec_info[input_section->id].toc_off; 15908 else if (unresolved_reloc) 15909 ; 15910 else if (sec != NULL && sec->id < htab->sec_info_arr_size) 15911 relocation += htab->sec_info[sec->id].toc_off; 15912 else 15913 unresolved_reloc = TRUE; 15914 goto dodyn; 15915 15916 /* TOC16 relocs. We want the offset relative to the TOC base, 15917 which is the address of the start of the TOC plus 0x8000. 15918 The TOC consists of sections .got, .toc, .tocbss, and .plt, 15919 in this order. */ 15920 case R_PPC64_TOC16: 15921 case R_PPC64_TOC16_LO: 15922 case R_PPC64_TOC16_HI: 15923 case R_PPC64_TOC16_DS: 15924 case R_PPC64_TOC16_LO_DS: 15925 case R_PPC64_TOC16_HA: 15926 addend -= TOCstart + htab->sec_info[input_section->id].toc_off; 15927 if (h != NULL) 15928 goto dodyn; 15929 break; 15930 15931 /* Relocate against the beginning of the section. */ 15932 case R_PPC64_SECTOFF: 15933 case R_PPC64_SECTOFF_LO: 15934 case R_PPC64_SECTOFF_HI: 15935 case R_PPC64_SECTOFF_DS: 15936 case R_PPC64_SECTOFF_LO_DS: 15937 case R_PPC64_SECTOFF_HA: 15938 if (sec != NULL) 15939 addend -= sec->output_section->vma; 15940 break; 15941 15942 case R_PPC64_REL16: 15943 case R_PPC64_REL16_LO: 15944 case R_PPC64_REL16_HI: 15945 case R_PPC64_REL16_HA: 15946 case R_PPC64_REL16_HIGH: 15947 case R_PPC64_REL16_HIGHA: 15948 case R_PPC64_REL16_HIGHER: 15949 case R_PPC64_REL16_HIGHERA: 15950 case R_PPC64_REL16_HIGHEST: 15951 case R_PPC64_REL16_HIGHESTA: 15952 case R_PPC64_REL16_HIGHER34: 15953 case R_PPC64_REL16_HIGHERA34: 15954 case R_PPC64_REL16_HIGHEST34: 15955 case R_PPC64_REL16_HIGHESTA34: 15956 case R_PPC64_REL16DX_HA: 15957 case R_PPC64_REL14: 15958 case R_PPC64_REL14_BRNTAKEN: 15959 case R_PPC64_REL14_BRTAKEN: 15960 case R_PPC64_REL24: 15961 case R_PPC64_REL24_NOTOC: 15962 case R_PPC64_PCREL34: 15963 case R_PPC64_PCREL28: 15964 break; 15965 15966 case R_PPC64_TPREL16: 15967 case R_PPC64_TPREL16_LO: 15968 case R_PPC64_TPREL16_HI: 15969 case R_PPC64_TPREL16_HA: 15970 case R_PPC64_TPREL16_DS: 15971 case R_PPC64_TPREL16_LO_DS: 15972 case R_PPC64_TPREL16_HIGH: 15973 case R_PPC64_TPREL16_HIGHA: 15974 case R_PPC64_TPREL16_HIGHER: 15975 case R_PPC64_TPREL16_HIGHERA: 15976 case R_PPC64_TPREL16_HIGHEST: 15977 case R_PPC64_TPREL16_HIGHESTA: 15978 case R_PPC64_TPREL34: 15979 if (h != NULL 15980 && h->elf.root.type == bfd_link_hash_undefweak 15981 && h->elf.dynindx == -1) 15982 { 15983 /* Make this relocation against an undefined weak symbol 15984 resolve to zero. This is really just a tweak, since 15985 code using weak externs ought to check that they are 15986 defined before using them. */ 15987 bfd_byte *p = contents + rel->r_offset - d_offset; 15988 15989 insn = bfd_get_32 (input_bfd, p); 15990 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13); 15991 if (insn != 0) 15992 bfd_put_32 (input_bfd, insn, p); 15993 break; 15994 } 15995 if (htab->elf.tls_sec != NULL) 15996 addend -= htab->elf.tls_sec->vma + TP_OFFSET; 15997 /* The TPREL16 relocs shouldn't really be used in shared 15998 libs or with non-local symbols as that will result in 15999 DT_TEXTREL being set, but support them anyway. */ 16000 goto dodyn; 16001 16002 case R_PPC64_DTPREL16: 16003 case R_PPC64_DTPREL16_LO: 16004 case R_PPC64_DTPREL16_HI: 16005 case R_PPC64_DTPREL16_HA: 16006 case R_PPC64_DTPREL16_DS: 16007 case R_PPC64_DTPREL16_LO_DS: 16008 case R_PPC64_DTPREL16_HIGH: 16009 case R_PPC64_DTPREL16_HIGHA: 16010 case R_PPC64_DTPREL16_HIGHER: 16011 case R_PPC64_DTPREL16_HIGHERA: 16012 case R_PPC64_DTPREL16_HIGHEST: 16013 case R_PPC64_DTPREL16_HIGHESTA: 16014 case R_PPC64_DTPREL34: 16015 if (htab->elf.tls_sec != NULL) 16016 addend -= htab->elf.tls_sec->vma + DTP_OFFSET; 16017 break; 16018 16019 case R_PPC64_ADDR64_LOCAL: 16020 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL 16021 ? h->elf.other 16022 : sym->st_other); 16023 break; 16024 16025 case R_PPC64_DTPMOD64: 16026 relocation = 1; 16027 addend = 0; 16028 goto dodyn; 16029 16030 case R_PPC64_TPREL64: 16031 if (htab->elf.tls_sec != NULL) 16032 addend -= htab->elf.tls_sec->vma + TP_OFFSET; 16033 goto dodyn; 16034 16035 case R_PPC64_DTPREL64: 16036 if (htab->elf.tls_sec != NULL) 16037 addend -= htab->elf.tls_sec->vma + DTP_OFFSET; 16038 /* Fall through. */ 16039 16040 /* Relocations that may need to be propagated if this is a 16041 dynamic object. */ 16042 case R_PPC64_REL30: 16043 case R_PPC64_REL32: 16044 case R_PPC64_REL64: 16045 case R_PPC64_ADDR14: 16046 case R_PPC64_ADDR14_BRNTAKEN: 16047 case R_PPC64_ADDR14_BRTAKEN: 16048 case R_PPC64_ADDR16: 16049 case R_PPC64_ADDR16_DS: 16050 case R_PPC64_ADDR16_HA: 16051 case R_PPC64_ADDR16_HI: 16052 case R_PPC64_ADDR16_HIGH: 16053 case R_PPC64_ADDR16_HIGHA: 16054 case R_PPC64_ADDR16_HIGHER: 16055 case R_PPC64_ADDR16_HIGHERA: 16056 case R_PPC64_ADDR16_HIGHEST: 16057 case R_PPC64_ADDR16_HIGHESTA: 16058 case R_PPC64_ADDR16_LO: 16059 case R_PPC64_ADDR16_LO_DS: 16060 case R_PPC64_ADDR16_HIGHER34: 16061 case R_PPC64_ADDR16_HIGHERA34: 16062 case R_PPC64_ADDR16_HIGHEST34: 16063 case R_PPC64_ADDR16_HIGHESTA34: 16064 case R_PPC64_ADDR24: 16065 case R_PPC64_ADDR32: 16066 case R_PPC64_ADDR64: 16067 case R_PPC64_UADDR16: 16068 case R_PPC64_UADDR32: 16069 case R_PPC64_UADDR64: 16070 case R_PPC64_D34: 16071 case R_PPC64_D34_LO: 16072 case R_PPC64_D34_HI30: 16073 case R_PPC64_D34_HA30: 16074 case R_PPC64_D28: 16075 dodyn: 16076 if ((input_section->flags & SEC_ALLOC) == 0) 16077 break; 16078 16079 if (NO_OPD_RELOCS && is_opd) 16080 break; 16081 16082 if (bfd_link_pic (info) 16083 ? ((h == NULL 16084 || h->dyn_relocs != NULL) 16085 && ((h != NULL && pc_dynrelocs (h)) 16086 || must_be_dyn_reloc (info, r_type))) 16087 : (h != NULL 16088 ? h->dyn_relocs != NULL 16089 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)) 16090 { 16091 bfd_boolean skip, relocate; 16092 asection *sreloc; 16093 bfd_vma out_off; 16094 long indx = 0; 16095 16096 /* When generating a dynamic object, these relocations 16097 are copied into the output file to be resolved at run 16098 time. */ 16099 16100 skip = FALSE; 16101 relocate = FALSE; 16102 16103 out_off = _bfd_elf_section_offset (output_bfd, info, 16104 input_section, rel->r_offset); 16105 if (out_off == (bfd_vma) -1) 16106 skip = TRUE; 16107 else if (out_off == (bfd_vma) -2) 16108 skip = TRUE, relocate = TRUE; 16109 out_off += (input_section->output_section->vma 16110 + input_section->output_offset); 16111 outrel.r_offset = out_off; 16112 outrel.r_addend = rel->r_addend; 16113 16114 /* Optimize unaligned reloc use. */ 16115 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0) 16116 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0)) 16117 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64; 16118 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0) 16119 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0)) 16120 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32; 16121 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0) 16122 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0)) 16123 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16; 16124 16125 if (skip) 16126 memset (&outrel, 0, sizeof outrel); 16127 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf) 16128 && !is_opd 16129 && r_type != R_PPC64_TOC) 16130 { 16131 indx = h->elf.dynindx; 16132 BFD_ASSERT (indx != -1); 16133 outrel.r_info = ELF64_R_INFO (indx, r_type); 16134 } 16135 else 16136 { 16137 /* This symbol is local, or marked to become local, 16138 or this is an opd section reloc which must point 16139 at a local function. */ 16140 outrel.r_addend += relocation; 16141 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC) 16142 { 16143 if (is_opd && h != NULL) 16144 { 16145 /* Lie about opd entries. This case occurs 16146 when building shared libraries and we 16147 reference a function in another shared 16148 lib. The same thing happens for a weak 16149 definition in an application that's 16150 overridden by a strong definition in a 16151 shared lib. (I believe this is a generic 16152 bug in binutils handling of weak syms.) 16153 In these cases we won't use the opd 16154 entry in this lib. */ 16155 unresolved_reloc = FALSE; 16156 } 16157 if (!is_opd 16158 && r_type == R_PPC64_ADDR64 16159 && (h != NULL 16160 ? h->elf.type == STT_GNU_IFUNC 16161 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)) 16162 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE); 16163 else 16164 { 16165 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 16166 16167 /* We need to relocate .opd contents for ld.so. 16168 Prelink also wants simple and consistent rules 16169 for relocs. This make all RELATIVE relocs have 16170 *r_offset equal to r_addend. */ 16171 relocate = TRUE; 16172 } 16173 } 16174 else 16175 { 16176 if (h != NULL 16177 ? h->elf.type == STT_GNU_IFUNC 16178 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 16179 { 16180 info->callbacks->einfo 16181 /* xgettext:c-format */ 16182 (_("%H: %s for indirect " 16183 "function `%pT' unsupported\n"), 16184 input_bfd, input_section, rel->r_offset, 16185 ppc64_elf_howto_table[r_type]->name, 16186 sym_name); 16187 ret = FALSE; 16188 } 16189 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec)) 16190 ; 16191 else if (sec == NULL || sec->owner == NULL) 16192 { 16193 bfd_set_error (bfd_error_bad_value); 16194 return FALSE; 16195 } 16196 else 16197 { 16198 asection *osec = sec->output_section; 16199 16200 if ((osec->flags & SEC_THREAD_LOCAL) != 0) 16201 { 16202 /* TLS symbol values are relative to the 16203 TLS segment. Dynamic relocations for 16204 local TLS symbols therefore can't be 16205 reduced to a relocation against their 16206 section symbol because it holds the 16207 address of the section, not a value 16208 relative to the TLS segment. We could 16209 change the .tdata dynamic section symbol 16210 to be zero value but STN_UNDEF works 16211 and is used elsewhere, eg. for TPREL64 16212 GOT relocs against local TLS symbols. */ 16213 osec = htab->elf.tls_sec; 16214 indx = 0; 16215 } 16216 else 16217 { 16218 indx = elf_section_data (osec)->dynindx; 16219 if (indx == 0) 16220 { 16221 if ((osec->flags & SEC_READONLY) == 0 16222 && htab->elf.data_index_section != NULL) 16223 osec = htab->elf.data_index_section; 16224 else 16225 osec = htab->elf.text_index_section; 16226 indx = elf_section_data (osec)->dynindx; 16227 } 16228 BFD_ASSERT (indx != 0); 16229 } 16230 16231 /* We are turning this relocation into one 16232 against a section symbol, so subtract out 16233 the output section's address but not the 16234 offset of the input section in the output 16235 section. */ 16236 outrel.r_addend -= osec->vma; 16237 } 16238 16239 outrel.r_info = ELF64_R_INFO (indx, r_type); 16240 } 16241 } 16242 16243 sreloc = elf_section_data (input_section)->sreloc; 16244 if (h != NULL 16245 ? h->elf.type == STT_GNU_IFUNC 16246 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 16247 { 16248 sreloc = htab->elf.irelplt; 16249 if (indx == 0) 16250 htab->local_ifunc_resolver = 1; 16251 else if (is_static_defined (&h->elf)) 16252 htab->maybe_local_ifunc_resolver = 1; 16253 } 16254 if (sreloc == NULL) 16255 abort (); 16256 16257 if (sreloc->reloc_count * sizeof (Elf64_External_Rela) 16258 >= sreloc->size) 16259 abort (); 16260 loc = sreloc->contents; 16261 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela); 16262 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); 16263 16264 if (!warned_dynamic 16265 && !ppc64_glibc_dynamic_reloc (ELF64_R_TYPE (outrel.r_info))) 16266 { 16267 info->callbacks->einfo 16268 /* xgettext:c-format */ 16269 (_("%X%P: %pB: %s against %pT " 16270 "is not supported by glibc as a dynamic relocation\n"), 16271 input_bfd, 16272 ppc64_elf_howto_table[ELF64_R_TYPE (outrel.r_info)]->name, 16273 sym_name); 16274 warned_dynamic = TRUE; 16275 } 16276 16277 /* If this reloc is against an external symbol, it will 16278 be computed at runtime, so there's no need to do 16279 anything now. However, for the sake of prelink ensure 16280 that the section contents are a known value. */ 16281 if (!relocate) 16282 { 16283 unresolved_reloc = FALSE; 16284 /* The value chosen here is quite arbitrary as ld.so 16285 ignores section contents except for the special 16286 case of .opd where the contents might be accessed 16287 before relocation. Choose zero, as that won't 16288 cause reloc overflow. */ 16289 relocation = 0; 16290 addend = 0; 16291 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs 16292 to improve backward compatibility with older 16293 versions of ld. */ 16294 if (r_type == R_PPC64_ADDR64) 16295 addend = outrel.r_addend; 16296 /* Adjust pc_relative relocs to have zero in *r_offset. */ 16297 else if (ppc64_elf_howto_table[r_type]->pc_relative) 16298 addend = outrel.r_offset; 16299 } 16300 } 16301 break; 16302 16303 case R_PPC64_COPY: 16304 case R_PPC64_GLOB_DAT: 16305 case R_PPC64_JMP_SLOT: 16306 case R_PPC64_JMP_IREL: 16307 case R_PPC64_RELATIVE: 16308 /* We shouldn't ever see these dynamic relocs in relocatable 16309 files. */ 16310 /* Fall through. */ 16311 16312 case R_PPC64_PLTGOT16: 16313 case R_PPC64_PLTGOT16_DS: 16314 case R_PPC64_PLTGOT16_HA: 16315 case R_PPC64_PLTGOT16_HI: 16316 case R_PPC64_PLTGOT16_LO: 16317 case R_PPC64_PLTGOT16_LO_DS: 16318 case R_PPC64_PLTREL32: 16319 case R_PPC64_PLTREL64: 16320 /* These ones haven't been implemented yet. */ 16321 16322 info->callbacks->einfo 16323 /* xgettext:c-format */ 16324 (_("%P: %pB: %s is not supported for `%pT'\n"), 16325 input_bfd, 16326 ppc64_elf_howto_table[r_type]->name, sym_name); 16327 16328 bfd_set_error (bfd_error_invalid_operation); 16329 ret = FALSE; 16330 goto copy_reloc; 16331 } 16332 16333 /* Multi-instruction sequences that access the TOC can be 16334 optimized, eg. addis ra,r2,0; addi rb,ra,x; 16335 to nop; addi rb,r2,x; */ 16336 switch (r_type) 16337 { 16338 default: 16339 break; 16340 16341 case R_PPC64_GOT_TLSLD16_HI: 16342 case R_PPC64_GOT_TLSGD16_HI: 16343 case R_PPC64_GOT_TPREL16_HI: 16344 case R_PPC64_GOT_DTPREL16_HI: 16345 case R_PPC64_GOT16_HI: 16346 case R_PPC64_TOC16_HI: 16347 /* These relocs would only be useful if building up an 16348 offset to later add to r2, perhaps in an indexed 16349 addressing mode instruction. Don't try to optimize. 16350 Unfortunately, the possibility of someone building up an 16351 offset like this or even with the HA relocs, means that 16352 we need to check the high insn when optimizing the low 16353 insn. */ 16354 break; 16355 16356 case R_PPC64_PLTCALL_NOTOC: 16357 if (!unresolved_reloc) 16358 htab->notoc_plt = 1; 16359 /* Fall through. */ 16360 case R_PPC64_PLTCALL: 16361 if (unresolved_reloc) 16362 { 16363 /* No plt entry. Make this into a direct call. */ 16364 bfd_byte *p = contents + rel->r_offset; 16365 insn = bfd_get_32 (input_bfd, p); 16366 insn &= 1; 16367 bfd_put_32 (input_bfd, B_DOT | insn, p); 16368 if (r_type == R_PPC64_PLTCALL) 16369 bfd_put_32 (input_bfd, NOP, p + 4); 16370 unresolved_reloc = save_unresolved_reloc; 16371 r_type = R_PPC64_REL24; 16372 } 16373 break; 16374 16375 case R_PPC64_PLTSEQ_NOTOC: 16376 case R_PPC64_PLTSEQ: 16377 if (unresolved_reloc) 16378 { 16379 unresolved_reloc = FALSE; 16380 goto nop_it; 16381 } 16382 break; 16383 16384 case R_PPC64_PLT_PCREL34_NOTOC: 16385 if (!unresolved_reloc) 16386 htab->notoc_plt = 1; 16387 /* Fall through. */ 16388 case R_PPC64_PLT_PCREL34: 16389 if (unresolved_reloc) 16390 { 16391 bfd_byte *p = contents + rel->r_offset; 16392 bfd_put_32 (input_bfd, PNOP >> 32, p); 16393 bfd_put_32 (input_bfd, PNOP, p + 4); 16394 unresolved_reloc = FALSE; 16395 goto copy_reloc; 16396 } 16397 break; 16398 16399 case R_PPC64_PLT16_HA: 16400 if (unresolved_reloc) 16401 { 16402 unresolved_reloc = FALSE; 16403 goto nop_it; 16404 } 16405 /* Fall through. */ 16406 case R_PPC64_GOT_TLSLD16_HA: 16407 case R_PPC64_GOT_TLSGD16_HA: 16408 case R_PPC64_GOT_TPREL16_HA: 16409 case R_PPC64_GOT_DTPREL16_HA: 16410 case R_PPC64_GOT16_HA: 16411 case R_PPC64_TOC16_HA: 16412 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000 16413 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn) 16414 { 16415 bfd_byte *p; 16416 nop_it: 16417 p = contents + (rel->r_offset & ~3); 16418 bfd_put_32 (input_bfd, NOP, p); 16419 goto copy_reloc; 16420 } 16421 break; 16422 16423 case R_PPC64_PLT16_LO: 16424 case R_PPC64_PLT16_LO_DS: 16425 if (unresolved_reloc) 16426 { 16427 unresolved_reloc = FALSE; 16428 goto nop_it; 16429 } 16430 /* Fall through. */ 16431 case R_PPC64_GOT_TLSLD16_LO: 16432 case R_PPC64_GOT_TLSGD16_LO: 16433 case R_PPC64_GOT_TPREL16_LO_DS: 16434 case R_PPC64_GOT_DTPREL16_LO_DS: 16435 case R_PPC64_GOT16_LO: 16436 case R_PPC64_GOT16_LO_DS: 16437 case R_PPC64_TOC16_LO: 16438 case R_PPC64_TOC16_LO_DS: 16439 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000 16440 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn) 16441 { 16442 bfd_byte *p = contents + (rel->r_offset & ~3); 16443 insn = bfd_get_32 (input_bfd, p); 16444 if ((insn & (0x3fu << 26)) == 12u << 26 /* addic */) 16445 { 16446 /* Transform addic to addi when we change reg. */ 16447 insn &= ~((0x3fu << 26) | (0x1f << 16)); 16448 insn |= (14u << 26) | (2 << 16); 16449 } 16450 else 16451 { 16452 insn &= ~(0x1f << 16); 16453 insn |= 2 << 16; 16454 } 16455 bfd_put_32 (input_bfd, insn, p); 16456 } 16457 break; 16458 16459 case R_PPC64_TPREL16_HA: 16460 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000) 16461 { 16462 bfd_byte *p = contents + (rel->r_offset & ~3); 16463 insn = bfd_get_32 (input_bfd, p); 16464 if ((insn & ((0x3fu << 26) | 0x1f << 16)) 16465 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */) 16466 /* xgettext:c-format */ 16467 info->callbacks->minfo 16468 (_("%H: warning: %s unexpected insn %#x.\n"), 16469 input_bfd, input_section, rel->r_offset, 16470 ppc64_elf_howto_table[r_type]->name, insn); 16471 else 16472 { 16473 bfd_put_32 (input_bfd, NOP, p); 16474 goto copy_reloc; 16475 } 16476 } 16477 break; 16478 16479 case R_PPC64_TPREL16_LO: 16480 case R_PPC64_TPREL16_LO_DS: 16481 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000) 16482 { 16483 bfd_byte *p = contents + (rel->r_offset & ~3); 16484 insn = bfd_get_32 (input_bfd, p); 16485 insn &= ~(0x1f << 16); 16486 insn |= 13 << 16; 16487 bfd_put_32 (input_bfd, insn, p); 16488 } 16489 break; 16490 } 16491 16492 /* Do any further special processing. */ 16493 switch (r_type) 16494 { 16495 default: 16496 break; 16497 16498 case R_PPC64_REL16_HA: 16499 case R_PPC64_REL16_HIGHA: 16500 case R_PPC64_REL16_HIGHERA: 16501 case R_PPC64_REL16_HIGHESTA: 16502 case R_PPC64_REL16DX_HA: 16503 case R_PPC64_ADDR16_HA: 16504 case R_PPC64_ADDR16_HIGHA: 16505 case R_PPC64_ADDR16_HIGHERA: 16506 case R_PPC64_ADDR16_HIGHESTA: 16507 case R_PPC64_TOC16_HA: 16508 case R_PPC64_SECTOFF_HA: 16509 case R_PPC64_TPREL16_HA: 16510 case R_PPC64_TPREL16_HIGHA: 16511 case R_PPC64_TPREL16_HIGHERA: 16512 case R_PPC64_TPREL16_HIGHESTA: 16513 case R_PPC64_DTPREL16_HA: 16514 case R_PPC64_DTPREL16_HIGHA: 16515 case R_PPC64_DTPREL16_HIGHERA: 16516 case R_PPC64_DTPREL16_HIGHESTA: 16517 /* It's just possible that this symbol is a weak symbol 16518 that's not actually defined anywhere. In that case, 16519 'sec' would be NULL, and we should leave the symbol 16520 alone (it will be set to zero elsewhere in the link). */ 16521 if (sec == NULL) 16522 break; 16523 /* Fall through. */ 16524 16525 case R_PPC64_GOT16_HA: 16526 case R_PPC64_PLTGOT16_HA: 16527 case R_PPC64_PLT16_HA: 16528 case R_PPC64_GOT_TLSGD16_HA: 16529 case R_PPC64_GOT_TLSLD16_HA: 16530 case R_PPC64_GOT_TPREL16_HA: 16531 case R_PPC64_GOT_DTPREL16_HA: 16532 /* Add 0x10000 if sign bit in 0:15 is set. 16533 Bits 0:15 are not used. */ 16534 addend += 0x8000; 16535 break; 16536 16537 case R_PPC64_D34_HA30: 16538 case R_PPC64_ADDR16_HIGHERA34: 16539 case R_PPC64_ADDR16_HIGHESTA34: 16540 case R_PPC64_REL16_HIGHERA34: 16541 case R_PPC64_REL16_HIGHESTA34: 16542 if (sec != NULL) 16543 addend += 1ULL << 33; 16544 break; 16545 16546 case R_PPC64_ADDR16_DS: 16547 case R_PPC64_ADDR16_LO_DS: 16548 case R_PPC64_GOT16_DS: 16549 case R_PPC64_GOT16_LO_DS: 16550 case R_PPC64_PLT16_LO_DS: 16551 case R_PPC64_SECTOFF_DS: 16552 case R_PPC64_SECTOFF_LO_DS: 16553 case R_PPC64_TOC16_DS: 16554 case R_PPC64_TOC16_LO_DS: 16555 case R_PPC64_PLTGOT16_DS: 16556 case R_PPC64_PLTGOT16_LO_DS: 16557 case R_PPC64_GOT_TPREL16_DS: 16558 case R_PPC64_GOT_TPREL16_LO_DS: 16559 case R_PPC64_GOT_DTPREL16_DS: 16560 case R_PPC64_GOT_DTPREL16_LO_DS: 16561 case R_PPC64_TPREL16_DS: 16562 case R_PPC64_TPREL16_LO_DS: 16563 case R_PPC64_DTPREL16_DS: 16564 case R_PPC64_DTPREL16_LO_DS: 16565 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3)); 16566 mask = 3; 16567 /* If this reloc is against an lq, lxv, or stxv insn, then 16568 the value must be a multiple of 16. This is somewhat of 16569 a hack, but the "correct" way to do this by defining _DQ 16570 forms of all the _DS relocs bloats all reloc switches in 16571 this file. It doesn't make much sense to use these 16572 relocs in data, so testing the insn should be safe. */ 16573 if ((insn & (0x3fu << 26)) == (56u << 26) 16574 || ((insn & (0x3fu << 26)) == (61u << 26) && (insn & 3) == 1)) 16575 mask = 15; 16576 relocation += addend; 16577 addend = insn & (mask ^ 3); 16578 if ((relocation & mask) != 0) 16579 { 16580 relocation ^= relocation & mask; 16581 info->callbacks->einfo 16582 /* xgettext:c-format */ 16583 (_("%H: error: %s not a multiple of %u\n"), 16584 input_bfd, input_section, rel->r_offset, 16585 ppc64_elf_howto_table[r_type]->name, 16586 mask + 1); 16587 bfd_set_error (bfd_error_bad_value); 16588 ret = FALSE; 16589 goto copy_reloc; 16590 } 16591 break; 16592 } 16593 16594 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections 16595 because such sections are not SEC_ALLOC and thus ld.so will 16596 not process them. */ 16597 howto = ppc64_elf_howto_table[(int) r_type]; 16598 if (unresolved_reloc 16599 && !((input_section->flags & SEC_DEBUGGING) != 0 16600 && h->elf.def_dynamic) 16601 && _bfd_elf_section_offset (output_bfd, info, input_section, 16602 rel->r_offset) != (bfd_vma) -1) 16603 { 16604 info->callbacks->einfo 16605 /* xgettext:c-format */ 16606 (_("%H: unresolvable %s against `%pT'\n"), 16607 input_bfd, input_section, rel->r_offset, 16608 howto->name, 16609 h->elf.root.root.string); 16610 ret = FALSE; 16611 } 16612 16613 /* 16-bit fields in insns mostly have signed values, but a 16614 few insns have 16-bit unsigned values. Really, we should 16615 have different reloc types. */ 16616 if (howto->complain_on_overflow != complain_overflow_dont 16617 && howto->dst_mask == 0xffff 16618 && (input_section->flags & SEC_CODE) != 0) 16619 { 16620 enum complain_overflow complain = complain_overflow_signed; 16621 16622 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3)); 16623 if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */) 16624 complain = complain_overflow_bitfield; 16625 else if (howto->rightshift == 0 16626 ? ((insn & (0x3fu << 26)) == 28u << 26 /* andi */ 16627 || (insn & (0x3fu << 26)) == 24u << 26 /* ori */ 16628 || (insn & (0x3fu << 26)) == 26u << 26 /* xori */) 16629 : ((insn & (0x3fu << 26)) == 29u << 26 /* andis */ 16630 || (insn & (0x3fu << 26)) == 25u << 26 /* oris */ 16631 || (insn & (0x3fu << 26)) == 27u << 26 /* xoris */)) 16632 complain = complain_overflow_unsigned; 16633 if (howto->complain_on_overflow != complain) 16634 { 16635 alt_howto = *howto; 16636 alt_howto.complain_on_overflow = complain; 16637 howto = &alt_howto; 16638 } 16639 } 16640 16641 switch (r_type) 16642 { 16643 /* Split field relocs aren't handled by _bfd_final_link_relocate. */ 16644 case R_PPC64_D34: 16645 case R_PPC64_D34_LO: 16646 case R_PPC64_D34_HI30: 16647 case R_PPC64_D34_HA30: 16648 case R_PPC64_PCREL34: 16649 case R_PPC64_GOT_PCREL34: 16650 case R_PPC64_TPREL34: 16651 case R_PPC64_DTPREL34: 16652 case R_PPC64_GOT_TLSGD34: 16653 case R_PPC64_GOT_TLSLD34: 16654 case R_PPC64_GOT_TPREL34: 16655 case R_PPC64_GOT_DTPREL34: 16656 case R_PPC64_PLT_PCREL34: 16657 case R_PPC64_PLT_PCREL34_NOTOC: 16658 case R_PPC64_D28: 16659 case R_PPC64_PCREL28: 16660 if (rel->r_offset + 8 > input_section->size) 16661 r = bfd_reloc_outofrange; 16662 else 16663 { 16664 relocation += addend; 16665 if (howto->pc_relative) 16666 relocation -= (rel->r_offset 16667 + input_section->output_offset 16668 + input_section->output_section->vma); 16669 relocation >>= howto->rightshift; 16670 16671 pinsn = bfd_get_32 (input_bfd, contents + rel->r_offset); 16672 pinsn <<= 32; 16673 pinsn |= bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 16674 16675 pinsn &= ~howto->dst_mask; 16676 pinsn |= (((relocation << 16) | (relocation & 0xffff)) 16677 & howto->dst_mask); 16678 bfd_put_32 (input_bfd, pinsn >> 32, contents + rel->r_offset); 16679 bfd_put_32 (input_bfd, pinsn, contents + rel->r_offset + 4); 16680 r = bfd_reloc_ok; 16681 if (howto->complain_on_overflow == complain_overflow_signed 16682 && (relocation + (1ULL << (howto->bitsize - 1)) 16683 >= 1ULL << howto->bitsize)) 16684 r = bfd_reloc_overflow; 16685 } 16686 break; 16687 16688 case R_PPC64_REL16DX_HA: 16689 if (rel->r_offset + 4 > input_section->size) 16690 r = bfd_reloc_outofrange; 16691 else 16692 { 16693 relocation += addend; 16694 relocation -= (rel->r_offset 16695 + input_section->output_offset 16696 + input_section->output_section->vma); 16697 relocation = (bfd_signed_vma) relocation >> 16; 16698 insn = bfd_get_32 (input_bfd, contents + rel->r_offset); 16699 insn &= ~0x1fffc1; 16700 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15); 16701 bfd_put_32 (input_bfd, insn, contents + rel->r_offset); 16702 r = bfd_reloc_ok; 16703 if (relocation + 0x8000 > 0xffff) 16704 r = bfd_reloc_overflow; 16705 } 16706 break; 16707 16708 default: 16709 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 16710 contents, rel->r_offset, 16711 relocation, addend); 16712 } 16713 16714 if (r != bfd_reloc_ok) 16715 { 16716 char *more_info = NULL; 16717 const char *reloc_name = howto->name; 16718 16719 if (reloc_dest != DEST_NORMAL) 16720 { 16721 more_info = bfd_malloc (strlen (reloc_name) + 8); 16722 if (more_info != NULL) 16723 { 16724 strcpy (more_info, reloc_name); 16725 strcat (more_info, (reloc_dest == DEST_OPD 16726 ? " (OPD)" : " (stub)")); 16727 reloc_name = more_info; 16728 } 16729 } 16730 16731 if (r == bfd_reloc_overflow) 16732 { 16733 /* On code like "if (foo) foo();" don't report overflow 16734 on a branch to zero when foo is undefined. */ 16735 if (!warned 16736 && (reloc_dest == DEST_STUB 16737 || !(h != NULL 16738 && (h->elf.root.type == bfd_link_hash_undefweak 16739 || h->elf.root.type == bfd_link_hash_undefined) 16740 && is_branch_reloc (r_type)))) 16741 info->callbacks->reloc_overflow (info, &h->elf.root, 16742 sym_name, reloc_name, 16743 orig_rel.r_addend, 16744 input_bfd, input_section, 16745 rel->r_offset); 16746 } 16747 else 16748 { 16749 info->callbacks->einfo 16750 /* xgettext:c-format */ 16751 (_("%H: %s against `%pT': error %d\n"), 16752 input_bfd, input_section, rel->r_offset, 16753 reloc_name, sym_name, (int) r); 16754 ret = FALSE; 16755 } 16756 if (more_info != NULL) 16757 free (more_info); 16758 } 16759 copy_reloc: 16760 if (wrel != rel) 16761 *wrel = *rel; 16762 } 16763 16764 if (wrel != rel) 16765 { 16766 Elf_Internal_Shdr *rel_hdr; 16767 size_t deleted = rel - wrel; 16768 16769 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section); 16770 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted; 16771 if (rel_hdr->sh_size == 0) 16772 { 16773 /* It is too late to remove an empty reloc section. Leave 16774 one NONE reloc. 16775 ??? What is wrong with an empty section??? */ 16776 rel_hdr->sh_size = rel_hdr->sh_entsize; 16777 deleted -= 1; 16778 } 16779 rel_hdr = _bfd_elf_single_rel_hdr (input_section); 16780 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted; 16781 input_section->reloc_count -= deleted; 16782 } 16783 16784 /* If we're emitting relocations, then shortly after this function 16785 returns, reloc offsets and addends for this section will be 16786 adjusted. Worse, reloc symbol indices will be for the output 16787 file rather than the input. Save a copy of the relocs for 16788 opd_entry_value. */ 16789 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info))) 16790 { 16791 bfd_size_type amt; 16792 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela); 16793 rel = bfd_alloc (input_bfd, amt); 16794 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL); 16795 ppc64_elf_tdata (input_bfd)->opd.relocs = rel; 16796 if (rel == NULL) 16797 return FALSE; 16798 memcpy (rel, relocs, amt); 16799 } 16800 return ret; 16801 } 16802 16803 /* Adjust the value of any local symbols in opd sections. */ 16804 16805 static int 16806 ppc64_elf_output_symbol_hook (struct bfd_link_info *info, 16807 const char *name ATTRIBUTE_UNUSED, 16808 Elf_Internal_Sym *elfsym, 16809 asection *input_sec, 16810 struct elf_link_hash_entry *h) 16811 { 16812 struct _opd_sec_data *opd; 16813 long adjust; 16814 bfd_vma value; 16815 16816 if (h != NULL) 16817 return 1; 16818 16819 opd = get_opd_info (input_sec); 16820 if (opd == NULL || opd->adjust == NULL) 16821 return 1; 16822 16823 value = elfsym->st_value - input_sec->output_offset; 16824 if (!bfd_link_relocatable (info)) 16825 value -= input_sec->output_section->vma; 16826 16827 adjust = opd->adjust[OPD_NDX (value)]; 16828 if (adjust == -1) 16829 return 2; 16830 16831 elfsym->st_value += adjust; 16832 return 1; 16833 } 16834 16835 /* Finish up dynamic symbol handling. We set the contents of various 16836 dynamic sections here. */ 16837 16838 static bfd_boolean 16839 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd, 16840 struct bfd_link_info *info, 16841 struct elf_link_hash_entry *h, 16842 Elf_Internal_Sym *sym) 16843 { 16844 struct ppc_link_hash_table *htab; 16845 struct plt_entry *ent; 16846 16847 htab = ppc_hash_table (info); 16848 if (htab == NULL) 16849 return FALSE; 16850 16851 if (!htab->opd_abi && !h->def_regular) 16852 for (ent = h->plt.plist; ent != NULL; ent = ent->next) 16853 if (ent->plt.offset != (bfd_vma) -1) 16854 { 16855 /* Mark the symbol as undefined, rather than as 16856 defined in glink. Leave the value if there were 16857 any relocations where pointer equality matters 16858 (this is a clue for the dynamic linker, to make 16859 function pointer comparisons work between an 16860 application and shared library), otherwise set it 16861 to zero. */ 16862 sym->st_shndx = SHN_UNDEF; 16863 if (!h->pointer_equality_needed) 16864 sym->st_value = 0; 16865 else if (!h->ref_regular_nonweak) 16866 { 16867 /* This breaks function pointer comparisons, but 16868 that is better than breaking tests for a NULL 16869 function pointer. */ 16870 sym->st_value = 0; 16871 } 16872 break; 16873 } 16874 16875 if (h->needs_copy 16876 && (h->root.type == bfd_link_hash_defined 16877 || h->root.type == bfd_link_hash_defweak) 16878 && (h->root.u.def.section == htab->elf.sdynbss 16879 || h->root.u.def.section == htab->elf.sdynrelro)) 16880 { 16881 /* This symbol needs a copy reloc. Set it up. */ 16882 Elf_Internal_Rela rela; 16883 asection *srel; 16884 bfd_byte *loc; 16885 16886 if (h->dynindx == -1) 16887 abort (); 16888 16889 rela.r_offset = (h->root.u.def.value 16890 + h->root.u.def.section->output_section->vma 16891 + h->root.u.def.section->output_offset); 16892 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY); 16893 rela.r_addend = 0; 16894 if (h->root.u.def.section == htab->elf.sdynrelro) 16895 srel = htab->elf.sreldynrelro; 16896 else 16897 srel = htab->elf.srelbss; 16898 loc = srel->contents; 16899 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela); 16900 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); 16901 } 16902 16903 return TRUE; 16904 } 16905 16906 /* Used to decide how to sort relocs in an optimal manner for the 16907 dynamic linker, before writing them out. */ 16908 16909 static enum elf_reloc_type_class 16910 ppc64_elf_reloc_type_class (const struct bfd_link_info *info, 16911 const asection *rel_sec, 16912 const Elf_Internal_Rela *rela) 16913 { 16914 enum elf_ppc64_reloc_type r_type; 16915 struct ppc_link_hash_table *htab = ppc_hash_table (info); 16916 16917 if (rel_sec == htab->elf.irelplt) 16918 return reloc_class_ifunc; 16919 16920 r_type = ELF64_R_TYPE (rela->r_info); 16921 switch (r_type) 16922 { 16923 case R_PPC64_RELATIVE: 16924 return reloc_class_relative; 16925 case R_PPC64_JMP_SLOT: 16926 return reloc_class_plt; 16927 case R_PPC64_COPY: 16928 return reloc_class_copy; 16929 default: 16930 return reloc_class_normal; 16931 } 16932 } 16933 16934 /* Finish up the dynamic sections. */ 16935 16936 static bfd_boolean 16937 ppc64_elf_finish_dynamic_sections (bfd *output_bfd, 16938 struct bfd_link_info *info) 16939 { 16940 struct ppc_link_hash_table *htab; 16941 bfd *dynobj; 16942 asection *sdyn; 16943 16944 htab = ppc_hash_table (info); 16945 if (htab == NULL) 16946 return FALSE; 16947 16948 dynobj = htab->elf.dynobj; 16949 sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 16950 16951 if (htab->elf.dynamic_sections_created) 16952 { 16953 Elf64_External_Dyn *dyncon, *dynconend; 16954 16955 if (sdyn == NULL || htab->elf.sgot == NULL) 16956 abort (); 16957 16958 dyncon = (Elf64_External_Dyn *) sdyn->contents; 16959 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size); 16960 for (; dyncon < dynconend; dyncon++) 16961 { 16962 Elf_Internal_Dyn dyn; 16963 asection *s; 16964 16965 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); 16966 16967 switch (dyn.d_tag) 16968 { 16969 default: 16970 continue; 16971 16972 case DT_PPC64_GLINK: 16973 s = htab->glink; 16974 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 16975 /* We stupidly defined DT_PPC64_GLINK to be the start 16976 of glink rather than the first entry point, which is 16977 what ld.so needs, and now have a bigger stub to 16978 support automatic multiple TOCs. */ 16979 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4; 16980 break; 16981 16982 case DT_PPC64_OPD: 16983 s = bfd_get_section_by_name (output_bfd, ".opd"); 16984 if (s == NULL) 16985 continue; 16986 dyn.d_un.d_ptr = s->vma; 16987 break; 16988 16989 case DT_PPC64_OPT: 16990 if ((htab->do_multi_toc && htab->multi_toc_needed) 16991 || htab->notoc_plt) 16992 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC; 16993 if (htab->has_plt_localentry0) 16994 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY; 16995 break; 16996 16997 case DT_PPC64_OPDSZ: 16998 s = bfd_get_section_by_name (output_bfd, ".opd"); 16999 if (s == NULL) 17000 continue; 17001 dyn.d_un.d_val = s->size; 17002 break; 17003 17004 case DT_PLTGOT: 17005 s = htab->elf.splt; 17006 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 17007 break; 17008 17009 case DT_JMPREL: 17010 s = htab->elf.srelplt; 17011 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 17012 break; 17013 17014 case DT_PLTRELSZ: 17015 dyn.d_un.d_val = htab->elf.srelplt->size; 17016 break; 17017 17018 case DT_TEXTREL: 17019 if (htab->local_ifunc_resolver) 17020 info->callbacks->einfo 17021 (_("%X%P: text relocations and GNU indirect " 17022 "functions will result in a segfault at runtime\n")); 17023 else if (htab->maybe_local_ifunc_resolver) 17024 info->callbacks->einfo 17025 (_("%P: warning: text relocations and GNU indirect " 17026 "functions may result in a segfault at runtime\n")); 17027 continue; 17028 } 17029 17030 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); 17031 } 17032 } 17033 17034 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0 17035 && htab->elf.sgot->output_section != bfd_abs_section_ptr) 17036 { 17037 /* Fill in the first entry in the global offset table. 17038 We use it to hold the link-time TOCbase. */ 17039 bfd_put_64 (output_bfd, 17040 elf_gp (output_bfd) + TOC_BASE_OFF, 17041 htab->elf.sgot->contents); 17042 17043 /* Set .got entry size. */ 17044 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize 17045 = 8; 17046 } 17047 17048 if (htab->elf.splt != NULL && htab->elf.splt->size != 0 17049 && htab->elf.splt->output_section != bfd_abs_section_ptr) 17050 { 17051 /* Set .plt entry size. */ 17052 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize 17053 = PLT_ENTRY_SIZE (htab); 17054 } 17055 17056 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for 17057 brlt ourselves if emitrelocations. */ 17058 if (htab->brlt != NULL 17059 && htab->brlt->reloc_count != 0 17060 && !_bfd_elf_link_output_relocs (output_bfd, 17061 htab->brlt, 17062 elf_section_data (htab->brlt)->rela.hdr, 17063 elf_section_data (htab->brlt)->relocs, 17064 NULL)) 17065 return FALSE; 17066 17067 if (htab->glink != NULL 17068 && htab->glink->reloc_count != 0 17069 && !_bfd_elf_link_output_relocs (output_bfd, 17070 htab->glink, 17071 elf_section_data (htab->glink)->rela.hdr, 17072 elf_section_data (htab->glink)->relocs, 17073 NULL)) 17074 return FALSE; 17075 17076 17077 if (htab->glink_eh_frame != NULL 17078 && htab->glink_eh_frame->size != 0 17079 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME 17080 && !_bfd_elf_write_section_eh_frame (output_bfd, info, 17081 htab->glink_eh_frame, 17082 htab->glink_eh_frame->contents)) 17083 return FALSE; 17084 17085 /* We need to handle writing out multiple GOT sections ourselves, 17086 since we didn't add them to DYNOBJ. We know dynobj is the first 17087 bfd. */ 17088 while ((dynobj = dynobj->link.next) != NULL) 17089 { 17090 asection *s; 17091 17092 if (!is_ppc64_elf (dynobj)) 17093 continue; 17094 17095 s = ppc64_elf_tdata (dynobj)->got; 17096 if (s != NULL 17097 && s->size != 0 17098 && s->output_section != bfd_abs_section_ptr 17099 && !bfd_set_section_contents (output_bfd, s->output_section, 17100 s->contents, s->output_offset, 17101 s->size)) 17102 return FALSE; 17103 s = ppc64_elf_tdata (dynobj)->relgot; 17104 if (s != NULL 17105 && s->size != 0 17106 && s->output_section != bfd_abs_section_ptr 17107 && !bfd_set_section_contents (output_bfd, s->output_section, 17108 s->contents, s->output_offset, 17109 s->size)) 17110 return FALSE; 17111 } 17112 17113 return TRUE; 17114 } 17115 17116 #include "elf64-target.h" 17117 17118 /* FreeBSD support */ 17119 17120 #undef TARGET_LITTLE_SYM 17121 #undef TARGET_LITTLE_NAME 17122 17123 #undef TARGET_BIG_SYM 17124 #define TARGET_BIG_SYM powerpc_elf64_fbsd_vec 17125 #undef TARGET_BIG_NAME 17126 #define TARGET_BIG_NAME "elf64-powerpc-freebsd" 17127 17128 #undef ELF_OSABI 17129 #define ELF_OSABI ELFOSABI_FREEBSD 17130 17131 #undef elf64_bed 17132 #define elf64_bed elf64_powerpc_fbsd_bed 17133 17134 #include "elf64-target.h" 17135