elf64-ppc.c revision 94536
1152830Sdavidxu/* PowerPC64-specific support for 64-bit ELF. 2152830Sdavidxu Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. 3152830Sdavidxu Written by Linus Nordberg, Swox AB <info@swox.com>, 4152830Sdavidxu based on elf32-ppc.c by Ian Lance Taylor. 5152830Sdavidxu 6152830SdavidxuThis file is part of BFD, the Binary File Descriptor library. 7152830Sdavidxu 8152830SdavidxuThis program is free software; you can redistribute it and/or modify 9152830Sdavidxuit under the terms of the GNU General Public License as published by 10152830Sdavidxuthe Free Software Foundation; either version 2 of the License, or 11152830Sdavidxu(at your option) any later version. 12152830Sdavidxu 13152830SdavidxuThis program is distributed in the hope that it will be useful, 14152830Sdavidxubut WITHOUT ANY WARRANTY; without even the implied warranty of 15152830SdavidxuMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16152830SdavidxuGNU General Public License for more details. 17152830Sdavidxu 18152830SdavidxuYou should have received a copy of the GNU General Public License 19152830Sdavidxualong with this program; if not, write to the Free Software 20152830SdavidxuFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 21152830Sdavidxu 22152830Sdavidxu/* This file is based on the 64-bit PowerPC ELF ABI. It is also based 23152830Sdavidxu on the file elf32-ppc.c. */ 24152830Sdavidxu 25152830Sdavidxu#include "bfd.h" 26152830Sdavidxu#include "sysdep.h" 27152830Sdavidxu#include "bfdlink.h" 28152830Sdavidxu#include "libbfd.h" 29152830Sdavidxu#include "elf-bfd.h" 30152830Sdavidxu#include "elf/ppc.h" 31152830Sdavidxu#include "elf64-ppc.h" 32152950Sdavidxu 33152830Sdavidxu#define USE_RELA /* we want RELA relocations, not REL. */ 34152830Sdavidxu 35240297Sdavidxu 36152830Sdavidxustatic void ppc_howto_init 37152830Sdavidxu PARAMS ((void)); 38152830Sdavidxustatic reloc_howto_type *ppc64_elf_reloc_type_lookup 39152950Sdavidxu PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); 40152830Sdavidxustatic void ppc64_elf_info_to_howto 41152830Sdavidxu PARAMS ((bfd *abfd, arelent *cache_ptr, Elf64_Internal_Rela *dst)); 42152830Sdavidxustatic bfd_reloc_status_type ppc64_elf_addr16_ha_reloc 43152830Sdavidxu PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); 44152830Sdavidxustatic boolean ppc64_elf_set_private_flags 45152830Sdavidxu PARAMS ((bfd *, flagword)); 46152830Sdavidxustatic boolean ppc64_elf_merge_private_bfd_data 47152830Sdavidxu PARAMS ((bfd *, bfd *)); 48152830Sdavidxustatic boolean ppc64_elf_section_from_shdr 49152830Sdavidxu PARAMS ((bfd *, Elf64_Internal_Shdr *, char *)); 50152830Sdavidxustatic struct bfd_hash_entry *link_hash_newfunc 51152830Sdavidxu PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); 52152830Sdavidxustatic struct bfd_link_hash_table *ppc64_elf_link_hash_table_create 53165828Sdavidxu PARAMS ((bfd *)); 54165828Sdavidxustatic boolean create_linkage_sections 55152950Sdavidxu PARAMS ((bfd *, struct bfd_link_info *)); 56152830Sdavidxustatic boolean create_got_section 57 PARAMS ((bfd *, struct bfd_link_info *)); 58static boolean ppc64_elf_create_dynamic_sections 59 PARAMS ((bfd *, struct bfd_link_info *)); 60static void ppc64_elf_copy_indirect_symbol 61 PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *)); 62static boolean ppc64_elf_check_relocs 63 PARAMS ((bfd *, struct bfd_link_info *, asection *, 64 const Elf_Internal_Rela *)); 65static asection * ppc64_elf_gc_mark_hook 66 PARAMS ((bfd *abfd, struct bfd_link_info *info, Elf_Internal_Rela *rel, 67 struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)); 68static boolean ppc64_elf_gc_sweep_hook 69 PARAMS ((bfd *abfd, struct bfd_link_info *info, asection *sec, 70 const Elf_Internal_Rela *relocs)); 71static boolean func_desc_adjust 72 PARAMS ((struct elf_link_hash_entry *, PTR)); 73static boolean ppc64_elf_func_desc_adjust 74 PARAMS ((bfd *, struct bfd_link_info *)); 75static boolean ppc64_elf_adjust_dynamic_symbol 76 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); 77static void ppc64_elf_hide_symbol 78 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, boolean)); 79static boolean allocate_dynrelocs 80 PARAMS ((struct elf_link_hash_entry *, PTR)); 81static boolean readonly_dynrelocs 82 PARAMS ((struct elf_link_hash_entry *, PTR)); 83static enum elf_reloc_type_class ppc64_elf_reloc_type_class 84 PARAMS ((const Elf_Internal_Rela *)); 85static boolean ppc64_elf_size_dynamic_sections 86 PARAMS ((bfd *, struct bfd_link_info *)); 87static bfd_byte *build_plt_stub 88 PARAMS ((bfd *, bfd_byte *, int, int)); 89static boolean build_one_stub 90 PARAMS ((struct elf_link_hash_entry *, PTR)); 91static boolean ppc64_elf_fake_sections 92 PARAMS ((bfd *, Elf64_Internal_Shdr *, asection *)); 93static boolean ppc64_elf_relocate_section 94 PARAMS ((bfd *, struct bfd_link_info *info, bfd *, asection *, bfd_byte *, 95 Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms, 96 asection **)); 97static boolean ppc64_elf_finish_dynamic_symbol 98 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, 99 Elf_Internal_Sym *)); 100static boolean ppc64_elf_finish_dynamic_sections 101 PARAMS ((bfd *, struct bfd_link_info *)); 102 103 104/* Mask to set RA in memory instructions. */ 105#define RA_REGISTER_MASK 0x001f0000 106 107/* Value to shift register by to insert RA. */ 108#define RA_REGISTER_SHIFT 16 109 110/* The name of the dynamic interpreter. This is put in the .interp 111 section. */ 112#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" 113 114/* The size in bytes of an entry in the procedure linkage table. */ 115#define PLT_ENTRY_SIZE 24 116 117/* The initial size of the plt reserved for the dynamic linker. */ 118#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE 119 120/* TOC base pointers offset from start of TOC. */ 121#define TOC_BASE_OFF (0x8000) 122 123/* .plt call stub instructions. */ 124#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */ 125#define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */ 126#define LD_R11_0R12 0xe96c0000 /* ld %r11,xxx+0@l(%r12) */ 127#define LD_R2_0R12 0xe84c0000 /* ld %r2,xxx+8@l(%r12) */ 128#define MTCTR_R11 0x7d6903a6 /* mtctr %r11 */ 129 /* ld %r11,xxx+16@l(%r12) */ 130#define BCTR 0x4e800420 /* bctr */ 131 132/* The normal stub is this size. */ 133#define PLT_CALL_STUB_SIZE (7*4) 134 135/* But sometimes the .plt entry crosses a 64k boundary, and we need 136 to adjust the high word with this insn. */ 137#define ADDIS_R12_R12_1 0x3d8c0001 /* addis %r12,%r12,1 */ 138 139/* The .glink fixup call stub is the same as the .plt call stub, but 140 the first instruction restores r2, and the std is omitted. */ 141#define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */ 142 143/* Always allow this much space. */ 144#define GLINK_CALL_STUB_SIZE (8*4) 145 146/* Pad with this. */ 147#define NOP 0x60000000 148 149/* .glink entries for the first 32k functions are two instructions. */ 150#define LI_R0_0 0x38000000 /* li %r0,0 */ 151#define B_DOT 0x48000000 /* b . */ 152 153/* After that, we need two instructions to load the index, followed by 154 a branch. */ 155#define LIS_R0_0 0x3c000000 /* lis %r0,0 */ 156#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */ 157 158/* Instructions to save and restore floating point regs. */ 159#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */ 160#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */ 161#define BLR 0x4e800020 /* blr */ 162 163/* Since .opd is an array of descriptors and each entry will end up 164 with identical R_PPC64_RELATIVE relocs, there is really no need to 165 propagate .opd relocs; The dynamic linker should be taught to 166 relocate .opd without reloc entries. FIXME: .opd should be trimmed 167 of unused values. */ 168#ifndef NO_OPD_RELOCS 169#define NO_OPD_RELOCS 0 170#endif 171 172/* Relocation HOWTO's. */ 173static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC_max]; 174 175static reloc_howto_type ppc64_elf_howto_raw[] = { 176 /* This reloc does nothing. */ 177 HOWTO (R_PPC64_NONE, /* type */ 178 0, /* rightshift */ 179 2, /* size (0 = byte, 1 = short, 2 = long) */ 180 32, /* bitsize */ 181 false, /* pc_relative */ 182 0, /* bitpos */ 183 complain_overflow_bitfield, /* complain_on_overflow */ 184 bfd_elf_generic_reloc, /* special_function */ 185 "R_PPC64_NONE", /* name */ 186 false, /* partial_inplace */ 187 0, /* src_mask */ 188 0, /* dst_mask */ 189 false), /* pcrel_offset */ 190 191 /* A standard 32 bit relocation. */ 192 HOWTO (R_PPC64_ADDR32, /* type */ 193 0, /* rightshift */ 194 2, /* size (0 = byte, 1 = short, 2 = long) */ 195 32, /* bitsize */ 196 false, /* pc_relative */ 197 0, /* bitpos */ 198 complain_overflow_bitfield, /* complain_on_overflow */ 199 bfd_elf_generic_reloc, /* special_function */ 200 "R_PPC64_ADDR32", /* name */ 201 false, /* partial_inplace */ 202 0, /* src_mask */ 203 0xffffffff, /* dst_mask */ 204 false), /* pcrel_offset */ 205 206 /* An absolute 26 bit branch; the lower two bits must be zero. 207 FIXME: we don't check that, we just clear them. */ 208 HOWTO (R_PPC64_ADDR24, /* type */ 209 0, /* rightshift */ 210 2, /* size (0 = byte, 1 = short, 2 = long) */ 211 26, /* bitsize */ 212 false, /* pc_relative */ 213 0, /* bitpos */ 214 complain_overflow_bitfield, /* complain_on_overflow */ 215 bfd_elf_generic_reloc, /* special_function */ 216 "R_PPC64_ADDR24", /* name */ 217 false, /* partial_inplace */ 218 0, /* src_mask */ 219 0x3fffffc, /* dst_mask */ 220 false), /* pcrel_offset */ 221 222 /* A standard 16 bit relocation. */ 223 HOWTO (R_PPC64_ADDR16, /* type */ 224 0, /* rightshift */ 225 1, /* size (0 = byte, 1 = short, 2 = long) */ 226 16, /* bitsize */ 227 false, /* pc_relative */ 228 0, /* bitpos */ 229 complain_overflow_bitfield, /* complain_on_overflow */ 230 bfd_elf_generic_reloc, /* special_function */ 231 "R_PPC64_ADDR16", /* name */ 232 false, /* partial_inplace */ 233 0, /* src_mask */ 234 0xffff, /* dst_mask */ 235 false), /* pcrel_offset */ 236 237 /* A 16 bit relocation without overflow. */ 238 HOWTO (R_PPC64_ADDR16_LO, /* type */ 239 0, /* rightshift */ 240 1, /* size (0 = byte, 1 = short, 2 = long) */ 241 16, /* bitsize */ 242 false, /* pc_relative */ 243 0, /* bitpos */ 244 complain_overflow_dont,/* complain_on_overflow */ 245 bfd_elf_generic_reloc, /* special_function */ 246 "R_PPC64_ADDR16_LO", /* name */ 247 false, /* partial_inplace */ 248 0, /* src_mask */ 249 0xffff, /* dst_mask */ 250 false), /* pcrel_offset */ 251 252 /* Bits 16-31 of an address. */ 253 HOWTO (R_PPC64_ADDR16_HI, /* type */ 254 16, /* rightshift */ 255 1, /* size (0 = byte, 1 = short, 2 = long) */ 256 16, /* bitsize */ 257 false, /* pc_relative */ 258 0, /* bitpos */ 259 complain_overflow_dont, /* complain_on_overflow */ 260 bfd_elf_generic_reloc, /* special_function */ 261 "R_PPC64_ADDR16_HI", /* name */ 262 false, /* partial_inplace */ 263 0, /* src_mask */ 264 0xffff, /* dst_mask */ 265 false), /* pcrel_offset */ 266 267 /* Bits 16-31 of an address, plus 1 if the contents of the low 16 268 bits, treated as a signed number, is negative. */ 269 HOWTO (R_PPC64_ADDR16_HA, /* type */ 270 16, /* rightshift */ 271 1, /* size (0 = byte, 1 = short, 2 = long) */ 272 16, /* bitsize */ 273 false, /* pc_relative */ 274 0, /* bitpos */ 275 complain_overflow_dont, /* complain_on_overflow */ 276 ppc64_elf_addr16_ha_reloc, /* special_function */ 277 "R_PPC64_ADDR16_HA", /* name */ 278 false, /* partial_inplace */ 279 0, /* src_mask */ 280 0xffff, /* dst_mask */ 281 false), /* pcrel_offset */ 282 283 /* An absolute 16 bit branch; the lower two bits must be zero. 284 FIXME: we don't check that, we just clear them. */ 285 HOWTO (R_PPC64_ADDR14, /* type */ 286 0, /* rightshift */ 287 2, /* size (0 = byte, 1 = short, 2 = long) */ 288 16, /* bitsize */ 289 false, /* pc_relative */ 290 0, /* bitpos */ 291 complain_overflow_bitfield, /* complain_on_overflow */ 292 bfd_elf_generic_reloc, /* special_function */ 293 "R_PPC64_ADDR14", /* name */ 294 false, /* partial_inplace */ 295 0, /* src_mask */ 296 0xfffc, /* dst_mask */ 297 false), /* pcrel_offset */ 298 299 /* An absolute 16 bit branch, for which bit 10 should be set to 300 indicate that the branch is expected to be taken. The lower two 301 bits must be zero. */ 302 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */ 303 0, /* rightshift */ 304 2, /* size (0 = byte, 1 = short, 2 = long) */ 305 16, /* bitsize */ 306 false, /* pc_relative */ 307 0, /* bitpos */ 308 complain_overflow_bitfield, /* complain_on_overflow */ 309 bfd_elf_generic_reloc, /* special_function */ 310 "R_PPC64_ADDR14_BRTAKEN",/* name */ 311 false, /* partial_inplace */ 312 0, /* src_mask */ 313 0xfffc, /* dst_mask */ 314 false), /* pcrel_offset */ 315 316 /* An absolute 16 bit branch, for which bit 10 should be set to 317 indicate that the branch is not expected to be taken. The lower 318 two bits must be zero. */ 319 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */ 320 0, /* rightshift */ 321 2, /* size (0 = byte, 1 = short, 2 = long) */ 322 16, /* bitsize */ 323 false, /* pc_relative */ 324 0, /* bitpos */ 325 complain_overflow_bitfield, /* complain_on_overflow */ 326 bfd_elf_generic_reloc, /* special_function */ 327 "R_PPC64_ADDR14_BRNTAKEN",/* name */ 328 false, /* partial_inplace */ 329 0, /* src_mask */ 330 0xfffc, /* dst_mask */ 331 false), /* pcrel_offset */ 332 333 /* A relative 26 bit branch; the lower two bits must be zero. */ 334 HOWTO (R_PPC64_REL24, /* type */ 335 0, /* rightshift */ 336 2, /* size (0 = byte, 1 = short, 2 = long) */ 337 26, /* bitsize */ 338 true, /* pc_relative */ 339 0, /* bitpos */ 340 complain_overflow_signed, /* complain_on_overflow */ 341 bfd_elf_generic_reloc, /* special_function */ 342 "R_PPC64_REL24", /* name */ 343 false, /* partial_inplace */ 344 0, /* src_mask */ 345 0x3fffffc, /* dst_mask */ 346 true), /* pcrel_offset */ 347 348 /* A relative 16 bit branch; the lower two bits must be zero. */ 349 HOWTO (R_PPC64_REL14, /* type */ 350 0, /* rightshift */ 351 2, /* size (0 = byte, 1 = short, 2 = long) */ 352 16, /* bitsize */ 353 true, /* pc_relative */ 354 0, /* bitpos */ 355 complain_overflow_signed, /* complain_on_overflow */ 356 bfd_elf_generic_reloc, /* special_function */ 357 "R_PPC64_REL14", /* name */ 358 false, /* partial_inplace */ 359 0, /* src_mask */ 360 0xfffc, /* dst_mask */ 361 true), /* pcrel_offset */ 362 363 /* A relative 16 bit branch. Bit 10 should be set to indicate that 364 the branch is expected to be taken. The lower two bits must be 365 zero. */ 366 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */ 367 0, /* rightshift */ 368 2, /* size (0 = byte, 1 = short, 2 = long) */ 369 16, /* bitsize */ 370 true, /* pc_relative */ 371 0, /* bitpos */ 372 complain_overflow_signed, /* complain_on_overflow */ 373 bfd_elf_generic_reloc, /* special_function */ 374 "R_PPC64_REL14_BRTAKEN", /* name */ 375 false, /* partial_inplace */ 376 0, /* src_mask */ 377 0xfffc, /* dst_mask */ 378 true), /* pcrel_offset */ 379 380 /* A relative 16 bit branch. Bit 10 should be set to indicate that 381 the branch is not expected to be taken. The lower two bits must 382 be zero. */ 383 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */ 384 0, /* rightshift */ 385 2, /* size (0 = byte, 1 = short, 2 = long) */ 386 16, /* bitsize */ 387 true, /* pc_relative */ 388 0, /* bitpos */ 389 complain_overflow_signed, /* complain_on_overflow */ 390 bfd_elf_generic_reloc, /* special_function */ 391 "R_PPC64_REL14_BRNTAKEN",/* name */ 392 false, /* partial_inplace */ 393 0, /* src_mask */ 394 0xfffc, /* dst_mask */ 395 true), /* pcrel_offset */ 396 397 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the 398 symbol. */ 399 HOWTO (R_PPC64_GOT16, /* type */ 400 0, /* rightshift */ 401 1, /* size (0 = byte, 1 = short, 2 = long) */ 402 16, /* bitsize */ 403 false, /* pc_relative */ 404 0, /* bitpos */ 405 complain_overflow_signed, /* complain_on_overflow */ 406 bfd_elf_generic_reloc, /* special_function */ 407 "R_PPC64_GOT16", /* name */ 408 false, /* partial_inplace */ 409 0, /* src_mask */ 410 0xffff, /* dst_mask */ 411 false), /* pcrel_offset */ 412 413 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for 414 the symbol. */ 415 HOWTO (R_PPC64_GOT16_LO, /* type */ 416 0, /* rightshift */ 417 1, /* size (0 = byte, 1 = short, 2 = long) */ 418 16, /* bitsize */ 419 false, /* pc_relative */ 420 0, /* bitpos */ 421 complain_overflow_dont, /* complain_on_overflow */ 422 bfd_elf_generic_reloc, /* special_function */ 423 "R_PPC64_GOT16_LO", /* name */ 424 false, /* partial_inplace */ 425 0, /* src_mask */ 426 0xffff, /* dst_mask */ 427 false), /* pcrel_offset */ 428 429 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for 430 the symbol. */ 431 HOWTO (R_PPC64_GOT16_HI, /* type */ 432 16, /* rightshift */ 433 1, /* size (0 = byte, 1 = short, 2 = long) */ 434 16, /* bitsize */ 435 false, /* pc_relative */ 436 0, /* bitpos */ 437 complain_overflow_dont,/* complain_on_overflow */ 438 bfd_elf_generic_reloc, /* special_function */ 439 "R_PPC64_GOT16_HI", /* name */ 440 false, /* partial_inplace */ 441 0, /* src_mask */ 442 0xffff, /* dst_mask */ 443 false), /* pcrel_offset */ 444 445 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for 446 the symbol. */ 447 HOWTO (R_PPC64_GOT16_HA, /* type */ 448 16, /* rightshift */ 449 1, /* size (0 = byte, 1 = short, 2 = long) */ 450 16, /* bitsize */ 451 false, /* pc_relative */ 452 0, /* bitpos */ 453 complain_overflow_dont,/* complain_on_overflow */ 454 ppc64_elf_addr16_ha_reloc, /* special_function */ 455 "R_PPC64_GOT16_HA", /* name */ 456 false, /* partial_inplace */ 457 0, /* src_mask */ 458 0xffff, /* dst_mask */ 459 false), /* pcrel_offset */ 460 461 /* This is used only by the dynamic linker. The symbol should exist 462 both in the object being run and in some shared library. The 463 dynamic linker copies the data addressed by the symbol from the 464 shared library into the object, because the object being 465 run has to have the data at some particular address. */ 466 HOWTO (R_PPC64_COPY, /* type */ 467 0, /* rightshift */ 468 2, /* size (0 = byte, 1 = short, 2 = long) */ 469 32, /* bitsize */ 470 false, /* pc_relative */ 471 0, /* bitpos */ 472 complain_overflow_bitfield, /* complain_on_overflow */ 473 bfd_elf_generic_reloc, /* special_function */ 474 "R_PPC64_COPY", /* name */ 475 false, /* partial_inplace */ 476 0, /* src_mask */ 477 0, /* dst_mask */ 478 false), /* pcrel_offset */ 479 480 /* Like R_PPC64_ADDR64, but used when setting global offset table 481 entries. */ 482 HOWTO (R_PPC64_GLOB_DAT, /* type */ 483 0, /* rightshift */ 484 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 485 64, /* bitsize */ 486 false, /* pc_relative */ 487 0, /* bitpos */ 488 complain_overflow_dont, /* complain_on_overflow */ 489 bfd_elf_generic_reloc, /* special_function */ 490 "R_PPC64_GLOB_DAT", /* name */ 491 false, /* partial_inplace */ 492 0, /* src_mask */ 493 0xffffffffffffffff, /* dst_mask */ 494 false), /* pcrel_offset */ 495 496 /* Created by the link editor. Marks a procedure linkage table 497 entry for a symbol. */ 498 HOWTO (R_PPC64_JMP_SLOT, /* type */ 499 0, /* rightshift */ 500 0, /* size (0 = byte, 1 = short, 2 = long) */ 501 0, /* bitsize */ 502 false, /* pc_relative */ 503 0, /* bitpos */ 504 complain_overflow_dont, /* complain_on_overflow */ 505 bfd_elf_generic_reloc, /* special_function */ 506 "R_PPC64_JMP_SLOT", /* name */ 507 false, /* partial_inplace */ 508 0, /* src_mask */ 509 0, /* dst_mask */ 510 false), /* pcrel_offset */ 511 512 /* Used only by the dynamic linker. When the object is run, this 513 doubleword64 is set to the load address of the object, plus the 514 addend. */ 515 HOWTO (R_PPC64_RELATIVE, /* type */ 516 0, /* rightshift */ 517 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 518 64, /* bitsize */ 519 false, /* pc_relative */ 520 0, /* bitpos */ 521 complain_overflow_dont, /* complain_on_overflow */ 522 bfd_elf_generic_reloc, /* special_function */ 523 "R_PPC64_RELATIVE", /* name */ 524 false, /* partial_inplace */ 525 0, /* src_mask */ 526 0xffffffffffffffff, /* dst_mask */ 527 false), /* pcrel_offset */ 528 529 /* Like R_PPC64_ADDR32, but may be unaligned. */ 530 HOWTO (R_PPC64_UADDR32, /* type */ 531 0, /* rightshift */ 532 2, /* size (0 = byte, 1 = short, 2 = long) */ 533 32, /* bitsize */ 534 false, /* pc_relative */ 535 0, /* bitpos */ 536 complain_overflow_bitfield, /* complain_on_overflow */ 537 bfd_elf_generic_reloc, /* special_function */ 538 "R_PPC64_UADDR32", /* name */ 539 false, /* partial_inplace */ 540 0, /* src_mask */ 541 0xffffffff, /* dst_mask */ 542 false), /* pcrel_offset */ 543 544 /* Like R_PPC64_ADDR16, but may be unaligned. */ 545 HOWTO (R_PPC64_UADDR16, /* type */ 546 0, /* rightshift */ 547 1, /* size (0 = byte, 1 = short, 2 = long) */ 548 16, /* bitsize */ 549 false, /* pc_relative */ 550 0, /* bitpos */ 551 complain_overflow_bitfield, /* complain_on_overflow */ 552 bfd_elf_generic_reloc, /* special_function */ 553 "R_PPC64_UADDR16", /* name */ 554 false, /* partial_inplace */ 555 0, /* src_mask */ 556 0xffff, /* dst_mask */ 557 false), /* pcrel_offset */ 558 559 /* 32-bit PC relative. */ 560 HOWTO (R_PPC64_REL32, /* type */ 561 0, /* rightshift */ 562 2, /* size (0 = byte, 1 = short, 2 = long) */ 563 32, /* bitsize */ 564 true, /* pc_relative */ 565 0, /* bitpos */ 566 /* FIXME: Verify. Was complain_overflow_bitfield. */ 567 complain_overflow_signed, /* complain_on_overflow */ 568 bfd_elf_generic_reloc, /* special_function */ 569 "R_PPC64_REL32", /* name */ 570 false, /* partial_inplace */ 571 0, /* src_mask */ 572 0xffffffff, /* dst_mask */ 573 true), /* pcrel_offset */ 574 575 /* 32-bit relocation to the symbol's procedure linkage table. */ 576 HOWTO (R_PPC64_PLT32, /* type */ 577 0, /* rightshift */ 578 2, /* size (0 = byte, 1 = short, 2 = long) */ 579 32, /* bitsize */ 580 false, /* pc_relative */ 581 0, /* bitpos */ 582 complain_overflow_bitfield, /* complain_on_overflow */ 583 bfd_elf_generic_reloc, /* special_function */ 584 "R_PPC64_PLT32", /* name */ 585 false, /* partial_inplace */ 586 0, /* src_mask */ 587 0, /* dst_mask */ 588 false), /* pcrel_offset */ 589 590 /* 32-bit PC relative relocation to the symbol's procedure linkage table. 591 FIXME: R_PPC64_PLTREL32 not supported. */ 592 HOWTO (R_PPC64_PLTREL32, /* type */ 593 0, /* rightshift */ 594 2, /* size (0 = byte, 1 = short, 2 = long) */ 595 32, /* bitsize */ 596 true, /* pc_relative */ 597 0, /* bitpos */ 598 complain_overflow_signed, /* complain_on_overflow */ 599 bfd_elf_generic_reloc, /* special_function */ 600 "R_PPC64_PLTREL32", /* name */ 601 false, /* partial_inplace */ 602 0, /* src_mask */ 603 0, /* dst_mask */ 604 true), /* pcrel_offset */ 605 606 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for 607 the symbol. */ 608 HOWTO (R_PPC64_PLT16_LO, /* type */ 609 0, /* rightshift */ 610 1, /* size (0 = byte, 1 = short, 2 = long) */ 611 16, /* bitsize */ 612 false, /* pc_relative */ 613 0, /* bitpos */ 614 complain_overflow_dont, /* complain_on_overflow */ 615 bfd_elf_generic_reloc, /* special_function */ 616 "R_PPC64_PLT16_LO", /* name */ 617 false, /* partial_inplace */ 618 0, /* src_mask */ 619 0xffff, /* dst_mask */ 620 false), /* pcrel_offset */ 621 622 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for 623 the symbol. */ 624 HOWTO (R_PPC64_PLT16_HI, /* type */ 625 16, /* rightshift */ 626 1, /* size (0 = byte, 1 = short, 2 = long) */ 627 16, /* bitsize */ 628 false, /* pc_relative */ 629 0, /* bitpos */ 630 complain_overflow_dont, /* complain_on_overflow */ 631 bfd_elf_generic_reloc, /* special_function */ 632 "R_PPC64_PLT16_HI", /* name */ 633 false, /* partial_inplace */ 634 0, /* src_mask */ 635 0xffff, /* dst_mask */ 636 false), /* pcrel_offset */ 637 638 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for 639 the symbol. */ 640 HOWTO (R_PPC64_PLT16_HA, /* type */ 641 16, /* rightshift */ 642 1, /* size (0 = byte, 1 = short, 2 = long) */ 643 16, /* bitsize */ 644 false, /* pc_relative */ 645 0, /* bitpos */ 646 complain_overflow_dont, /* complain_on_overflow */ 647 ppc64_elf_addr16_ha_reloc, /* special_function */ 648 "R_PPC64_PLT16_HA", /* name */ 649 false, /* partial_inplace */ 650 0, /* src_mask */ 651 0xffff, /* dst_mask */ 652 false), /* pcrel_offset */ 653 654 /* 32-bit section relative relocation. */ 655 /* FIXME: Verify R_PPC64_SECTOFF. Seems strange with size=2 and 656 dst_mask=0. */ 657 HOWTO (R_PPC64_SECTOFF, /* type */ 658 0, /* rightshift */ 659 2, /* size (0 = byte, 1 = short, 2 = long) */ 660 32, /* bitsize */ 661 true, /* pc_relative */ 662 0, /* bitpos */ 663 complain_overflow_bitfield, /* complain_on_overflow */ 664 bfd_elf_generic_reloc, /* special_function */ 665 "R_PPC64_SECTOFF", /* name */ 666 false, /* partial_inplace */ 667 0, /* src_mask */ 668 0, /* dst_mask */ 669 true), /* pcrel_offset */ 670 671 /* 16-bit lower half section relative relocation. */ 672 HOWTO (R_PPC64_SECTOFF_LO, /* type */ 673 0, /* rightshift */ 674 1, /* size (0 = byte, 1 = short, 2 = long) */ 675 16, /* bitsize */ 676 false, /* pc_relative */ 677 0, /* bitpos */ 678 complain_overflow_dont, /* complain_on_overflow */ 679 bfd_elf_generic_reloc, /* special_function */ 680 "R_PPC64_SECTOFF_LO", /* name */ 681 false, /* partial_inplace */ 682 0, /* src_mask */ 683 0xffff, /* dst_mask */ 684 false), /* pcrel_offset */ 685 686 /* 16-bit upper half section relative relocation. */ 687 HOWTO (R_PPC64_SECTOFF_HI, /* type */ 688 16, /* rightshift */ 689 1, /* size (0 = byte, 1 = short, 2 = long) */ 690 16, /* bitsize */ 691 false, /* pc_relative */ 692 0, /* bitpos */ 693 complain_overflow_dont, /* complain_on_overflow */ 694 bfd_elf_generic_reloc, /* special_function */ 695 "R_PPC64_SECTOFF_HI", /* name */ 696 false, /* partial_inplace */ 697 0, /* src_mask */ 698 0xffff, /* dst_mask */ 699 false), /* pcrel_offset */ 700 701 /* 16-bit upper half adjusted section relative relocation. */ 702 HOWTO (R_PPC64_SECTOFF_HA, /* type */ 703 16, /* rightshift */ 704 1, /* size (0 = byte, 1 = short, 2 = long) */ 705 16, /* bitsize */ 706 false, /* pc_relative */ 707 0, /* bitpos */ 708 complain_overflow_dont, /* complain_on_overflow */ 709 ppc64_elf_addr16_ha_reloc, /* special_function */ 710 "R_PPC64_SECTOFF_HA", /* name */ 711 false, /* partial_inplace */ 712 0, /* src_mask */ 713 0xffff, /* dst_mask */ 714 false), /* pcrel_offset */ 715 716 /* Like R_PPC64_REL24 without touching the two least significant 717 bits. */ 718 /* FIXME: Verify R_PPC64_ADDR30. */ 719 HOWTO (R_PPC64_ADDR30, /* type */ 720 2, /* rightshift */ 721 2, /* size (0 = byte, 1 = short, 2 = long) */ 722 30, /* bitsize */ 723 true, /* pc_relative */ 724 0, /* bitpos */ 725 complain_overflow_dont, /* complain_on_overflow */ 726 bfd_elf_generic_reloc, /* special_function */ 727 "R_PPC64_ADDR30", /* name */ 728 false, /* partial_inplace */ 729 0, /* src_mask */ 730 0xfffffffc, /* dst_mask */ 731 true), /* pcrel_offset */ 732 733 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */ 734 735 /* A standard 64-bit relocation. */ 736 HOWTO (R_PPC64_ADDR64, /* type */ 737 0, /* rightshift */ 738 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 739 64, /* bitsize */ 740 false, /* pc_relative */ 741 0, /* bitpos */ 742 complain_overflow_dont, /* complain_on_overflow */ 743 bfd_elf_generic_reloc, /* special_function */ 744 "R_PPC64_ADDR64", /* name */ 745 false, /* partial_inplace */ 746 0, /* src_mask */ 747 0xffffffffffffffff, /* dst_mask */ 748 false), /* pcrel_offset */ 749 750 /* The bits 32-47 of an address. */ 751 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */ 752 32, /* rightshift */ 753 1, /* size (0 = byte, 1 = short, 2 = long) */ 754 16, /* bitsize */ 755 false, /* pc_relative */ 756 0, /* bitpos */ 757 complain_overflow_dont, /* complain_on_overflow */ 758 bfd_elf_generic_reloc, /* special_function */ 759 "R_PPC64_ADDR16_HIGHER", /* name */ 760 false, /* partial_inplace */ 761 0, /* src_mask */ 762 0xffff, /* dst_mask */ 763 false), /* pcrel_offset */ 764 765 /* The bits 32-47 of an address, plus 1 if the contents of the low 766 16 bits, treated as a signed number, is negative. */ 767 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */ 768 32, /* rightshift */ 769 1, /* size (0 = byte, 1 = short, 2 = long) */ 770 16, /* bitsize */ 771 false, /* pc_relative */ 772 0, /* bitpos */ 773 complain_overflow_dont, /* complain_on_overflow */ 774 ppc64_elf_addr16_ha_reloc, /* special_function */ 775 "R_PPC64_ADDR16_HIGHERA", /* name */ 776 false, /* partial_inplace */ 777 0, /* src_mask */ 778 0xffff, /* dst_mask */ 779 false), /* pcrel_offset */ 780 781 /* The bits 48-63 of an address. */ 782 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */ 783 48, /* rightshift */ 784 1, /* size (0 = byte, 1 = short, 2 = long) */ 785 16, /* bitsize */ 786 false, /* pc_relative */ 787 0, /* bitpos */ 788 complain_overflow_dont, /* complain_on_overflow */ 789 bfd_elf_generic_reloc, /* special_function */ 790 "R_PPC64_ADDR16_HIGHEST", /* name */ 791 false, /* partial_inplace */ 792 0, /* src_mask */ 793 0xffff, /* dst_mask */ 794 false), /* pcrel_offset */ 795 796 /* The bits 48-63 of an address, plus 1 if the contents of the low 797 16 bits, treated as a signed number, is negative. */ 798 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */ 799 48, /* rightshift */ 800 1, /* size (0 = byte, 1 = short, 2 = long) */ 801 16, /* bitsize */ 802 false, /* pc_relative */ 803 0, /* bitpos */ 804 complain_overflow_dont, /* complain_on_overflow */ 805 ppc64_elf_addr16_ha_reloc, /* special_function */ 806 "R_PPC64_ADDR16_HIGHESTA", /* name */ 807 false, /* partial_inplace */ 808 0, /* src_mask */ 809 0xffff, /* dst_mask */ 810 false), /* pcrel_offset */ 811 812 /* Like ADDR64, but may be unaligned. */ 813 HOWTO (R_PPC64_UADDR64, /* type */ 814 0, /* rightshift */ 815 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 816 64, /* bitsize */ 817 false, /* pc_relative */ 818 0, /* bitpos */ 819 complain_overflow_dont, /* complain_on_overflow */ 820 bfd_elf_generic_reloc, /* special_function */ 821 "R_PPC64_UADDR64", /* name */ 822 false, /* partial_inplace */ 823 0, /* src_mask */ 824 0xffffffffffffffff, /* dst_mask */ 825 false), /* pcrel_offset */ 826 827 /* 64-bit relative relocation. */ 828 HOWTO (R_PPC64_REL64, /* type */ 829 0, /* rightshift */ 830 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 831 64, /* bitsize */ 832 true, /* pc_relative */ 833 0, /* bitpos */ 834 complain_overflow_dont, /* complain_on_overflow */ 835 bfd_elf_generic_reloc, /* special_function */ 836 "R_PPC64_REL64", /* name */ 837 false, /* partial_inplace */ 838 0, /* src_mask */ 839 0xffffffffffffffff, /* dst_mask */ 840 true), /* pcrel_offset */ 841 842 /* 64-bit relocation to the symbol's procedure linkage table. */ 843 HOWTO (R_PPC64_PLT64, /* type */ 844 0, /* rightshift */ 845 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 846 64, /* bitsize */ 847 false, /* pc_relative */ 848 0, /* bitpos */ 849 complain_overflow_dont, /* complain_on_overflow */ 850 bfd_elf_generic_reloc, /* special_function */ 851 "R_PPC64_PLT64", /* name */ 852 false, /* partial_inplace */ 853 0, /* src_mask */ 854 0, /* dst_mask */ 855 false), /* pcrel_offset */ 856 857 /* 64-bit PC relative relocation to the symbol's procedure linkage 858 table. */ 859 /* FIXME: R_PPC64_PLTREL64 not supported. */ 860 HOWTO (R_PPC64_PLTREL64, /* type */ 861 0, /* rightshift */ 862 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 863 64, /* bitsize */ 864 true, /* pc_relative */ 865 0, /* bitpos */ 866 complain_overflow_dont, /* complain_on_overflow */ 867 bfd_elf_generic_reloc, /* special_function */ 868 "R_PPC64_PLTREL64", /* name */ 869 false, /* partial_inplace */ 870 0, /* src_mask */ 871 0, /* dst_mask */ 872 true), /* pcrel_offset */ 873 874 /* 16 bit TOC-relative relocation. */ 875 876 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */ 877 HOWTO (R_PPC64_TOC16, /* type */ 878 0, /* rightshift */ 879 1, /* size (0 = byte, 1 = short, 2 = long) */ 880 16, /* bitsize */ 881 false, /* pc_relative */ 882 0, /* bitpos */ 883 complain_overflow_signed, /* complain_on_overflow */ 884 bfd_elf_generic_reloc, /* special_function */ 885 "R_PPC64_TOC16", /* name */ 886 false, /* partial_inplace */ 887 0, /* src_mask */ 888 0xffff, /* dst_mask */ 889 false), /* pcrel_offset */ 890 891 /* 16 bit TOC-relative relocation without overflow. */ 892 893 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */ 894 HOWTO (R_PPC64_TOC16_LO, /* type */ 895 0, /* rightshift */ 896 1, /* size (0 = byte, 1 = short, 2 = long) */ 897 16, /* bitsize */ 898 false, /* pc_relative */ 899 0, /* bitpos */ 900 complain_overflow_dont, /* complain_on_overflow */ 901 bfd_elf_generic_reloc, /* special_function */ 902 "R_PPC64_TOC16_LO", /* name */ 903 false, /* partial_inplace */ 904 0, /* src_mask */ 905 0xffff, /* dst_mask */ 906 false), /* pcrel_offset */ 907 908 /* 16 bit TOC-relative relocation, high 16 bits. */ 909 910 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */ 911 HOWTO (R_PPC64_TOC16_HI, /* type */ 912 16, /* rightshift */ 913 1, /* size (0 = byte, 1 = short, 2 = long) */ 914 16, /* bitsize */ 915 false, /* pc_relative */ 916 0, /* bitpos */ 917 complain_overflow_dont, /* complain_on_overflow */ 918 bfd_elf_generic_reloc, /* special_function */ 919 "R_PPC64_TOC16_HI", /* name */ 920 false, /* partial_inplace */ 921 0, /* src_mask */ 922 0xffff, /* dst_mask */ 923 false), /* pcrel_offset */ 924 925 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the 926 contents of the low 16 bits, treated as a signed number, is 927 negative. */ 928 929 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */ 930 HOWTO (R_PPC64_TOC16_HA, /* type */ 931 16, /* rightshift */ 932 1, /* size (0 = byte, 1 = short, 2 = long) */ 933 16, /* bitsize */ 934 false, /* pc_relative */ 935 0, /* bitpos */ 936 complain_overflow_dont, /* complain_on_overflow */ 937 ppc64_elf_addr16_ha_reloc, /* special_function */ 938 "R_PPC64_TOC16_HA", /* name */ 939 false, /* partial_inplace */ 940 0, /* src_mask */ 941 0xffff, /* dst_mask */ 942 false), /* pcrel_offset */ 943 944 /* 64-bit relocation; insert value of TOC base (.TOC.). */ 945 946 /* R_PPC64_TOC 51 doubleword64 .TOC. */ 947 HOWTO (R_PPC64_TOC, /* type */ 948 0, /* rightshift */ 949 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */ 950 64, /* bitsize */ 951 false, /* pc_relative */ 952 0, /* bitpos */ 953 complain_overflow_bitfield, /* complain_on_overflow */ 954 bfd_elf_generic_reloc, /* special_function */ 955 "R_PPC64_TOC", /* name */ 956 false, /* partial_inplace */ 957 0, /* src_mask */ 958 0xffffffffffffffff, /* dst_mask */ 959 false), /* pcrel_offset */ 960 961 /* Like R_PPC64_GOT16, but also informs the link editor that the 962 value to relocate may (!) refer to a PLT entry which the link 963 editor (a) may replace with the symbol value. If the link editor 964 is unable to fully resolve the symbol, it may (b) create a PLT 965 entry and store the address to the new PLT entry in the GOT. 966 This permits lazy resolution of function symbols at run time. 967 The link editor may also skip all of this and just (c) emit a 968 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */ 969 /* FIXME: R_PPC64_PLTGOT16 not implemented. */ 970 HOWTO (R_PPC64_PLTGOT16, /* type */ 971 0, /* rightshift */ 972 1, /* size (0 = byte, 1 = short, 2 = long) */ 973 16, /* bitsize */ 974 false, /* pc_relative */ 975 0, /* bitpos */ 976 complain_overflow_signed, /* complain_on_overflow */ 977 bfd_elf_generic_reloc, /* special_function */ 978 "R_PPC64_PLTGOT16", /* name */ 979 false, /* partial_inplace */ 980 0, /* src_mask */ 981 0xffff, /* dst_mask */ 982 false), /* pcrel_offset */ 983 984 /* Like R_PPC64_PLTGOT16, but without overflow. */ 985 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */ 986 HOWTO (R_PPC64_PLTGOT16_LO, /* type */ 987 0, /* rightshift */ 988 1, /* size (0 = byte, 1 = short, 2 = long) */ 989 16, /* bitsize */ 990 false, /* pc_relative */ 991 0, /* bitpos */ 992 complain_overflow_dont, /* complain_on_overflow */ 993 bfd_elf_generic_reloc, /* special_function */ 994 "R_PPC64_PLTGOT16_LO", /* name */ 995 false, /* partial_inplace */ 996 0, /* src_mask */ 997 0xffff, /* dst_mask */ 998 false), /* pcrel_offset */ 999 1000 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */ 1001 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */ 1002 HOWTO (R_PPC64_PLTGOT16_HI, /* type */ 1003 16, /* rightshift */ 1004 1, /* size (0 = byte, 1 = short, 2 = long) */ 1005 16, /* bitsize */ 1006 false, /* pc_relative */ 1007 0, /* bitpos */ 1008 complain_overflow_dont, /* complain_on_overflow */ 1009 bfd_elf_generic_reloc, /* special_function */ 1010 "R_PPC64_PLTGOT16_HI", /* name */ 1011 false, /* partial_inplace */ 1012 0, /* src_mask */ 1013 0xffff, /* dst_mask */ 1014 false), /* pcrel_offset */ 1015 1016 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus 1017 1 if the contents of the low 16 bits, treated as a signed number, 1018 is negative. */ 1019 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */ 1020 HOWTO (R_PPC64_PLTGOT16_HA, /* type */ 1021 16, /* rightshift */ 1022 1, /* size (0 = byte, 1 = short, 2 = long) */ 1023 16, /* bitsize */ 1024 false, /* pc_relative */ 1025 0, /* bitpos */ 1026 complain_overflow_dont,/* complain_on_overflow */ 1027 ppc64_elf_addr16_ha_reloc, /* special_function */ 1028 "R_PPC64_PLTGOT16_HA", /* name */ 1029 false, /* partial_inplace */ 1030 0, /* src_mask */ 1031 0xffff, /* dst_mask */ 1032 false), /* pcrel_offset */ 1033 1034 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */ 1035 HOWTO (R_PPC64_ADDR16_DS, /* type */ 1036 0, /* rightshift */ 1037 1, /* size (0 = byte, 1 = short, 2 = long) */ 1038 16, /* bitsize */ 1039 false, /* pc_relative */ 1040 0, /* bitpos */ 1041 complain_overflow_bitfield, /* complain_on_overflow */ 1042 bfd_elf_generic_reloc, /* special_function */ 1043 "R_PPC64_ADDR16_DS", /* name */ 1044 false, /* partial_inplace */ 1045 0, /* src_mask */ 1046 0xfffc, /* dst_mask */ 1047 false), /* pcrel_offset */ 1048 1049 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */ 1050 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */ 1051 0, /* rightshift */ 1052 1, /* size (0 = byte, 1 = short, 2 = long) */ 1053 16, /* bitsize */ 1054 false, /* pc_relative */ 1055 0, /* bitpos */ 1056 complain_overflow_dont,/* complain_on_overflow */ 1057 bfd_elf_generic_reloc, /* special_function */ 1058 "R_PPC64_ADDR16_LO_DS",/* name */ 1059 false, /* partial_inplace */ 1060 0, /* src_mask */ 1061 0xfffc, /* dst_mask */ 1062 false), /* pcrel_offset */ 1063 1064 /* Like R_PPC64_GOT16, but for instructions with a DS field. */ 1065 HOWTO (R_PPC64_GOT16_DS, /* type */ 1066 0, /* rightshift */ 1067 1, /* size (0 = byte, 1 = short, 2 = long) */ 1068 16, /* bitsize */ 1069 false, /* pc_relative */ 1070 0, /* bitpos */ 1071 complain_overflow_signed, /* complain_on_overflow */ 1072 bfd_elf_generic_reloc, /* special_function */ 1073 "R_PPC64_GOT16_DS", /* name */ 1074 false, /* partial_inplace */ 1075 0, /* src_mask */ 1076 0xfffc, /* dst_mask */ 1077 false), /* pcrel_offset */ 1078 1079 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */ 1080 HOWTO (R_PPC64_GOT16_LO_DS, /* type */ 1081 0, /* rightshift */ 1082 1, /* size (0 = byte, 1 = short, 2 = long) */ 1083 16, /* bitsize */ 1084 false, /* pc_relative */ 1085 0, /* bitpos */ 1086 complain_overflow_dont, /* complain_on_overflow */ 1087 bfd_elf_generic_reloc, /* special_function */ 1088 "R_PPC64_GOT16_LO_DS", /* name */ 1089 false, /* partial_inplace */ 1090 0, /* src_mask */ 1091 0xfffc, /* dst_mask */ 1092 false), /* pcrel_offset */ 1093 1094 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */ 1095 HOWTO (R_PPC64_PLT16_LO_DS, /* type */ 1096 0, /* rightshift */ 1097 1, /* size (0 = byte, 1 = short, 2 = long) */ 1098 16, /* bitsize */ 1099 false, /* pc_relative */ 1100 0, /* bitpos */ 1101 complain_overflow_dont, /* complain_on_overflow */ 1102 bfd_elf_generic_reloc, /* special_function */ 1103 "R_PPC64_PLT16_LO_DS", /* name */ 1104 false, /* partial_inplace */ 1105 0, /* src_mask */ 1106 0xfffc, /* dst_mask */ 1107 false), /* pcrel_offset */ 1108 1109 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */ 1110 /* FIXME: Verify R_PPC64_SECTOFF. Seems strange with size=2 and 1111 dst_mask=0. */ 1112 HOWTO (R_PPC64_SECTOFF_DS, /* type */ 1113 0, /* rightshift */ 1114 2, /* size (0 = byte, 1 = short, 2 = long) */ 1115 32, /* bitsize */ 1116 true, /* pc_relative */ 1117 0, /* bitpos */ 1118 complain_overflow_bitfield, /* complain_on_overflow */ 1119 bfd_elf_generic_reloc, /* special_function */ 1120 "R_PPC64_SECTOFF_DS", /* name */ 1121 false, /* partial_inplace */ 1122 0, /* src_mask */ 1123 0, /* dst_mask */ 1124 true), /* pcrel_offset */ 1125 1126 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */ 1127 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */ 1128 0, /* rightshift */ 1129 1, /* size (0 = byte, 1 = short, 2 = long) */ 1130 16, /* bitsize */ 1131 false, /* pc_relative */ 1132 0, /* bitpos */ 1133 complain_overflow_dont, /* complain_on_overflow */ 1134 bfd_elf_generic_reloc, /* special_function */ 1135 "R_PPC64_SECTOFF_LO_DS",/* name */ 1136 false, /* partial_inplace */ 1137 0, /* src_mask */ 1138 0xfffc, /* dst_mask */ 1139 false), /* pcrel_offset */ 1140 1141 /* Like R_PPC64_TOC16, but for instructions with a DS field. */ 1142 HOWTO (R_PPC64_TOC16_DS, /* type */ 1143 0, /* rightshift */ 1144 1, /* size (0 = byte, 1 = short, 2 = long) */ 1145 16, /* bitsize */ 1146 false, /* pc_relative */ 1147 0, /* bitpos */ 1148 complain_overflow_signed, /* complain_on_overflow */ 1149 bfd_elf_generic_reloc, /* special_function */ 1150 "R_PPC64_TOC16_DS", /* name */ 1151 false, /* partial_inplace */ 1152 0, /* src_mask */ 1153 0xfffc, /* dst_mask */ 1154 false), /* pcrel_offset */ 1155 1156 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */ 1157 HOWTO (R_PPC64_TOC16_LO_DS, /* type */ 1158 0, /* rightshift */ 1159 1, /* size (0 = byte, 1 = short, 2 = long) */ 1160 16, /* bitsize */ 1161 false, /* pc_relative */ 1162 0, /* bitpos */ 1163 complain_overflow_dont, /* complain_on_overflow */ 1164 bfd_elf_generic_reloc, /* special_function */ 1165 "R_PPC64_TOC16_LO_DS", /* name */ 1166 false, /* partial_inplace */ 1167 0, /* src_mask */ 1168 0xfffc, /* dst_mask */ 1169 false), /* pcrel_offset */ 1170 1171 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */ 1172 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */ 1173 HOWTO (R_PPC64_PLTGOT16_DS, /* type */ 1174 0, /* rightshift */ 1175 1, /* size (0 = byte, 1 = short, 2 = long) */ 1176 16, /* bitsize */ 1177 false, /* pc_relative */ 1178 0, /* bitpos */ 1179 complain_overflow_signed, /* complain_on_overflow */ 1180 bfd_elf_generic_reloc, /* special_function */ 1181 "R_PPC64_PLTGOT16_DS", /* name */ 1182 false, /* partial_inplace */ 1183 0, /* src_mask */ 1184 0xfffc, /* dst_mask */ 1185 false), /* pcrel_offset */ 1186 1187 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */ 1188 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */ 1189 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */ 1190 0, /* rightshift */ 1191 1, /* size (0 = byte, 1 = short, 2 = long) */ 1192 16, /* bitsize */ 1193 false, /* pc_relative */ 1194 0, /* bitpos */ 1195 complain_overflow_dont, /* complain_on_overflow */ 1196 bfd_elf_generic_reloc, /* special_function */ 1197 "R_PPC64_PLTGOT16_LO_DS",/* name */ 1198 false, /* partial_inplace */ 1199 0, /* src_mask */ 1200 0xfffc, /* dst_mask */ 1201 false), /* pcrel_offset */ 1202 1203 /* GNU extension to record C++ vtable hierarchy. */ 1204 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */ 1205 0, /* rightshift */ 1206 0, /* size (0 = byte, 1 = short, 2 = long) */ 1207 0, /* bitsize */ 1208 false, /* pc_relative */ 1209 0, /* bitpos */ 1210 complain_overflow_dont, /* complain_on_overflow */ 1211 NULL, /* special_function */ 1212 "R_PPC64_GNU_VTINHERIT", /* name */ 1213 false, /* partial_inplace */ 1214 0, /* src_mask */ 1215 0, /* dst_mask */ 1216 false), /* pcrel_offset */ 1217 1218 /* GNU extension to record C++ vtable member usage. */ 1219 HOWTO (R_PPC64_GNU_VTENTRY, /* type */ 1220 0, /* rightshift */ 1221 0, /* size (0 = byte, 1 = short, 2 = long) */ 1222 0, /* bitsize */ 1223 false, /* pc_relative */ 1224 0, /* bitpos */ 1225 complain_overflow_dont, /* complain_on_overflow */ 1226 NULL, /* special_function */ 1227 "R_PPC64_GNU_VTENTRY", /* name */ 1228 false, /* partial_inplace */ 1229 0, /* src_mask */ 1230 0, /* dst_mask */ 1231 false), /* pcrel_offset */ 1232}; 1233 1234 1235/* Initialize the ppc64_elf_howto_table, so that linear accesses can 1236 be done. */ 1237 1238static void 1239ppc_howto_init () 1240{ 1241 unsigned int i, type; 1242 1243 for (i = 0; 1244 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]); 1245 i++) 1246 { 1247 type = ppc64_elf_howto_raw[i].type; 1248 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table) 1249 / sizeof (ppc64_elf_howto_table[0]))); 1250 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i]; 1251 } 1252} 1253 1254static reloc_howto_type * 1255ppc64_elf_reloc_type_lookup (abfd, code) 1256 bfd *abfd ATTRIBUTE_UNUSED; 1257 bfd_reloc_code_real_type code; 1258{ 1259 enum elf_ppc_reloc_type ppc_reloc = R_PPC_NONE; 1260 1261 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 1262 /* Initialize howto table if needed. */ 1263 ppc_howto_init (); 1264 1265 switch ((int) code) 1266 { 1267 default: 1268 return (reloc_howto_type *) NULL; 1269 1270 case BFD_RELOC_NONE: ppc_reloc = R_PPC64_NONE; 1271 break; 1272 case BFD_RELOC_32: ppc_reloc = R_PPC64_ADDR32; 1273 break; 1274 case BFD_RELOC_PPC_BA26: ppc_reloc = R_PPC64_ADDR24; 1275 break; 1276 case BFD_RELOC_16: ppc_reloc = R_PPC64_ADDR16; 1277 break; 1278 case BFD_RELOC_LO16: ppc_reloc = R_PPC64_ADDR16_LO; 1279 break; 1280 case BFD_RELOC_HI16: ppc_reloc = R_PPC64_ADDR16_HI; 1281 break; 1282 case BFD_RELOC_HI16_S: ppc_reloc = R_PPC64_ADDR16_HA; 1283 break; 1284 case BFD_RELOC_PPC_BA16: ppc_reloc = R_PPC64_ADDR14; 1285 break; 1286 case BFD_RELOC_PPC_BA16_BRTAKEN: ppc_reloc = R_PPC64_ADDR14_BRTAKEN; 1287 break; 1288 case BFD_RELOC_PPC_BA16_BRNTAKEN: ppc_reloc = R_PPC64_ADDR14_BRNTAKEN; 1289 break; 1290 case BFD_RELOC_PPC_B26: ppc_reloc = R_PPC64_REL24; 1291 break; 1292 case BFD_RELOC_PPC_B16: ppc_reloc = R_PPC64_REL14; 1293 break; 1294 case BFD_RELOC_PPC_B16_BRTAKEN: ppc_reloc = R_PPC64_REL14_BRTAKEN; 1295 break; 1296 case BFD_RELOC_PPC_B16_BRNTAKEN: ppc_reloc = R_PPC64_REL14_BRNTAKEN; 1297 break; 1298 case BFD_RELOC_16_GOTOFF: ppc_reloc = R_PPC64_GOT16; 1299 break; 1300 case BFD_RELOC_LO16_GOTOFF: ppc_reloc = R_PPC64_GOT16_LO; 1301 break; 1302 case BFD_RELOC_HI16_GOTOFF: ppc_reloc = R_PPC64_GOT16_HI; 1303 break; 1304 case BFD_RELOC_HI16_S_GOTOFF: ppc_reloc = R_PPC64_GOT16_HA; 1305 break; 1306 case BFD_RELOC_PPC_COPY: ppc_reloc = R_PPC64_COPY; 1307 break; 1308 case BFD_RELOC_PPC_GLOB_DAT: ppc_reloc = R_PPC64_GLOB_DAT; 1309 break; 1310 case BFD_RELOC_32_PCREL: ppc_reloc = R_PPC64_REL32; 1311 break; 1312 case BFD_RELOC_32_PLTOFF: ppc_reloc = R_PPC64_PLT32; 1313 break; 1314 case BFD_RELOC_32_PLT_PCREL: ppc_reloc = R_PPC64_PLTREL32; 1315 break; 1316 case BFD_RELOC_LO16_PLTOFF: ppc_reloc = R_PPC64_PLT16_LO; 1317 break; 1318 case BFD_RELOC_HI16_PLTOFF: ppc_reloc = R_PPC64_PLT16_HI; 1319 break; 1320 case BFD_RELOC_HI16_S_PLTOFF: ppc_reloc = R_PPC64_PLT16_HA; 1321 break; 1322 case BFD_RELOC_32_BASEREL: ppc_reloc = R_PPC64_SECTOFF; 1323 break; 1324 case BFD_RELOC_LO16_BASEREL: ppc_reloc = R_PPC64_SECTOFF_LO; 1325 break; 1326 case BFD_RELOC_HI16_BASEREL: ppc_reloc = R_PPC64_SECTOFF_HI; 1327 break; 1328 case BFD_RELOC_HI16_S_BASEREL: ppc_reloc = R_PPC64_SECTOFF_HA; 1329 break; 1330 case BFD_RELOC_CTOR: ppc_reloc = R_PPC64_ADDR64; 1331 break; 1332 case BFD_RELOC_64: ppc_reloc = R_PPC64_ADDR64; 1333 break; 1334 case BFD_RELOC_PPC64_HIGHER: ppc_reloc = R_PPC64_ADDR16_HIGHER; 1335 break; 1336 case BFD_RELOC_PPC64_HIGHER_S: ppc_reloc = R_PPC64_ADDR16_HIGHERA; 1337 break; 1338 case BFD_RELOC_PPC64_HIGHEST: ppc_reloc = R_PPC64_ADDR16_HIGHEST; 1339 break; 1340 case BFD_RELOC_PPC64_HIGHEST_S: ppc_reloc = R_PPC64_ADDR16_HIGHESTA; 1341 break; 1342 case BFD_RELOC_64_PCREL: ppc_reloc = R_PPC64_REL64; 1343 break; 1344 case BFD_RELOC_64_PLTOFF: ppc_reloc = R_PPC64_PLT64; 1345 break; 1346 case BFD_RELOC_64_PLT_PCREL: ppc_reloc = R_PPC64_PLTREL64; 1347 break; 1348 case BFD_RELOC_PPC_TOC16: ppc_reloc = R_PPC64_TOC16; 1349 break; 1350 case BFD_RELOC_PPC64_TOC16_LO: ppc_reloc = R_PPC64_TOC16_LO; 1351 break; 1352 case BFD_RELOC_PPC64_TOC16_HI: ppc_reloc = R_PPC64_TOC16_HI; 1353 break; 1354 case BFD_RELOC_PPC64_TOC16_HA: ppc_reloc = R_PPC64_TOC16_HA; 1355 break; 1356 case BFD_RELOC_PPC64_TOC: ppc_reloc = R_PPC64_TOC; 1357 break; 1358 case BFD_RELOC_PPC64_PLTGOT16: ppc_reloc = R_PPC64_PLTGOT16; 1359 break; 1360 case BFD_RELOC_PPC64_PLTGOT16_LO: ppc_reloc = R_PPC64_PLTGOT16_LO; 1361 break; 1362 case BFD_RELOC_PPC64_PLTGOT16_HI: ppc_reloc = R_PPC64_PLTGOT16_HI; 1363 break; 1364 case BFD_RELOC_PPC64_PLTGOT16_HA: ppc_reloc = R_PPC64_PLTGOT16_HA; 1365 break; 1366 case BFD_RELOC_PPC64_ADDR16_DS: ppc_reloc = R_PPC64_ADDR16_DS; 1367 break; 1368 case BFD_RELOC_PPC64_ADDR16_LO_DS: ppc_reloc = R_PPC64_ADDR16_LO_DS; 1369 break; 1370 case BFD_RELOC_PPC64_GOT16_DS: ppc_reloc = R_PPC64_GOT16_DS; 1371 break; 1372 case BFD_RELOC_PPC64_GOT16_LO_DS: ppc_reloc = R_PPC64_GOT16_LO_DS; 1373 break; 1374 case BFD_RELOC_PPC64_PLT16_LO_DS: ppc_reloc = R_PPC64_PLT16_LO_DS; 1375 break; 1376 case BFD_RELOC_PPC64_SECTOFF_DS: ppc_reloc = R_PPC64_SECTOFF_DS; 1377 break; 1378 case BFD_RELOC_PPC64_SECTOFF_LO_DS: ppc_reloc = R_PPC64_SECTOFF_LO_DS; 1379 break; 1380 case BFD_RELOC_PPC64_TOC16_DS: ppc_reloc = R_PPC64_TOC16_DS; 1381 break; 1382 case BFD_RELOC_PPC64_TOC16_LO_DS: ppc_reloc = R_PPC64_TOC16_LO_DS; 1383 break; 1384 case BFD_RELOC_PPC64_PLTGOT16_DS: ppc_reloc = R_PPC64_PLTGOT16_DS; 1385 break; 1386 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: ppc_reloc = R_PPC64_PLTGOT16_LO_DS; 1387 break; 1388 case BFD_RELOC_VTABLE_INHERIT: ppc_reloc = R_PPC64_GNU_VTINHERIT; 1389 break; 1390 case BFD_RELOC_VTABLE_ENTRY: ppc_reloc = R_PPC64_GNU_VTENTRY; 1391 break; 1392 } 1393 1394 return ppc64_elf_howto_table[(int) ppc_reloc]; 1395}; 1396 1397/* Set the howto pointer for a PowerPC ELF reloc. */ 1398 1399static void 1400ppc64_elf_info_to_howto (abfd, cache_ptr, dst) 1401 bfd *abfd ATTRIBUTE_UNUSED; 1402 arelent *cache_ptr; 1403 Elf64_Internal_Rela *dst; 1404{ 1405 unsigned int type; 1406 1407 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 1408 /* Initialize howto table if needed. */ 1409 ppc_howto_init (); 1410 1411 type = ELF64_R_TYPE (dst->r_info); 1412 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table) 1413 / sizeof (ppc64_elf_howto_table[0]))); 1414 cache_ptr->howto = ppc64_elf_howto_table[type]; 1415} 1416 1417/* Handle the R_PPC_ADDR16_HA and similar relocs. */ 1418 1419static bfd_reloc_status_type 1420ppc64_elf_addr16_ha_reloc (abfd, reloc_entry, symbol, data, input_section, 1421 output_bfd, error_message) 1422 bfd *abfd ATTRIBUTE_UNUSED; 1423 arelent *reloc_entry; 1424 asymbol *symbol; 1425 PTR data ATTRIBUTE_UNUSED; 1426 asection *input_section; 1427 bfd *output_bfd; 1428 char **error_message ATTRIBUTE_UNUSED; 1429{ 1430 bfd_vma relocation; 1431 1432 if (output_bfd != NULL) 1433 { 1434 reloc_entry->address += input_section->output_offset; 1435 return bfd_reloc_ok; 1436 } 1437 1438 if (reloc_entry->address > input_section->_cooked_size) 1439 return bfd_reloc_outofrange; 1440 1441 if (bfd_is_com_section (symbol->section)) 1442 relocation = 0; 1443 else 1444 relocation = symbol->value; 1445 1446 relocation += symbol->section->output_section->vma; 1447 relocation += symbol->section->output_offset; 1448 relocation += reloc_entry->addend; 1449 1450 reloc_entry->addend += (relocation & 0x8000) << 1; 1451 1452 return bfd_reloc_continue; 1453} 1454 1455/* Function to set whether a module needs the -mrelocatable bit set. */ 1456 1457static boolean 1458ppc64_elf_set_private_flags (abfd, flags) 1459 bfd *abfd; 1460 flagword flags; 1461{ 1462 BFD_ASSERT (!elf_flags_init (abfd) 1463 || elf_elfheader (abfd)->e_flags == flags); 1464 1465 elf_elfheader (abfd)->e_flags = flags; 1466 elf_flags_init (abfd) = true; 1467 return true; 1468} 1469 1470/* Merge backend specific data from an object file to the output 1471 object file when linking. */ 1472static boolean 1473ppc64_elf_merge_private_bfd_data (ibfd, obfd) 1474 bfd *ibfd; 1475 bfd *obfd; 1476{ 1477 flagword old_flags; 1478 flagword new_flags; 1479 boolean error; 1480 1481 /* Check if we have the same endianess. */ 1482 if (ibfd->xvec->byteorder != obfd->xvec->byteorder 1483 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN) 1484 { 1485 const char *msg; 1486 1487 if (bfd_big_endian (ibfd)) 1488 msg = _("%s: compiled for a big endian system and target is little endian"); 1489 else 1490 msg = _("%s: compiled for a little endian system and target is big endian"); 1491 1492 (*_bfd_error_handler) (msg, bfd_archive_filename (ibfd)); 1493 1494 bfd_set_error (bfd_error_wrong_format); 1495 return false; 1496 } 1497 1498 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour 1499 || bfd_get_flavour (obfd) != bfd_target_elf_flavour) 1500 return true; 1501 1502 new_flags = elf_elfheader (ibfd)->e_flags; 1503 old_flags = elf_elfheader (obfd)->e_flags; 1504 if (!elf_flags_init (obfd)) 1505 { 1506 /* First call, no flags set. */ 1507 elf_flags_init (obfd) = true; 1508 elf_elfheader (obfd)->e_flags = new_flags; 1509 } 1510 1511 else if (new_flags == old_flags) 1512 /* Compatible flags are ok. */ 1513 ; 1514 1515 else 1516 { 1517 /* Incompatible flags. Warn about -mrelocatable mismatch. 1518 Allow -mrelocatable-lib to be linked with either. */ 1519 error = false; 1520 if ((new_flags & EF_PPC_RELOCATABLE) != 0 1521 && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0) 1522 { 1523 error = true; 1524 (*_bfd_error_handler) 1525 (_("%s: compiled with -mrelocatable and linked with modules compiled normally"), 1526 bfd_archive_filename (ibfd)); 1527 } 1528 else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0 1529 && (old_flags & EF_PPC_RELOCATABLE) != 0) 1530 { 1531 error = true; 1532 (*_bfd_error_handler) 1533 (_("%s: compiled normally and linked with modules compiled with -mrelocatable"), 1534 bfd_archive_filename (ibfd)); 1535 } 1536 1537 /* The output is -mrelocatable-lib iff both the input files are. */ 1538 if (! (new_flags & EF_PPC_RELOCATABLE_LIB)) 1539 elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB; 1540 1541 /* The output is -mrelocatable iff it can't be -mrelocatable-lib, 1542 but each input file is either -mrelocatable or -mrelocatable-lib. */ 1543 if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB) 1544 && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)) 1545 && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))) 1546 elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE; 1547 1548 /* Do not warn about eabi vs. V.4 mismatch, just or in the bit 1549 if any module uses it. */ 1550 elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB); 1551 1552 new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); 1553 old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); 1554 1555 /* Warn about any other mismatches. */ 1556 if (new_flags != old_flags) 1557 { 1558 error = true; 1559 (*_bfd_error_handler) 1560 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"), 1561 bfd_archive_filename (ibfd), (long) new_flags, (long) old_flags); 1562 } 1563 1564 if (error) 1565 { 1566 bfd_set_error (bfd_error_bad_value); 1567 return false; 1568 } 1569 } 1570 1571 return true; 1572} 1573 1574/* Handle a PowerPC specific section when reading an object file. This 1575 is called when elfcode.h finds a section with an unknown type. */ 1576 1577static boolean 1578ppc64_elf_section_from_shdr (abfd, hdr, name) 1579 bfd *abfd; 1580 Elf64_Internal_Shdr *hdr; 1581 char *name; 1582{ 1583 asection *newsect; 1584 flagword flags; 1585 1586 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name)) 1587 return false; 1588 1589 newsect = hdr->bfd_section; 1590 flags = bfd_get_section_flags (abfd, newsect); 1591 if (hdr->sh_flags & SHF_EXCLUDE) 1592 flags |= SEC_EXCLUDE; 1593 1594 if (hdr->sh_type == SHT_ORDERED) 1595 flags |= SEC_SORT_ENTRIES; 1596 1597 bfd_set_section_flags (abfd, newsect, flags); 1598 return true; 1599} 1600 1601/* The following functions are specific to the ELF linker, while 1602 functions above are used generally. Those named ppc64_elf_* are 1603 called by the main ELF linker code. They appear in this file more 1604 or less in the order in which they are called. eg. 1605 ppc64_elf_check_relocs is called early in the link process, 1606 ppc64_elf_finish_dynamic_sections is one of the last functions 1607 called. 1608 1609 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that 1610 functions have both a function code symbol and a function descriptor 1611 symbol. A call to foo in a relocatable object file looks like: 1612 1613 . .text 1614 . x: 1615 . bl .foo 1616 . nop 1617 1618 The function definition in another object file might be: 1619 1620 . .section .opd 1621 . foo: .quad .foo 1622 . .quad .TOC.@tocbase 1623 . .quad 0 1624 . 1625 . .text 1626 . .foo: blr 1627 1628 When the linker resolves the call during a static link, the branch 1629 unsurprisingly just goes to .foo and the .opd information is unused. 1630 If the function definition is in a shared library, things are a little 1631 different: The call goes via a plt call stub, the opd information gets 1632 copied to the plt, and the linker patches the nop. 1633 1634 . x: 1635 . bl .foo_stub 1636 . ld 2,40(1) 1637 . 1638 . 1639 . .foo_stub: 1640 . addis 12,2,Lfoo@toc@ha # in practice, the call stub 1641 . addi 12,12,Lfoo@toc@l # is slightly optimised, but 1642 . std 2,40(1) # this is the general idea 1643 . ld 11,0(12) 1644 . ld 2,8(12) 1645 . mtctr 11 1646 . ld 11,16(12) 1647 . bctr 1648 . 1649 . .section .plt 1650 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo) 1651 1652 The "reloc ()" notation is supposed to indicate that the linker emits 1653 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd 1654 copying. 1655 1656 What are the difficulties here? Well, firstly, the relocations 1657 examined by the linker in check_relocs are against the function code 1658 sym .foo, while the dynamic relocation in the plt is emitted against 1659 the function descriptor symbol, foo. Somewhere along the line, we need 1660 to carefully copy dynamic link information from one symbol to the other. 1661 Secondly, the generic part of the elf linker will make .foo a dynamic 1662 symbol as is normal for most other backends. We need foo dynamic 1663 instead, at least for an application final link. However, when 1664 creating a shared library containing foo, we need to have both symbols 1665 dynamic so that references to .foo are satisfied during the early 1666 stages of linking. Otherwise the linker might decide to pull in a 1667 definition from some other object, eg. a static library. */ 1668 1669/* The linker needs to keep track of the number of relocs that it 1670 decides to copy as dynamic relocs in check_relocs for each symbol. 1671 This is so that it can later discard them if they are found to be 1672 unnecessary. We store the information in a field extending the 1673 regular ELF linker hash table. */ 1674 1675struct ppc_dyn_relocs 1676{ 1677 struct ppc_dyn_relocs *next; 1678 1679 /* The input section of the reloc. */ 1680 asection *sec; 1681 1682 /* Total number of relocs copied for the input section. */ 1683 bfd_size_type count; 1684 1685 /* Number of pc-relative relocs copied for the input section. */ 1686 bfd_size_type pc_count; 1687}; 1688 1689/* Of those relocs that might be copied as dynamic relocs, this macro 1690 selects between relative and absolute types. */ 1691 1692#define IS_ABSOLUTE_RELOC(RTYPE) \ 1693 ((RTYPE) != R_PPC64_REL14 \ 1694 && (RTYPE) != R_PPC64_REL14_BRNTAKEN \ 1695 && (RTYPE) != R_PPC64_REL14_BRTAKEN \ 1696 && (RTYPE) != R_PPC64_REL24 \ 1697 && (RTYPE) != R_PPC64_REL32 \ 1698 && (RTYPE) != R_PPC64_REL64) 1699 1700/* ppc64 ELF linker hash entry. */ 1701 1702struct ppc_link_hash_entry 1703{ 1704 struct elf_link_hash_entry elf; 1705 1706 /* Track dynamic relocs copied for this symbol. */ 1707 struct ppc_dyn_relocs *dyn_relocs; 1708 1709 /* Flag function code and descriptor symbols. */ 1710 unsigned int is_func:1; 1711 unsigned int is_func_descriptor:1; 1712}; 1713 1714/* ppc64 ELF linker hash table. */ 1715 1716struct ppc_link_hash_table 1717{ 1718 struct elf_link_hash_table elf; 1719 1720 /* Short-cuts to get to dynamic linker sections. */ 1721 asection *sgot; 1722 asection *srelgot; 1723 asection *splt; 1724 asection *srelplt; 1725 asection *sdynbss; 1726 asection *srelbss; 1727 asection *sstub; 1728 asection *sglink; 1729 asection *sfpr; 1730 1731 /* Set on error. */ 1732 int plt_overflow; 1733 1734 /* Small local sym to section mapping cache. */ 1735 struct sym_sec_cache sym_sec; 1736}; 1737 1738/* Get the ppc64 ELF linker hash table from a link_info structure. */ 1739 1740#define ppc_hash_table(p) \ 1741 ((struct ppc_link_hash_table *) ((p)->hash)) 1742 1743/* Create an entry in a ppc64 ELF linker hash table. */ 1744 1745static struct bfd_hash_entry * 1746link_hash_newfunc (entry, table, string) 1747 struct bfd_hash_entry *entry; 1748 struct bfd_hash_table *table; 1749 const char *string; 1750{ 1751 /* Allocate the structure if it has not already been allocated by a 1752 subclass. */ 1753 if (entry == NULL) 1754 { 1755 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry)); 1756 if (entry == NULL) 1757 return entry; 1758 } 1759 1760 /* Call the allocation method of the superclass. */ 1761 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 1762 if (entry != NULL) 1763 { 1764 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry; 1765 1766 eh->dyn_relocs = NULL; 1767 eh->is_func = 0; 1768 eh->is_func_descriptor = 0; 1769 } 1770 1771 return entry; 1772} 1773 1774/* Create a ppc64 ELF linker hash table. */ 1775 1776static struct bfd_link_hash_table * 1777ppc64_elf_link_hash_table_create (abfd) 1778 bfd *abfd; 1779{ 1780 struct ppc_link_hash_table *htab; 1781 bfd_size_type amt = sizeof (struct ppc_link_hash_table); 1782 1783 htab = (struct ppc_link_hash_table *) bfd_alloc (abfd, amt); 1784 if (htab == NULL) 1785 return NULL; 1786 1787 if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc)) 1788 { 1789 bfd_release (abfd, htab); 1790 return NULL; 1791 } 1792 1793 htab->sgot = NULL; 1794 htab->srelgot = NULL; 1795 htab->splt = NULL; 1796 htab->srelplt = NULL; 1797 htab->sdynbss = NULL; 1798 htab->srelbss = NULL; 1799 htab->sstub = NULL; 1800 htab->sglink = NULL; 1801 htab->sfpr = NULL; 1802 htab->plt_overflow = 0; 1803 htab->sym_sec.abfd = NULL; 1804 1805 return &htab->elf.root; 1806} 1807 1808/* Create sections for linker generated code. */ 1809 1810static boolean 1811create_linkage_sections (dynobj, info) 1812 bfd *dynobj; 1813 struct bfd_link_info *info; 1814{ 1815 struct ppc_link_hash_table *htab; 1816 flagword flags; 1817 1818 htab = ppc_hash_table (info); 1819 1820 /* Create .sfpr for code to save and restore fp regs. */ 1821 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY 1822 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); 1823 htab->sfpr = bfd_make_section (dynobj, ".sfpr"); 1824 if (htab->sfpr == NULL 1825 || ! bfd_set_section_flags (dynobj, htab->sfpr, flags) 1826 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2)) 1827 return false; 1828 1829 /* Create .stub and .glink for global linkage functions. */ 1830 htab->sstub = bfd_make_section (dynobj, ".stub"); 1831 if (htab->sstub == NULL 1832 || ! bfd_set_section_flags (dynobj, htab->sstub, flags) 1833 || ! bfd_set_section_alignment (dynobj, htab->sstub, 2)) 1834 return false; 1835 htab->sglink = bfd_make_section (dynobj, ".glink"); 1836 if (htab->sglink == NULL 1837 || ! bfd_set_section_flags (dynobj, htab->sglink, flags) 1838 || ! bfd_set_section_alignment (dynobj, htab->sglink, 2)) 1839 return false; 1840 1841 return true; 1842} 1843 1844/* Create .got and .rela.got sections in DYNOBJ, and set up 1845 shortcuts to them in our hash table. */ 1846 1847static boolean 1848create_got_section (dynobj, info) 1849 bfd *dynobj; 1850 struct bfd_link_info *info; 1851{ 1852 struct ppc_link_hash_table *htab; 1853 1854 if (! _bfd_elf_create_got_section (dynobj, info)) 1855 return false; 1856 1857 htab = ppc_hash_table (info); 1858 htab->sgot = bfd_get_section_by_name (dynobj, ".got"); 1859 if (!htab->sgot) 1860 abort (); 1861 1862 htab->srelgot = bfd_make_section (dynobj, ".rela.got"); 1863 if (!htab->srelgot 1864 || ! bfd_set_section_flags (dynobj, htab->srelgot, 1865 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS 1866 | SEC_IN_MEMORY | SEC_LINKER_CREATED 1867 | SEC_READONLY)) 1868 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3)) 1869 return false; 1870 return true; 1871} 1872 1873/* Create the dynamic sections, and set up shortcuts. */ 1874 1875static boolean 1876ppc64_elf_create_dynamic_sections (dynobj, info) 1877 bfd *dynobj; 1878 struct bfd_link_info *info; 1879{ 1880 struct ppc_link_hash_table *htab; 1881 1882 htab = ppc_hash_table (info); 1883 if (!htab->sgot && !create_got_section (dynobj, info)) 1884 return false; 1885 1886 if (!_bfd_elf_create_dynamic_sections (dynobj, info)) 1887 return false; 1888 1889 htab->splt = bfd_get_section_by_name (dynobj, ".plt"); 1890 htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt"); 1891 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); 1892 if (!info->shared) 1893 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss"); 1894 1895 if (!htab->splt || !htab->srelplt || !htab->sdynbss 1896 || (!info->shared && !htab->srelbss)) 1897 abort (); 1898 1899 return true; 1900} 1901 1902/* Copy the extra info we tack onto an elf_link_hash_entry. */ 1903 1904static void 1905ppc64_elf_copy_indirect_symbol (dir, ind) 1906 struct elf_link_hash_entry *dir, *ind; 1907{ 1908 struct ppc_link_hash_entry *edir, *eind; 1909 1910 edir = (struct ppc_link_hash_entry *) dir; 1911 eind = (struct ppc_link_hash_entry *) ind; 1912 1913 if (eind->dyn_relocs != NULL) 1914 { 1915 if (edir->dyn_relocs != NULL) 1916 { 1917 struct ppc_dyn_relocs **pp; 1918 struct ppc_dyn_relocs *p; 1919 1920 if (ind->root.type == bfd_link_hash_indirect) 1921 abort (); 1922 1923 /* Add reloc counts against the weak sym to the strong sym 1924 list. Merge any entries against the same section. */ 1925 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 1926 { 1927 struct ppc_dyn_relocs *q; 1928 1929 for (q = edir->dyn_relocs; q != NULL; q = q->next) 1930 if (q->sec == p->sec) 1931 { 1932 q->pc_count += p->pc_count; 1933 q->count += p->count; 1934 *pp = p->next; 1935 break; 1936 } 1937 if (q == NULL) 1938 pp = &p->next; 1939 } 1940 *pp = edir->dyn_relocs; 1941 } 1942 1943 edir->dyn_relocs = eind->dyn_relocs; 1944 eind->dyn_relocs = NULL; 1945 } 1946 1947 edir->is_func |= eind->is_func; 1948 edir->is_func_descriptor |= eind->is_func_descriptor; 1949 1950 _bfd_elf_link_hash_copy_indirect (dir, ind); 1951} 1952 1953/* Look through the relocs for a section during the first phase, and 1954 calculate needed space in the global offset table, procedure 1955 linkage table, and dynamic reloc sections. */ 1956 1957static boolean 1958ppc64_elf_check_relocs (abfd, info, sec, relocs) 1959 bfd *abfd; 1960 struct bfd_link_info *info; 1961 asection *sec; 1962 const Elf_Internal_Rela *relocs; 1963{ 1964 struct ppc_link_hash_table *htab; 1965 Elf_Internal_Shdr *symtab_hdr; 1966 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; 1967 const Elf_Internal_Rela *rel; 1968 const Elf_Internal_Rela *rel_end; 1969 asection *sreloc; 1970 boolean is_opd; 1971 1972 if (info->relocateable) 1973 return true; 1974 1975 htab = ppc_hash_table (info); 1976 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1977 1978 sym_hashes = elf_sym_hashes (abfd); 1979 sym_hashes_end = (sym_hashes 1980 + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)); 1981 if (!elf_bad_symtab (abfd)) 1982 sym_hashes_end -= symtab_hdr->sh_info; 1983 1984 sreloc = NULL; 1985 is_opd = strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0; 1986 1987 if (htab->elf.dynobj == NULL) 1988 htab->elf.dynobj = abfd; 1989 if (htab->sfpr == NULL 1990 && !create_linkage_sections (htab->elf.dynobj, info)) 1991 return false; 1992 1993 rel_end = relocs + sec->reloc_count; 1994 for (rel = relocs; rel < rel_end; rel++) 1995 { 1996 unsigned long r_symndx; 1997 struct elf_link_hash_entry *h; 1998 enum elf_ppc_reloc_type r_type; 1999 2000 r_symndx = ELF64_R_SYM (rel->r_info); 2001 if (r_symndx < symtab_hdr->sh_info) 2002 h = NULL; 2003 else 2004 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2005 2006 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info); 2007 switch (r_type) 2008 { 2009 /* GOT16 relocations */ 2010 case R_PPC64_GOT16: 2011 case R_PPC64_GOT16_DS: 2012 case R_PPC64_GOT16_HA: 2013 case R_PPC64_GOT16_HI: 2014 case R_PPC64_GOT16_LO: 2015 case R_PPC64_GOT16_LO_DS: 2016 2017 /* This symbol requires a global offset table entry. */ 2018 if (htab->sgot == NULL 2019 && !create_got_section (htab->elf.dynobj, info)) 2020 return false; 2021 2022 if (h != NULL) 2023 { 2024 h->got.refcount += 1; 2025 } 2026 else 2027 { 2028 bfd_signed_vma *local_got_refcounts; 2029 2030 /* This is a global offset table entry for a local symbol. */ 2031 local_got_refcounts = elf_local_got_refcounts (abfd); 2032 if (local_got_refcounts == NULL) 2033 { 2034 bfd_size_type size; 2035 2036 size = symtab_hdr->sh_info; 2037 size *= sizeof (bfd_signed_vma); 2038 local_got_refcounts = ((bfd_signed_vma *) 2039 bfd_zalloc (abfd, size)); 2040 if (local_got_refcounts == NULL) 2041 return false; 2042 elf_local_got_refcounts (abfd) = local_got_refcounts; 2043 } 2044 local_got_refcounts[r_symndx] += 1; 2045 } 2046 break; 2047 2048 case R_PPC64_PLT16_HA: 2049 case R_PPC64_PLT16_HI: 2050 case R_PPC64_PLT16_LO: 2051 case R_PPC64_PLT32: 2052 case R_PPC64_PLT64: 2053 /* This symbol requires a procedure linkage table entry. We 2054 actually build the entry in adjust_dynamic_symbol, 2055 because this might be a case of linking PIC code without 2056 linking in any dynamic objects, in which case we don't 2057 need to generate a procedure linkage table after all. */ 2058 if (h == NULL) 2059 { 2060 /* It does not make sense to have a procedure linkage 2061 table entry for a local symbol. */ 2062 bfd_set_error (bfd_error_bad_value); 2063 return false; 2064 } 2065 2066 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; 2067 h->plt.refcount += 1; 2068 ((struct ppc_link_hash_entry *) h)->is_func = 1; 2069 break; 2070 2071 /* The following relocations don't need to propagate the 2072 relocation if linking a shared object since they are 2073 section relative. */ 2074 case R_PPC64_SECTOFF: 2075 case R_PPC64_SECTOFF_LO: 2076 case R_PPC64_SECTOFF_HI: 2077 case R_PPC64_SECTOFF_HA: 2078 case R_PPC64_SECTOFF_DS: 2079 case R_PPC64_SECTOFF_LO_DS: 2080 case R_PPC64_TOC16: 2081 case R_PPC64_TOC16_LO: 2082 case R_PPC64_TOC16_HI: 2083 case R_PPC64_TOC16_HA: 2084 case R_PPC64_TOC16_DS: 2085 case R_PPC64_TOC16_LO_DS: 2086 break; 2087 2088 /* This relocation describes the C++ object vtable hierarchy. 2089 Reconstruct it for later use during GC. */ 2090 case R_PPC64_GNU_VTINHERIT: 2091 if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 2092 return false; 2093 break; 2094 2095 /* This relocation describes which C++ vtable entries are actually 2096 used. Record for later use during GC. */ 2097 case R_PPC64_GNU_VTENTRY: 2098 if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 2099 return false; 2100 break; 2101 2102 case R_PPC64_REL24: 2103 if (h != NULL 2104 && h->root.root.string[0] == '.' 2105 && h->root.root.string[1] != 0) 2106 { 2107 /* We may need a .plt entry if the function this reloc 2108 refers to is in a shared lib. */ 2109 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; 2110 h->plt.refcount += 1; 2111 ((struct ppc_link_hash_entry *) h)->is_func = 1; 2112 } 2113 break; 2114 2115 case R_PPC64_ADDR64: 2116 if (is_opd 2117 && h != NULL 2118 && h->root.root.string[0] == '.' 2119 && h->root.root.string[1] != 0) 2120 { 2121 struct elf_link_hash_entry *fdh; 2122 2123 fdh = elf_link_hash_lookup (&htab->elf, h->root.root.string + 1, 2124 false, false, false); 2125 if (fdh != NULL) 2126 { 2127 /* Ensure the function descriptor symbol string is 2128 part of the code symbol string. We aren't 2129 changing the name here, just allowing some tricks 2130 in ppc64_elf_hide_symbol. */ 2131 fdh->root.root.string = h->root.root.string + 1; 2132 ((struct ppc_link_hash_entry *) fdh)->is_func_descriptor = 1; 2133 ((struct ppc_link_hash_entry *) h)->is_func = 1; 2134 } 2135 } 2136 /* Fall through. */ 2137 2138 case R_PPC64_REL64: 2139 case R_PPC64_REL32: 2140 case R_PPC64_REL14: 2141 case R_PPC64_REL14_BRTAKEN: 2142 case R_PPC64_REL14_BRNTAKEN: 2143 case R_PPC64_ADDR14: 2144 case R_PPC64_ADDR14_BRNTAKEN: 2145 case R_PPC64_ADDR14_BRTAKEN: 2146 case R_PPC64_ADDR16: 2147 case R_PPC64_ADDR16_DS: 2148 case R_PPC64_ADDR16_HA: 2149 case R_PPC64_ADDR16_HI: 2150 case R_PPC64_ADDR16_HIGHER: 2151 case R_PPC64_ADDR16_HIGHERA: 2152 case R_PPC64_ADDR16_HIGHEST: 2153 case R_PPC64_ADDR16_HIGHESTA: 2154 case R_PPC64_ADDR16_LO: 2155 case R_PPC64_ADDR16_LO_DS: 2156 case R_PPC64_ADDR24: 2157 case R_PPC64_ADDR30: 2158 case R_PPC64_ADDR32: 2159 case R_PPC64_UADDR16: 2160 case R_PPC64_UADDR32: 2161 case R_PPC64_UADDR64: 2162 case R_PPC64_TOC: 2163 /* Don't propagate .opd relocs. */ 2164 if (NO_OPD_RELOCS && is_opd) 2165 break; 2166 2167 /* If we are creating a shared library, and this is a reloc 2168 against a global symbol, or a non PC relative reloc 2169 against a local symbol, then we need to copy the reloc 2170 into the shared library. However, if we are linking with 2171 -Bsymbolic, we do not need to copy a reloc against a 2172 global symbol which is defined in an object we are 2173 including in the link (i.e., DEF_REGULAR is set). At 2174 this point we have not seen all the input files, so it is 2175 possible that DEF_REGULAR is not set now but will be set 2176 later (it is never cleared). In case of a weak definition, 2177 DEF_REGULAR may be cleared later by a strong definition in 2178 a shared library. We account for that possibility below by 2179 storing information in the relocs_copied field of the hash 2180 table entry. A similar situation occurs when creating 2181 shared libraries and symbol visibility changes render the 2182 symbol local. 2183 2184 If on the other hand, we are creating an executable, we 2185 may need to keep relocations for symbols satisfied by a 2186 dynamic library if we manage to avoid copy relocs for the 2187 symbol. */ 2188 if ((info->shared 2189 && (sec->flags & SEC_ALLOC) != 0 2190 && (IS_ABSOLUTE_RELOC (r_type) 2191 || (h != NULL 2192 && (! info->symbolic 2193 || h->root.type == bfd_link_hash_defweak 2194 || (h->elf_link_hash_flags 2195 & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 2196 || (!info->shared 2197 && (sec->flags & SEC_ALLOC) != 0 2198 && h != NULL 2199 && (h->root.type == bfd_link_hash_defweak 2200 || (h->elf_link_hash_flags 2201 & ELF_LINK_HASH_DEF_REGULAR) == 0))) 2202 { 2203 struct ppc_dyn_relocs *p; 2204 struct ppc_dyn_relocs **head; 2205 2206 /* We must copy these reloc types into the output file. 2207 Create a reloc section in dynobj and make room for 2208 this reloc. */ 2209 if (sreloc == NULL) 2210 { 2211 const char *name; 2212 bfd *dynobj; 2213 2214 name = (bfd_elf_string_from_elf_section 2215 (abfd, 2216 elf_elfheader (abfd)->e_shstrndx, 2217 elf_section_data (sec)->rel_hdr.sh_name)); 2218 if (name == NULL) 2219 return false; 2220 2221 if (strncmp (name, ".rela", 5) != 0 2222 || strcmp (bfd_get_section_name (abfd, sec), 2223 name + 5) != 0) 2224 { 2225 (*_bfd_error_handler) 2226 (_("%s: bad relocation section name `%s\'"), 2227 bfd_archive_filename (abfd), name); 2228 bfd_set_error (bfd_error_bad_value); 2229 } 2230 2231 dynobj = htab->elf.dynobj; 2232 sreloc = bfd_get_section_by_name (dynobj, name); 2233 if (sreloc == NULL) 2234 { 2235 flagword flags; 2236 2237 sreloc = bfd_make_section (dynobj, name); 2238 flags = (SEC_HAS_CONTENTS | SEC_READONLY 2239 | SEC_IN_MEMORY | SEC_LINKER_CREATED); 2240 if ((sec->flags & SEC_ALLOC) != 0) 2241 flags |= SEC_ALLOC | SEC_LOAD; 2242 if (sreloc == NULL 2243 || ! bfd_set_section_flags (dynobj, sreloc, flags) 2244 || ! bfd_set_section_alignment (dynobj, sreloc, 3)) 2245 return false; 2246 } 2247 elf_section_data (sec)->sreloc = sreloc; 2248 } 2249 2250 /* If this is a global symbol, we count the number of 2251 relocations we need for this symbol. */ 2252 if (h != NULL) 2253 { 2254 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs; 2255 } 2256 else 2257 { 2258 /* Track dynamic relocs needed for local syms too. 2259 We really need local syms available to do this 2260 easily. Oh well. */ 2261 2262 asection *s; 2263 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, 2264 sec, r_symndx); 2265 if (s == NULL) 2266 return false; 2267 2268 head = ((struct ppc_dyn_relocs **) 2269 &elf_section_data (s)->local_dynrel); 2270 } 2271 2272 p = *head; 2273 if (p == NULL || p->sec != sec) 2274 { 2275 p = ((struct ppc_dyn_relocs *) 2276 bfd_alloc (htab->elf.dynobj, 2277 (bfd_size_type) sizeof *p)); 2278 if (p == NULL) 2279 return false; 2280 p->next = *head; 2281 *head = p; 2282 p->sec = sec; 2283 p->count = 0; 2284 p->pc_count = 0; 2285 } 2286 2287 p->count += 1; 2288 if (!IS_ABSOLUTE_RELOC (r_type)) 2289 p->pc_count += 1; 2290 } 2291 break; 2292 2293 default: 2294 break; 2295 } 2296 } 2297 2298 return true; 2299} 2300 2301/* Return the section that should be marked against GC for a given 2302 relocation. */ 2303 2304static asection * 2305ppc64_elf_gc_mark_hook (abfd, info, rel, h, sym) 2306 bfd *abfd; 2307 struct bfd_link_info *info ATTRIBUTE_UNUSED; 2308 Elf_Internal_Rela *rel; 2309 struct elf_link_hash_entry *h; 2310 Elf_Internal_Sym *sym; 2311{ 2312 if (h != NULL) 2313 { 2314 enum elf_ppc_reloc_type r_type; 2315 2316 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info); 2317 switch (r_type) 2318 { 2319 case R_PPC64_GNU_VTINHERIT: 2320 case R_PPC64_GNU_VTENTRY: 2321 break; 2322 2323 default: 2324 switch (h->root.type) 2325 { 2326 case bfd_link_hash_defined: 2327 case bfd_link_hash_defweak: 2328 return h->root.u.def.section; 2329 2330 case bfd_link_hash_common: 2331 return h->root.u.c.p->section; 2332 2333 default: 2334 break; 2335 } 2336 } 2337 } 2338 else 2339 { 2340 return bfd_section_from_elf_index (abfd, sym->st_shndx); 2341 } 2342 2343 return NULL; 2344} 2345 2346/* Update the .got, .plt. and dynamic reloc reference counts for the 2347 section being removed. */ 2348 2349static boolean 2350ppc64_elf_gc_sweep_hook (abfd, info, sec, relocs) 2351 bfd *abfd; 2352 struct bfd_link_info *info ATTRIBUTE_UNUSED; 2353 asection *sec; 2354 const Elf_Internal_Rela *relocs; 2355{ 2356 Elf_Internal_Shdr *symtab_hdr; 2357 struct elf_link_hash_entry **sym_hashes; 2358 bfd_signed_vma *local_got_refcounts; 2359 const Elf_Internal_Rela *rel, *relend; 2360 2361 elf_section_data (sec)->local_dynrel = NULL; 2362 2363 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 2364 sym_hashes = elf_sym_hashes (abfd); 2365 local_got_refcounts = elf_local_got_refcounts (abfd); 2366 2367 relend = relocs + sec->reloc_count; 2368 for (rel = relocs; rel < relend; rel++) 2369 { 2370 unsigned long r_symndx; 2371 enum elf_ppc_reloc_type r_type; 2372 struct elf_link_hash_entry *h; 2373 2374 r_symndx = ELF64_R_SYM (rel->r_info); 2375 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info); 2376 switch (r_type) 2377 { 2378 case R_PPC64_GOT16: 2379 case R_PPC64_GOT16_DS: 2380 case R_PPC64_GOT16_HA: 2381 case R_PPC64_GOT16_HI: 2382 case R_PPC64_GOT16_LO: 2383 case R_PPC64_GOT16_LO_DS: 2384 if (r_symndx >= symtab_hdr->sh_info) 2385 { 2386 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2387 if (h->got.refcount > 0) 2388 h->got.refcount--; 2389 } 2390 else 2391 { 2392 if (local_got_refcounts[r_symndx] > 0) 2393 local_got_refcounts[r_symndx]--; 2394 } 2395 break; 2396 2397 case R_PPC64_PLT16_HA: 2398 case R_PPC64_PLT16_HI: 2399 case R_PPC64_PLT16_LO: 2400 case R_PPC64_PLT32: 2401 case R_PPC64_PLT64: 2402 if (r_symndx >= symtab_hdr->sh_info) 2403 { 2404 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2405 if (h->plt.refcount > 0) 2406 h->plt.refcount--; 2407 } 2408 break; 2409 2410 case R_PPC64_REL24: 2411 if (r_symndx >= symtab_hdr->sh_info) 2412 { 2413 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2414 if (h->plt.refcount > 0) 2415 h->plt.refcount--; 2416 } 2417 break; 2418 2419 case R_PPC64_REL14: 2420 case R_PPC64_REL14_BRNTAKEN: 2421 case R_PPC64_REL14_BRTAKEN: 2422 case R_PPC64_REL32: 2423 case R_PPC64_REL64: 2424 if (r_symndx >= symtab_hdr->sh_info) 2425 { 2426 struct ppc_link_hash_entry *eh; 2427 struct ppc_dyn_relocs **pp; 2428 struct ppc_dyn_relocs *p; 2429 2430 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2431 eh = (struct ppc_link_hash_entry *) h; 2432 2433 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) 2434 if (p->sec == sec) 2435 { 2436 p->pc_count -= 1; 2437 p->count -= 1; 2438 if (p->count == 0) 2439 *pp = p->next; 2440 break; 2441 } 2442 } 2443 break; 2444 2445 case R_PPC64_ADDR14: 2446 case R_PPC64_ADDR14_BRNTAKEN: 2447 case R_PPC64_ADDR14_BRTAKEN: 2448 case R_PPC64_ADDR16: 2449 case R_PPC64_ADDR16_DS: 2450 case R_PPC64_ADDR16_HA: 2451 case R_PPC64_ADDR16_HI: 2452 case R_PPC64_ADDR16_HIGHER: 2453 case R_PPC64_ADDR16_HIGHERA: 2454 case R_PPC64_ADDR16_HIGHEST: 2455 case R_PPC64_ADDR16_HIGHESTA: 2456 case R_PPC64_ADDR16_LO: 2457 case R_PPC64_ADDR16_LO_DS: 2458 case R_PPC64_ADDR24: 2459 case R_PPC64_ADDR30: 2460 case R_PPC64_ADDR32: 2461 case R_PPC64_ADDR64: 2462 case R_PPC64_UADDR16: 2463 case R_PPC64_UADDR32: 2464 case R_PPC64_UADDR64: 2465 case R_PPC64_TOC: 2466 if (r_symndx >= symtab_hdr->sh_info) 2467 { 2468 struct ppc_link_hash_entry *eh; 2469 struct ppc_dyn_relocs **pp; 2470 struct ppc_dyn_relocs *p; 2471 2472 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2473 eh = (struct ppc_link_hash_entry *) h; 2474 2475 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) 2476 if (p->sec == sec) 2477 { 2478 p->count -= 1; 2479 if (p->count == 0) 2480 *pp = p->next; 2481 break; 2482 } 2483 } 2484 break; 2485 2486 default: 2487 break; 2488 } 2489 } 2490 return true; 2491} 2492 2493/* Called via elf_link_hash_traverse to transfer dynamic linking 2494 information on function code symbol entries to their corresponding 2495 function descriptor symbol entries. */ 2496static boolean 2497func_desc_adjust (h, inf) 2498 struct elf_link_hash_entry *h; 2499 PTR inf; 2500{ 2501 struct bfd_link_info *info; 2502 struct ppc_link_hash_table *htab; 2503 2504 if (h->root.type == bfd_link_hash_indirect) 2505 return true; 2506 2507 if (h->root.type == bfd_link_hash_warning) 2508 h = (struct elf_link_hash_entry *) h->root.u.i.link; 2509 2510 info = (struct bfd_link_info *) inf; 2511 htab = ppc_hash_table (info); 2512 2513 /* If this is a function code symbol, transfer dynamic linking 2514 information to the function descriptor symbol. */ 2515 if (!((struct ppc_link_hash_entry *) h)->is_func) 2516 return true; 2517 2518 if (h->plt.refcount > 0 2519 && h->root.root.string[0] == '.' 2520 && h->root.root.string[1] != '\0') 2521 { 2522 struct elf_link_hash_entry *fdh; 2523 boolean force_local; 2524 2525 /* Find the corresponding function descriptor symbol. Create it 2526 as undefined if necessary. */ 2527 2528 fdh = elf_link_hash_lookup (&htab->elf, h->root.root.string + 1, 2529 false, false, true); 2530 2531 if (fdh == NULL 2532 && info->shared 2533 && (h->root.type == bfd_link_hash_undefined 2534 || h->root.type == bfd_link_hash_undefweak)) 2535 { 2536 bfd *abfd; 2537 asymbol *newsym; 2538 2539 abfd = h->root.u.undef.abfd; 2540 newsym = bfd_make_empty_symbol (abfd); 2541 newsym->name = h->root.root.string + 1; 2542 newsym->section = bfd_und_section_ptr; 2543 newsym->value = 0; 2544 newsym->flags = BSF_OBJECT; 2545 if (h->root.type == bfd_link_hash_undefweak) 2546 newsym->flags |= BSF_WEAK; 2547 2548 if ( !(_bfd_generic_link_add_one_symbol 2549 (info, abfd, newsym->name, newsym->flags, 2550 newsym->section, newsym->value, NULL, false, false, 2551 (struct bfd_link_hash_entry **) &fdh))) 2552 { 2553 return false; 2554 } 2555 fdh->elf_link_hash_flags &= ~ELF_LINK_NON_ELF; 2556 } 2557 2558 if (fdh != NULL 2559 && (fdh->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0 2560 && (info->shared 2561 || (fdh->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 2562 || (fdh->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0)) 2563 { 2564 if (fdh->dynindx == -1) 2565 if (! bfd_elf64_link_record_dynamic_symbol (info, fdh)) 2566 return false; 2567 fdh->elf_link_hash_flags |= (h->elf_link_hash_flags 2568 & (ELF_LINK_HASH_REF_REGULAR 2569 | ELF_LINK_HASH_REF_DYNAMIC 2570 | ELF_LINK_HASH_REF_REGULAR_NONWEAK 2571 | ELF_LINK_NON_GOT_REF)); 2572 if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 2573 { 2574 fdh->plt.refcount = h->plt.refcount; 2575 fdh->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; 2576 } 2577 ((struct ppc_link_hash_entry *) fdh)->is_func_descriptor = 1; 2578 fdh->root.root.string = h->root.root.string + 1; 2579 } 2580 2581 /* Now that the info is on the function descriptor, clear the 2582 function code sym info. Any function code syms for which we 2583 don't have a definition in a regular file, we force local. 2584 This prevents a shared library from exporting syms that have 2585 been imported from another library. Function code syms that 2586 are really in the library we must leave global to prevent the 2587 linker dragging in a definition from a static library. */ 2588 force_local = ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 2589 && info->shared); 2590 _bfd_elf_link_hash_hide_symbol (info, h, force_local); 2591 } 2592 2593 return true; 2594} 2595 2596#define MIN_SAVE_FPR 14 2597#define MAX_SAVE_FPR 31 2598 2599/* Called near the start of bfd_elf_size_dynamic_sections. We use 2600 this hook to a) provide some gcc support functions, and b) transfer 2601 dynamic linking information gathered so far on function code symbol 2602 entries, to their corresponding function descriptor symbol entries. */ 2603static boolean 2604ppc64_elf_func_desc_adjust (obfd, info) 2605 bfd *obfd ATTRIBUTE_UNUSED; 2606 struct bfd_link_info *info; 2607{ 2608 struct ppc_link_hash_table *htab; 2609 unsigned int lowest_savef = MAX_SAVE_FPR + 2; 2610 unsigned int lowest_restf = MAX_SAVE_FPR + 2; 2611 unsigned int i; 2612 struct elf_link_hash_entry *h; 2613 char sym[10]; 2614 2615 htab = ppc_hash_table (info); 2616 2617 if (htab->sfpr == NULL) 2618 /* We don't have any relocs. */ 2619 return true; 2620 2621 /* First provide any missing ._savef* and ._restf* functions. */ 2622 memcpy (sym, "._savef14", 10); 2623 for (i = MIN_SAVE_FPR; i <= MAX_SAVE_FPR; i++) 2624 { 2625 sym[7] = i / 10 + '0'; 2626 sym[8] = i % 10 + '0'; 2627 h = elf_link_hash_lookup (&htab->elf, sym, false, false, true); 2628 if (h != NULL 2629 && h->root.type == bfd_link_hash_undefined) 2630 { 2631 if (lowest_savef > i) 2632 lowest_savef = i; 2633 h->root.type = bfd_link_hash_defined; 2634 h->root.u.def.section = htab->sfpr; 2635 h->root.u.def.value = (i - lowest_savef) * 4; 2636 h->type = STT_FUNC; 2637 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; 2638 _bfd_elf_link_hash_hide_symbol (info, h, info->shared); 2639 } 2640 } 2641 2642 memcpy (sym, "._restf14", 10); 2643 for (i = MIN_SAVE_FPR; i <= MAX_SAVE_FPR; i++) 2644 { 2645 sym[7] = i / 10 + '0'; 2646 sym[8] = i % 10 + '0'; 2647 h = elf_link_hash_lookup (&htab->elf, sym, false, false, true); 2648 if (h != NULL 2649 && h->root.type == bfd_link_hash_undefined) 2650 { 2651 if (lowest_restf > i) 2652 lowest_restf = i; 2653 h->root.type = bfd_link_hash_defined; 2654 h->root.u.def.section = htab->sfpr; 2655 h->root.u.def.value = ((MAX_SAVE_FPR + 2 - lowest_savef) * 4 2656 + (i - lowest_restf) * 4); 2657 h->type = STT_FUNC; 2658 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; 2659 _bfd_elf_link_hash_hide_symbol (info, h, info->shared); 2660 } 2661 } 2662 2663 htab->sfpr->_raw_size = ((MAX_SAVE_FPR + 2 - lowest_savef) * 4 2664 + (MAX_SAVE_FPR + 2 - lowest_restf) * 4); 2665 2666 if (htab->sfpr->_raw_size == 0) 2667 { 2668 _bfd_strip_section_from_output (info, htab->sfpr); 2669 } 2670 else 2671 { 2672 bfd_byte *p = (bfd_byte *) bfd_alloc (htab->elf.dynobj, 2673 htab->sfpr->_raw_size); 2674 if (p == NULL) 2675 return false; 2676 htab->sfpr->contents = p; 2677 2678 for (i = lowest_savef; i <= MAX_SAVE_FPR; i++) 2679 { 2680 unsigned int fpr = i << 21; 2681 unsigned int stackoff = (1 << 16) - (MAX_SAVE_FPR + 1 - i) * 8; 2682 bfd_put_32 (htab->elf.dynobj, STFD_FR0_0R1 + fpr + stackoff, p); 2683 p += 4; 2684 } 2685 bfd_put_32 (htab->elf.dynobj, BLR, p); 2686 p += 4; 2687 2688 for (i = lowest_restf; i <= MAX_SAVE_FPR; i++) 2689 { 2690 unsigned int fpr = i << 21; 2691 unsigned int stackoff = (1 << 16) - (MAX_SAVE_FPR + 1 - i) * 8; 2692 bfd_put_32 (htab->elf.dynobj, LFD_FR0_0R1 + fpr + stackoff, p); 2693 p += 4; 2694 } 2695 bfd_put_32 (htab->elf.dynobj, BLR, p); 2696 p += 4; 2697 } 2698 2699 elf_link_hash_traverse (&htab->elf, func_desc_adjust, (PTR) info); 2700 return true; 2701} 2702 2703/* Adjust a symbol defined by a dynamic object and referenced by a 2704 regular object. The current definition is in some section of the 2705 dynamic object, but we're not including those sections. We have to 2706 change the definition to something the rest of the link can 2707 understand. */ 2708 2709static boolean 2710ppc64_elf_adjust_dynamic_symbol (info, h) 2711 struct bfd_link_info *info; 2712 struct elf_link_hash_entry *h; 2713{ 2714 struct ppc_link_hash_table *htab; 2715 struct ppc_link_hash_entry * eh; 2716 struct ppc_dyn_relocs *p; 2717 asection *s; 2718 unsigned int power_of_two; 2719 2720 htab = ppc_hash_table (info); 2721 2722 /* Deal with function syms. */ 2723 if (h->type == STT_FUNC 2724 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) 2725 { 2726 /* Clear procedure linkage table information for any symbol that 2727 won't need a .plt entry. */ 2728 if (!((struct ppc_link_hash_entry *) h)->is_func_descriptor 2729 || h->plt.refcount <= 0 2730 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0 2731 || (! info->shared 2732 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 2733 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)) 2734 { 2735 h->plt.offset = (bfd_vma) -1; 2736 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 2737 } 2738 return true; 2739 } 2740 else 2741 h->plt.offset = (bfd_vma) -1; 2742 2743 /* If this is a weak symbol, and there is a real definition, the 2744 processor independent code will have arranged for us to see the 2745 real definition first, and we can just use the same value. */ 2746 if (h->weakdef != NULL) 2747 { 2748 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined 2749 || h->weakdef->root.type == bfd_link_hash_defweak); 2750 h->root.u.def.section = h->weakdef->root.u.def.section; 2751 h->root.u.def.value = h->weakdef->root.u.def.value; 2752 return true; 2753 } 2754 2755 /* This is a reference to a symbol defined by a dynamic object which 2756 is not a function. */ 2757 2758 /* If we are creating a shared library, we must presume that the 2759 only references to the symbol are via the global offset table. 2760 For such cases we need not do anything here; the relocations will 2761 be handled correctly by relocate_section. */ 2762 if (info->shared) 2763 return true; 2764 2765 /* If there are no references to this symbol that do not use the 2766 GOT, we don't need to generate a copy reloc. */ 2767 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0) 2768 return true; 2769 2770 eh = (struct ppc_link_hash_entry *) h; 2771 for (p = eh->dyn_relocs; p != NULL; p = p->next) 2772 { 2773 s = p->sec->output_section; 2774 if (s != NULL && (s->flags & SEC_READONLY) != 0) 2775 break; 2776 } 2777 2778 /* If we didn't find any dynamic relocs in read-only sections, then 2779 we'll be keeping the dynamic relocs and avoiding the copy reloc. */ 2780 if (p == NULL) 2781 { 2782 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF; 2783 return true; 2784 } 2785 2786 /* We must allocate the symbol in our .dynbss section, which will 2787 become part of the .bss section of the executable. There will be 2788 an entry for this symbol in the .dynsym section. The dynamic 2789 object will contain position independent code, so all references 2790 from the dynamic object to this symbol will go through the global 2791 offset table. The dynamic linker will use the .dynsym entry to 2792 determine the address it must put in the global offset table, so 2793 both the dynamic object and the regular object will refer to the 2794 same memory location for the variable. */ 2795 2796 /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to 2797 copy the initial value out of the dynamic object and into the 2798 runtime process image. We need to remember the offset into the 2799 .rela.bss section we are going to use. */ 2800 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) 2801 { 2802 htab->srelbss->_raw_size += sizeof (Elf64_External_Rela); 2803 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY; 2804 } 2805 2806 /* We need to figure out the alignment required for this symbol. I 2807 have no idea how ELF linkers handle this. */ 2808 power_of_two = bfd_log2 (h->size); 2809 if (power_of_two > 4) 2810 power_of_two = 4; 2811 2812 /* Apply the required alignment. */ 2813 s = htab->sdynbss; 2814 s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two)); 2815 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s)) 2816 { 2817 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two)) 2818 return false; 2819 } 2820 2821 /* Define the symbol as being at this point in the section. */ 2822 h->root.u.def.section = s; 2823 h->root.u.def.value = s->_raw_size; 2824 2825 /* Increment the section size to make room for the symbol. */ 2826 s->_raw_size += h->size; 2827 2828 return true; 2829} 2830 2831/* If given a function descriptor symbol, hide both the function code 2832 sym and the descriptor. */ 2833static void 2834ppc64_elf_hide_symbol (info, h, force_local) 2835 struct bfd_link_info *info; 2836 struct elf_link_hash_entry *h; 2837 boolean force_local; 2838{ 2839 _bfd_elf_link_hash_hide_symbol (info, h, force_local); 2840 2841 if (((struct ppc_link_hash_entry *) h)->is_func_descriptor) 2842 { 2843 const char *name; 2844 struct elf_link_hash_entry *fh; 2845 struct ppc_link_hash_table *htab; 2846 2847 name = h->root.root.string - 1; 2848 htab = ppc_hash_table (info); 2849 fh = elf_link_hash_lookup (&htab->elf, name, false, false, false); 2850 if (fh != NULL) 2851 _bfd_elf_link_hash_hide_symbol (info, fh, force_local); 2852 } 2853} 2854 2855/* This is the condition under which ppc64_elf_finish_dynamic_symbol 2856 will be called from elflink.h. If elflink.h doesn't call our 2857 finish_dynamic_symbol routine, we'll need to do something about 2858 initializing any .plt and .got entries in ppc64_elf_relocate_section. */ 2859#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \ 2860 ((DYN) \ 2861 && ((INFO)->shared \ 2862 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \ 2863 && ((H)->dynindx != -1 \ 2864 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)) 2865 2866/* Allocate space in .plt, .got and associated reloc sections for 2867 dynamic relocs. */ 2868 2869static boolean 2870allocate_dynrelocs (h, inf) 2871 struct elf_link_hash_entry *h; 2872 PTR inf; 2873{ 2874 struct bfd_link_info *info; 2875 struct ppc_link_hash_table *htab; 2876 asection *s; 2877 struct ppc_link_hash_entry *eh; 2878 struct ppc_dyn_relocs *p; 2879 2880 if (h->root.type == bfd_link_hash_indirect) 2881 return true; 2882 2883 if (h->root.type == bfd_link_hash_warning) 2884 h = (struct elf_link_hash_entry *) h->root.u.i.link; 2885 2886 info = (struct bfd_link_info *) inf; 2887 htab = ppc_hash_table (info); 2888 2889 if (htab->elf.dynamic_sections_created 2890 && h->plt.refcount > 0 2891 && h->dynindx != -1) 2892 { 2893 BFD_ASSERT (((struct ppc_link_hash_entry *) h)->is_func_descriptor); 2894 2895 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h)) 2896 { 2897 /* If this is the first .plt entry, make room for the special 2898 first entry. */ 2899 s = htab->splt; 2900 if (s->_raw_size == 0) 2901 s->_raw_size += PLT_INITIAL_ENTRY_SIZE; 2902 2903 h->plt.offset = s->_raw_size; 2904 2905 /* Make room for this entry. */ 2906 s->_raw_size += PLT_ENTRY_SIZE; 2907 2908 /* Make room for the .stub and .glink code. */ 2909 s = htab->sstub; 2910 s->_raw_size += PLT_CALL_STUB_SIZE; 2911 2912 s = htab->sglink; 2913 if (s->_raw_size == 0) 2914 s->_raw_size += GLINK_CALL_STUB_SIZE; 2915 /* We need bigger stubs past index 32767. */ 2916 if (s->_raw_size >= GLINK_CALL_STUB_SIZE + 32768*2*4) 2917 s->_raw_size += 4; 2918 s->_raw_size += 2*4; 2919 2920 /* We also need to make an entry in the .rela.plt section. */ 2921 s = htab->srelplt; 2922 s->_raw_size += sizeof (Elf64_External_Rela); 2923 } 2924 else 2925 { 2926 h->plt.offset = (bfd_vma) -1; 2927 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 2928 } 2929 } 2930 else 2931 { 2932 h->plt.offset = (bfd_vma) -1; 2933 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 2934 } 2935 2936 if (h->got.refcount > 0) 2937 { 2938 boolean dyn; 2939 2940 /* Make sure this symbol is output as a dynamic symbol. 2941 Undefined weak syms won't yet be marked as dynamic. */ 2942 if (h->dynindx == -1 2943 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 2944 { 2945 if (! bfd_elf64_link_record_dynamic_symbol (info, h)) 2946 return false; 2947 } 2948 2949 s = htab->sgot; 2950 h->got.offset = s->_raw_size; 2951 s->_raw_size += 8; 2952 dyn = htab->elf.dynamic_sections_created; 2953 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)) 2954 htab->srelgot->_raw_size += sizeof (Elf64_External_Rela); 2955 } 2956 else 2957 h->got.offset = (bfd_vma) -1; 2958 2959 eh = (struct ppc_link_hash_entry *) h; 2960 if (eh->dyn_relocs == NULL) 2961 return true; 2962 2963 /* In the shared -Bsymbolic case, discard space allocated for 2964 dynamic pc-relative relocs against symbols which turn out to be 2965 defined in regular objects. For the normal shared case, discard 2966 space for relocs that have become local due to symbol visibility 2967 changes. */ 2968 2969 if (info->shared) 2970 { 2971 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0 2972 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0 2973 || info->symbolic)) 2974 { 2975 struct ppc_dyn_relocs **pp; 2976 2977 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 2978 { 2979 p->count -= p->pc_count; 2980 p->pc_count = 0; 2981 if (p->count == 0) 2982 *pp = p->next; 2983 else 2984 pp = &p->next; 2985 } 2986 } 2987 } 2988 else 2989 { 2990 /* For the non-shared case, discard space for relocs against 2991 symbols which turn out to need copy relocs or are not 2992 dynamic. */ 2993 2994 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 2995 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 2996 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 2997 || (htab->elf.dynamic_sections_created 2998 && (h->root.type == bfd_link_hash_undefweak 2999 || h->root.type == bfd_link_hash_undefined)))) 3000 { 3001 /* Make sure this symbol is output as a dynamic symbol. 3002 Undefined weak syms won't yet be marked as dynamic. */ 3003 if (h->dynindx == -1 3004 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 3005 { 3006 if (! bfd_elf64_link_record_dynamic_symbol (info, h)) 3007 return false; 3008 } 3009 3010 /* If that succeeded, we know we'll be keeping all the 3011 relocs. */ 3012 if (h->dynindx != -1) 3013 goto keep; 3014 } 3015 3016 eh->dyn_relocs = NULL; 3017 3018 keep: ; 3019 } 3020 3021 /* Finally, allocate space. */ 3022 for (p = eh->dyn_relocs; p != NULL; p = p->next) 3023 { 3024 asection *sreloc = elf_section_data (p->sec)->sreloc; 3025 sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela); 3026 } 3027 3028 return true; 3029} 3030 3031/* Find any dynamic relocs that apply to read-only sections. */ 3032 3033static boolean 3034readonly_dynrelocs (h, inf) 3035 struct elf_link_hash_entry *h; 3036 PTR inf; 3037{ 3038 struct ppc_link_hash_entry *eh; 3039 struct ppc_dyn_relocs *p; 3040 3041 if (h->root.type == bfd_link_hash_warning) 3042 h = (struct elf_link_hash_entry *) h->root.u.i.link; 3043 3044 eh = (struct ppc_link_hash_entry *) h; 3045 for (p = eh->dyn_relocs; p != NULL; p = p->next) 3046 { 3047 asection *s = p->sec->output_section; 3048 3049 if (s != NULL && (s->flags & SEC_READONLY) != 0) 3050 { 3051 struct bfd_link_info *info = (struct bfd_link_info *) inf; 3052 3053 info->flags |= DF_TEXTREL; 3054 3055 /* Not an error, just cut short the traversal. */ 3056 return false; 3057 } 3058 } 3059 return true; 3060} 3061 3062/* Set the sizes of the dynamic sections. */ 3063 3064static boolean 3065ppc64_elf_size_dynamic_sections (output_bfd, info) 3066 bfd *output_bfd ATTRIBUTE_UNUSED; 3067 struct bfd_link_info *info; 3068{ 3069 struct ppc_link_hash_table *htab; 3070 bfd *dynobj; 3071 asection *s; 3072 boolean relocs; 3073 bfd *ibfd; 3074 3075 htab = ppc_hash_table (info); 3076 dynobj = htab->elf.dynobj; 3077 if (dynobj == NULL) 3078 abort (); 3079 3080 if (htab->elf.dynamic_sections_created) 3081 { 3082 /* Set the contents of the .interp section to the interpreter. */ 3083 if (! info->shared) 3084 { 3085 s = bfd_get_section_by_name (dynobj, ".interp"); 3086 if (s == NULL) 3087 abort (); 3088 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; 3089 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 3090 } 3091 } 3092 3093 /* Set up .got offsets for local syms, and space for local dynamic 3094 relocs. */ 3095 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) 3096 { 3097 bfd_signed_vma *local_got; 3098 bfd_signed_vma *end_local_got; 3099 bfd_size_type locsymcount; 3100 Elf_Internal_Shdr *symtab_hdr; 3101 asection *srel; 3102 3103 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 3104 continue; 3105 3106 for (s = ibfd->sections; s != NULL; s = s->next) 3107 { 3108 struct ppc_dyn_relocs *p; 3109 3110 for (p = *((struct ppc_dyn_relocs **) 3111 &elf_section_data (s)->local_dynrel); 3112 p != NULL; 3113 p = p->next) 3114 { 3115 if (!bfd_is_abs_section (p->sec) 3116 && bfd_is_abs_section (p->sec->output_section)) 3117 { 3118 /* Input section has been discarded, either because 3119 it is a copy of a linkonce section or due to 3120 linker script /DISCARD/, so we'll be discarding 3121 the relocs too. */ 3122 } 3123 else if (p->count != 0) 3124 { 3125 srel = elf_section_data (p->sec)->sreloc; 3126 srel->_raw_size += p->count * sizeof (Elf64_External_Rela); 3127 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 3128 info->flags |= DF_TEXTREL; 3129 } 3130 } 3131 } 3132 3133 local_got = elf_local_got_refcounts (ibfd); 3134 if (!local_got) 3135 continue; 3136 3137 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 3138 locsymcount = symtab_hdr->sh_info; 3139 end_local_got = local_got + locsymcount; 3140 s = htab->sgot; 3141 srel = htab->srelgot; 3142 for (; local_got < end_local_got; ++local_got) 3143 { 3144 if (*local_got > 0) 3145 { 3146 *local_got = s->_raw_size; 3147 s->_raw_size += 8; 3148 if (info->shared) 3149 srel->_raw_size += sizeof (Elf64_External_Rela); 3150 } 3151 else 3152 *local_got = (bfd_vma) -1; 3153 } 3154 } 3155 3156 /* Allocate global sym .plt and .got entries, and space for global 3157 sym dynamic relocs. */ 3158 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info); 3159 3160 /* We now have determined the sizes of the various dynamic sections. 3161 Allocate memory for them. */ 3162 relocs = false; 3163 for (s = dynobj->sections; s != NULL; s = s->next) 3164 { 3165 bfd_vma size; 3166 3167 if ((s->flags & SEC_LINKER_CREATED) == 0) 3168 continue; 3169 3170 if (s == htab->splt 3171 || s == htab->sgot 3172 || s == htab->sstub 3173 || s == htab->sglink) 3174 { 3175 /* Strip this section if we don't need it; see the 3176 comment below. */ 3177 } 3178 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0) 3179 { 3180 if (s->_raw_size == 0) 3181 { 3182 /* If we don't need this section, strip it from the 3183 output file. This is mostly to handle .rela.bss and 3184 .rela.plt. We must create both sections in 3185 create_dynamic_sections, because they must be created 3186 before the linker maps input sections to output 3187 sections. The linker does that before 3188 adjust_dynamic_symbol is called, and it is that 3189 function which decides whether anything needs to go 3190 into these sections. */ 3191 } 3192 else 3193 { 3194 if (s != htab->srelplt) 3195 relocs = true; 3196 3197 /* We use the reloc_count field as a counter if we need 3198 to copy relocs into the output file. */ 3199 s->reloc_count = 0; 3200 } 3201 } 3202 else 3203 { 3204 /* It's not one of our sections, so don't allocate space. */ 3205 continue; 3206 } 3207 3208 if (s->_raw_size == 0) 3209 { 3210 _bfd_strip_section_from_output (info, s); 3211 continue; 3212 } 3213 3214 /* Allocate memory for the section contents. We use bfd_zalloc 3215 here in case unused entries are not reclaimed before the 3216 section's contents are written out. This should not happen, 3217 but this way if it does, we get a R_PPC64_NONE reloc instead 3218 of garbage. */ 3219 size = s->_raw_size; 3220 if (s == htab->sstub) 3221 { 3222 /* .stub may grow. Allocate enough for the maximum growth. */ 3223 size += (size + 65536 + 65535) / 65536 * 4; 3224 } 3225 s->contents = (bfd_byte *) bfd_zalloc (dynobj, size); 3226 if (s->contents == NULL) 3227 return false; 3228 } 3229 3230 if (htab->elf.dynamic_sections_created) 3231 { 3232 /* Add some entries to the .dynamic section. We fill in the 3233 values later, in ppc64_elf_finish_dynamic_sections, but we 3234 must add the entries now so that we get the correct size for 3235 the .dynamic section. The DT_DEBUG entry is filled in by the 3236 dynamic linker and used by the debugger. */ 3237#define add_dynamic_entry(TAG, VAL) \ 3238 bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL)) 3239 3240 if (!info->shared) 3241 { 3242 if (!add_dynamic_entry (DT_DEBUG, 0)) 3243 return false; 3244 } 3245 3246 if (htab->splt->_raw_size != 0) 3247 { 3248 if (!add_dynamic_entry (DT_PLTGOT, 0) 3249 || !add_dynamic_entry (DT_PLTRELSZ, 0) 3250 || !add_dynamic_entry (DT_PLTREL, DT_RELA) 3251 || !add_dynamic_entry (DT_JMPREL, 0) 3252 || !add_dynamic_entry (DT_PPC64_GLINK, 0)) 3253 return false; 3254 } 3255 3256 if (NO_OPD_RELOCS) 3257 { 3258 if (!add_dynamic_entry (DT_PPC64_OPD, 0) 3259 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0)) 3260 return false; 3261 } 3262 3263 if (relocs) 3264 { 3265 if (!add_dynamic_entry (DT_RELA, 0) 3266 || !add_dynamic_entry (DT_RELASZ, 0) 3267 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela))) 3268 return false; 3269 3270 /* If any dynamic relocs apply to a read-only section, 3271 then we need a DT_TEXTREL entry. */ 3272 if ((info->flags & DF_TEXTREL) == 0) 3273 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, 3274 (PTR) info); 3275 3276 if ((info->flags & DF_TEXTREL) != 0) 3277 { 3278 if (!add_dynamic_entry (DT_TEXTREL, 0)) 3279 return false; 3280 } 3281 } 3282 } 3283#undef add_dynamic_entry 3284 3285 return true; 3286} 3287 3288/* Called after we have seen all the input files/sections, but before 3289 final symbol resolution and section placement has been determined. 3290 3291 We use this hook to provide a value for TOCstart, which we store in 3292 the output bfd elf_gp. */ 3293 3294boolean 3295ppc64_elf_set_toc (obfd, info) 3296 bfd *obfd; 3297 struct bfd_link_info *info; 3298{ 3299 if (!info->relocateable) 3300 { 3301 asection *s; 3302 bfd_vma TOCstart; 3303 3304 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that 3305 order. The TOC starts where the first of these sections starts. */ 3306 s = bfd_get_section_by_name (obfd, ".got"); 3307 if (s == NULL) 3308 s = bfd_get_section_by_name (obfd, ".toc"); 3309 if (s == NULL) 3310 s = bfd_get_section_by_name (obfd, ".tocbss"); 3311 if (s == NULL) 3312 s = bfd_get_section_by_name (obfd, ".plt"); 3313 if (s == NULL) 3314 { 3315 /* This may happen for 3316 o references to TOC base (SYM@toc / TOC[tc0]) without a 3317 .toc directive 3318 o bad linker script 3319 o --gc-sections and empty TOC sections 3320 3321 FIXME: Warn user? */ 3322 3323 /* Look for a likely section. We probably won't even be 3324 using TOCstart. */ 3325 for (s = obfd->sections; s != NULL; s = s->next) 3326 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY)) 3327 == (SEC_ALLOC | SEC_SMALL_DATA)) 3328 break; 3329 if (s == NULL) 3330 for (s = obfd->sections; s != NULL; s = s->next) 3331 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA)) 3332 == (SEC_ALLOC | SEC_SMALL_DATA)) 3333 break; 3334 if (s == NULL) 3335 for (s = obfd->sections; s != NULL; s = s->next) 3336 if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC) 3337 break; 3338 if (s == NULL) 3339 for (s = obfd->sections; s != NULL; s = s->next) 3340 if ((s->flags & SEC_ALLOC) == SEC_ALLOC) 3341 break; 3342 } 3343 3344 TOCstart = 0; 3345 if (s != NULL) 3346 TOCstart = s->output_section->vma + s->output_offset; 3347 3348 elf_gp (obfd) = TOCstart; 3349 } 3350 return true; 3351} 3352 3353/* PowerPC64 .plt entries are 24 bytes long, which doesn't divide 3354 evenly into 64k. Sometimes with a large enough .plt, we'll need to 3355 use offsets differing in the high 16 bits when accessing a .plt 3356 entry from a .plt call stub. This function adjusts the size of 3357 .stub to accommodate the extra stub instruction needed in such 3358 cases. */ 3359 3360boolean 3361ppc64_elf_size_stubs (obfd, info, changed) 3362 bfd *obfd; 3363 struct bfd_link_info *info; 3364 int *changed; 3365{ 3366 struct ppc_link_hash_table *htab = ppc_hash_table (info); 3367 bfd_vma plt_offset, next_64k; 3368 long base, num, extra; 3369 3370 /* .plt and .stub should be both present, or both absent. */ 3371 if ((htab->splt == NULL || htab->splt->_raw_size == 0) 3372 != (htab->sstub == NULL || htab->sstub->_raw_size == 0)) 3373 abort (); 3374 3375 /* If no .plt, then nothing to do. */ 3376 if (htab->splt == NULL || htab->splt->_raw_size == 0) 3377 return true; 3378 3379 plt_offset = (htab->splt->output_section->vma 3380 + htab->splt->output_offset 3381 - elf_gp (obfd)); 3382 next_64k = (plt_offset + 65535) & -65536; 3383 3384 /* If the .plt doesn't have any entries crossing a 64k boundary, 3385 then there is no need for bigger stubs. */ 3386 if (plt_offset + htab->splt->_raw_size <= next_64k) 3387 return true; 3388 3389 /* OK, so we have at least one transition. Since .plt entries are 3390 24 bytes long, we'll strike it lucky every 3*64k, with the 64k 3391 boundary between .plt entries. */ 3392 base = next_64k / 65536; 3393 num = (plt_offset + htab->splt->_raw_size - next_64k) / 65536; 3394 extra = (base % 3 + num + 1) * 2 / 3; 3395 3396 /* Allow one extra instruction for each EXTRA. The change in .stub 3397 may change the location of .toc and .plt. .toc and .plt ought to 3398 move as a group, but someone might be playing with eg. .plt 3399 alignment, so don't allow .stub size to decrease. */ 3400 if (htab->sstub->_cooked_size < htab->sstub->_raw_size + extra * 4) 3401 { 3402 htab->sstub->_cooked_size = htab->sstub->_raw_size + extra * 4; 3403 *changed = true; 3404 } 3405 return true; 3406} 3407 3408/* Build a .plt call stub. */ 3409 3410static bfd_byte * 3411build_plt_stub (obfd, p, offset, glink) 3412 bfd *obfd; 3413 bfd_byte *p; 3414 int offset; 3415 int glink; 3416{ 3417#define PPC_LO(v) ((v) & 0xffff) 3418#define PPC_HI(v) (((v) >> 16) & 0xffff) 3419#define PPC_HA(v) PPC_HI ((v) + 0x8000) 3420 3421 if (glink) 3422 bfd_put_32 (obfd, LD_R2_40R1, p), p += 4; 3423 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4; 3424 if (!glink) 3425 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4; 3426 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4; 3427 if (PPC_HA (offset + 8) != PPC_HA (offset)) 3428 bfd_put_32 (obfd, ADDIS_R12_R12_1, p), p += 4; 3429 offset += 8; 3430 bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p), p += 4; 3431 if (PPC_HA (offset + 8) != PPC_HA (offset)) 3432 bfd_put_32 (obfd, ADDIS_R12_R12_1, p), p += 4; 3433 offset += 8; 3434 bfd_put_32 (obfd, MTCTR_R11, p), p += 4; 3435 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4; 3436 bfd_put_32 (obfd, BCTR, p), p += 4; 3437 return p; 3438} 3439 3440/* Build the stubs for one function call. */ 3441 3442static boolean 3443build_one_stub (h, inf) 3444 struct elf_link_hash_entry *h; 3445 PTR inf; 3446{ 3447 struct bfd_link_info *info; 3448 struct ppc_link_hash_table *htab; 3449 3450 if (h->root.type == bfd_link_hash_indirect 3451 || h->root.type == bfd_link_hash_warning) 3452 return true; 3453 3454 info = (struct bfd_link_info *) inf; 3455 htab = ppc_hash_table (info); 3456 3457 if (htab->elf.dynamic_sections_created 3458 && h->plt.offset != (bfd_vma) -1 3459 && ((struct ppc_link_hash_entry *) h)->is_func_descriptor) 3460 { 3461 struct elf_link_hash_entry *fh; 3462 asection *s; 3463 bfd_vma plt_r2; 3464 bfd_byte *p; 3465 unsigned int indx; 3466 3467 fh = elf_link_hash_lookup (&htab->elf, h->root.root.string - 1, 3468 false, false, true); 3469 3470 if (fh == NULL) 3471 abort (); 3472 3473 BFD_ASSERT (((struct ppc_link_hash_entry *) fh)->is_func); 3474 3475 /* Build the .plt call stub. */ 3476 plt_r2 = (htab->splt->output_section->vma 3477 + htab->splt->output_offset 3478 + h->plt.offset 3479 - elf_gp (htab->splt->output_section->owner) 3480 - TOC_BASE_OFF); 3481 3482 if (plt_r2 + 0x80000000 > 0xffffffff 3483 || (plt_r2 & 3) != 0) 3484 { 3485 (*_bfd_error_handler) 3486 (_("linkage table error against `%s'"), 3487 h->root.root.string); 3488 bfd_set_error (bfd_error_bad_value); 3489 htab->plt_overflow = true; 3490 return false; 3491 } 3492 3493 s = htab->sstub; 3494 /* Steal plt.offset to store the stub offset. */ 3495 fh->plt.offset = s->_cooked_size; 3496 p = s->contents + s->_cooked_size; 3497 p = build_plt_stub (s->owner, p, (int) plt_r2, 0); 3498 s->_cooked_size = p - s->contents; 3499 3500 /* Build the .glink lazy link call stub. */ 3501 s = htab->sglink; 3502 p = s->contents + s->_cooked_size; 3503 indx = s->reloc_count; 3504 if (indx < 0x8000) 3505 { 3506 bfd_put_32 (s->owner, LI_R0_0 | indx, p); 3507 p += 4; 3508 } 3509 else 3510 { 3511 bfd_put_32 (s->owner, LIS_R0_0 | PPC_HI (indx), p); 3512 p += 4; 3513 bfd_put_32 (s->owner, ORI_R0_R0_0 | PPC_LO (indx), p); 3514 p += 4; 3515 } 3516 bfd_put_32 (s->owner, B_DOT | ((s->contents - p) & 0x3fffffc), p); 3517 p += 4; 3518 s->_cooked_size = p - s->contents; 3519 s->reloc_count += 1; 3520 } 3521 return true; 3522} 3523 3524boolean 3525ppc64_elf_build_stubs (obfd, info) 3526 bfd *obfd; 3527 struct bfd_link_info *info; 3528{ 3529 struct ppc_link_hash_table *htab = ppc_hash_table (info); 3530 bfd_vma old_stub_size; 3531 bfd_vma plt_r2; 3532 bfd_byte *p; 3533 3534 /* If no .plt stubs, then nothing to do. */ 3535 if (htab->sstub == NULL || htab->sstub->_raw_size == 0) 3536 return true; 3537 3538 old_stub_size = htab->sstub->_cooked_size; 3539 htab->sstub->_cooked_size = 0; 3540 3541 /* Build the .glink plt call stub. */ 3542 plt_r2 = (htab->splt->output_section->vma 3543 + htab->splt->output_offset 3544 - elf_gp (obfd) 3545 - TOC_BASE_OFF); 3546 p = htab->sglink->contents; 3547 p = build_plt_stub (htab->sglink->owner, p, (int) plt_r2, 1); 3548 while (p - htab->sglink->contents < GLINK_CALL_STUB_SIZE) 3549 { 3550 bfd_put_32 (htab->sglink->owner, NOP, p); 3551 p += 4; 3552 } 3553 htab->sglink->_cooked_size = p - htab->sglink->contents; 3554 3555 /* Use reloc_count to count entries. */ 3556 htab->sglink->reloc_count = 0; 3557 3558 elf_link_hash_traverse (&htab->elf, build_one_stub, (PTR) info); 3559 htab->sglink->reloc_count = 0; 3560 3561 if (htab->plt_overflow) 3562 return false; 3563 3564 if (old_stub_size != htab->sstub->_cooked_size 3565 || htab->sglink->_raw_size != htab->sglink->_cooked_size) 3566 { 3567 (*_bfd_error_handler) 3568 (_("stub section size doesn't match calculated size")); 3569 bfd_set_error (bfd_error_bad_value); 3570 return false; 3571 } 3572 return true; 3573} 3574 3575/* Set up any other section flags and such that may be necessary. */ 3576 3577static boolean 3578ppc64_elf_fake_sections (abfd, shdr, asect) 3579 bfd *abfd ATTRIBUTE_UNUSED; 3580 Elf64_Internal_Shdr *shdr; 3581 asection *asect; 3582{ 3583 if ((asect->flags & SEC_EXCLUDE) != 0) 3584 shdr->sh_flags |= SHF_EXCLUDE; 3585 3586 if ((asect->flags & SEC_SORT_ENTRIES) != 0) 3587 shdr->sh_type = SHT_ORDERED; 3588 3589 return true; 3590} 3591 3592/* The RELOCATE_SECTION function is called by the ELF backend linker 3593 to handle the relocations for a section. 3594 3595 The relocs are always passed as Rela structures; if the section 3596 actually uses Rel structures, the r_addend field will always be 3597 zero. 3598 3599 This function is responsible for adjust the section contents as 3600 necessary, and (if using Rela relocs and generating a 3601 relocateable output file) adjusting the reloc addend as 3602 necessary. 3603 3604 This function does not have to worry about setting the reloc 3605 address or the reloc symbol index. 3606 3607 LOCAL_SYMS is a pointer to the swapped in local symbols. 3608 3609 LOCAL_SECTIONS is an array giving the section in the input file 3610 corresponding to the st_shndx field of each local symbol. 3611 3612 The global hash table entry for the global symbols can be found 3613 via elf_sym_hashes (input_bfd). 3614 3615 When generating relocateable output, this function must handle 3616 STB_LOCAL/STT_SECTION symbols specially. The output symbol is 3617 going to be the section symbol corresponding to the output 3618 section, which means that the addend must be adjusted 3619 accordingly. */ 3620 3621static boolean 3622ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section, 3623 contents, relocs, local_syms, local_sections) 3624 bfd *output_bfd; 3625 struct bfd_link_info *info; 3626 bfd *input_bfd; 3627 asection *input_section; 3628 bfd_byte *contents; 3629 Elf_Internal_Rela *relocs; 3630 Elf_Internal_Sym *local_syms; 3631 asection **local_sections; 3632{ 3633 struct ppc_link_hash_table *htab; 3634 Elf_Internal_Shdr *symtab_hdr; 3635 struct elf_link_hash_entry **sym_hashes; 3636 Elf_Internal_Rela *rel; 3637 Elf_Internal_Rela *relend; 3638 bfd_vma *local_got_offsets; 3639 bfd_vma TOCstart; 3640 boolean ret = true; 3641 boolean is_opd; 3642 /* Disabled until we sort out how ld should choose 'y' vs 'at'. */ 3643 boolean is_power4 = false; 3644 3645 /* Initialize howto table if needed. */ 3646 if (!ppc64_elf_howto_table[R_PPC64_ADDR32]) 3647 ppc_howto_init (); 3648 3649 htab = ppc_hash_table (info); 3650 local_got_offsets = elf_local_got_offsets (input_bfd); 3651 TOCstart = elf_gp (output_bfd); 3652 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 3653 sym_hashes = elf_sym_hashes (input_bfd); 3654 is_opd = strcmp (bfd_get_section_name (abfd, input_section), ".opd") == 0; 3655 3656 rel = relocs; 3657 relend = relocs + input_section->reloc_count; 3658 for (; rel < relend; rel++) 3659 { 3660 enum elf_ppc_reloc_type r_type; 3661 bfd_vma offset; 3662 bfd_vma addend; 3663 bfd_reloc_status_type r; 3664 Elf_Internal_Sym *sym; 3665 asection *sec; 3666 struct elf_link_hash_entry *h; 3667 const char *sym_name; 3668 unsigned long r_symndx; 3669 bfd_vma relocation; 3670 boolean unresolved_reloc; 3671 boolean has_nop; 3672 long insn; 3673 3674 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info); 3675 r_symndx = ELF64_R_SYM (rel->r_info); 3676 3677 if (info->relocateable) 3678 { 3679 /* This is a relocatable link. We don't have to change 3680 anything, unless the reloc is against a section symbol, 3681 in which case we have to adjust according to where the 3682 section symbol winds up in the output section. */ 3683 if (r_symndx < symtab_hdr->sh_info) 3684 { 3685 sym = local_syms + r_symndx; 3686 if ((unsigned) ELF_ST_TYPE (sym->st_info) == STT_SECTION) 3687 { 3688 sec = local_sections[r_symndx]; 3689 rel->r_addend += sec->output_offset + sym->st_value; 3690 } 3691 } 3692 continue; 3693 } 3694 3695 /* This is a final link. */ 3696 3697 offset = rel->r_offset; 3698 addend = rel->r_addend; 3699 r = bfd_reloc_other; 3700 sym = (Elf_Internal_Sym *) 0; 3701 sec = (asection *) 0; 3702 h = (struct elf_link_hash_entry *) 0; 3703 sym_name = (const char *) 0; 3704 unresolved_reloc = false; 3705 3706 if (r_type == R_PPC64_TOC) 3707 { 3708 /* Relocation value is TOC base. Symbol is ignored. */ 3709 relocation = TOCstart + TOC_BASE_OFF; 3710 } 3711 else if (r_symndx < symtab_hdr->sh_info) 3712 { 3713 /* It's a local symbol. */ 3714 sym = local_syms + r_symndx; 3715 sec = local_sections[r_symndx]; 3716 sym_name = "<local symbol>"; 3717 3718 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); 3719 addend = rel->r_addend; 3720 } 3721 else 3722 { 3723 /* It's a global symbol. */ 3724 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 3725 while (h->root.type == bfd_link_hash_indirect 3726 || h->root.type == bfd_link_hash_warning) 3727 h = (struct elf_link_hash_entry *) h->root.u.i.link; 3728 sym_name = h->root.root.string; 3729 relocation = 0; 3730 if (h->root.type == bfd_link_hash_defined 3731 || h->root.type == bfd_link_hash_defweak) 3732 { 3733 sec = h->root.u.def.section; 3734 if (sec->output_section == NULL) 3735 /* Set a flag that will be cleared later if we find a 3736 relocation value for this symbol. output_section 3737 is typically NULL for symbols satisfied by a shared 3738 library. */ 3739 unresolved_reloc = true; 3740 else 3741 relocation = (h->root.u.def.value 3742 + sec->output_section->vma 3743 + sec->output_offset); 3744 } 3745 else if (h->root.type == bfd_link_hash_undefweak) 3746 ; 3747 else if (info->shared 3748 && (!info->symbolic || info->allow_shlib_undefined) 3749 && !info->no_undefined 3750 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 3751 ; 3752 else 3753 { 3754 if (! ((*info->callbacks->undefined_symbol) 3755 (info, h->root.root.string, input_bfd, input_section, 3756 offset, (!info->shared 3757 || info->no_undefined 3758 || ELF_ST_VISIBILITY (h->other))))) 3759 return false; 3760 } 3761 } 3762 3763 /* First handle relocations that tweak non-addend part of insn. */ 3764 insn = 0; 3765 switch (r_type) 3766 { 3767 default: 3768 break; 3769 3770 /* Branch taken prediction relocations. */ 3771 case R_PPC64_ADDR14_BRTAKEN: 3772 case R_PPC64_REL14_BRTAKEN: 3773 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */ 3774 /* Fall thru. */ 3775 3776 /* Branch not taken prediction relocations. */ 3777 case R_PPC64_ADDR14_BRNTAKEN: 3778 case R_PPC64_REL14_BRNTAKEN: 3779 insn |= bfd_get_32 (output_bfd, contents + offset) & ~(0x01 << 21); 3780 if (is_power4) 3781 { 3782 /* Set 'a' bit. This is 0b00010 in BO field for branch 3783 on CR(BI) insns (BO == 001at or 011at), and 0b01000 3784 for branch on CTR insns (BO == 1a00t or 1a01t). */ 3785 if ((insn & (0x14 << 21)) == (0x04 << 21)) 3786 insn |= 0x02 << 21; 3787 else if ((insn & (0x14 << 21)) == (0x10 << 21)) 3788 insn |= 0x08 << 21; 3789 else 3790 break; 3791 } 3792 else 3793 { 3794 /* Invert 'y' bit if not the default. */ 3795 if ((bfd_signed_vma) (relocation - offset) < 0) 3796 insn ^= 0x01 << 21; 3797 } 3798 3799 bfd_put_32 (output_bfd, (bfd_vma) insn, contents + offset); 3800 break; 3801 3802 case R_PPC64_REL24: 3803 case R_PPC64_ADDR24: 3804 /* An ADDR24 or REL24 branching to a linkage function may be 3805 followed by a nop that we have to replace with a ld in 3806 order to restore the TOC base pointer. Only calls to 3807 shared objects need to alter the TOC base. These are 3808 recognized by their need for a PLT entry. */ 3809 has_nop = 0; 3810 if (h != NULL 3811 && h->plt.offset != (bfd_vma) -1 3812 && htab->sstub != NULL) 3813 { 3814 /* plt.offset here is the offset into the stub section. */ 3815 relocation = (htab->sstub->output_section->vma 3816 + htab->sstub->output_offset 3817 + h->plt.offset); 3818 unresolved_reloc = false; 3819 3820 /* Make sure that there really is an instruction after 3821 the branch that we can decode. */ 3822 if (offset + 8 <= input_section->_cooked_size) 3823 { 3824 bfd_byte *pnext; 3825 3826 pnext = contents + offset + 4; 3827 insn = bfd_get_32 (input_bfd, pnext); 3828 3829 if (insn == 0x60000000 /* nop (ori r0,r0,0) */ 3830 || insn == 0x4def7b82 /* cror 15,15,15 */ 3831 || insn == 0x4ffffb82) /* cror 31,31,31 */ 3832 { 3833 bfd_put_32 (input_bfd, 3834 (bfd_vma) 0xe8410028, /* ld r2,40(r1) */ 3835 pnext); 3836 has_nop = 1; 3837 } 3838 } 3839 } 3840 3841 if (h != NULL 3842 && h->root.type == bfd_link_hash_undefweak 3843 && r_type == R_PPC64_REL24 3844 && addend == 0 3845 && relocation == 0) 3846 { 3847 /* Tweak calls to undefined weak functions to behave as 3848 if the "called" function immediately returns. We can 3849 thus call to a weak function without first checking 3850 whether the function is defined. */ 3851 relocation = 4; 3852 if (has_nop) 3853 relocation = 8; 3854 } 3855 break; 3856 } 3857 3858 /* Set `addend'. */ 3859 switch (r_type) 3860 { 3861 default: 3862 (*_bfd_error_handler) 3863 (_("%s: unknown relocation type %d for symbol %s"), 3864 bfd_archive_filename (input_bfd), (int) r_type, sym_name); 3865 3866 bfd_set_error (bfd_error_bad_value); 3867 ret = false; 3868 continue; 3869 3870 case R_PPC64_NONE: 3871 case R_PPC_GNU_VTINHERIT: 3872 case R_PPC_GNU_VTENTRY: 3873 continue; 3874 3875 /* GOT16 relocations. Like an ADDR16 using the symbol's 3876 address in the GOT as relocation value instead of the 3877 symbols value itself. Also, create a GOT entry for the 3878 symbol and put the symbol value there. */ 3879 case R_PPC64_GOT16: 3880 case R_PPC64_GOT16_LO: 3881 case R_PPC64_GOT16_HI: 3882 case R_PPC64_GOT16_HA: 3883 case R_PPC64_GOT16_DS: 3884 case R_PPC64_GOT16_LO_DS: 3885 { 3886 /* Relocation is to the entry for this symbol in the global 3887 offset table. */ 3888 bfd_vma off; 3889 3890 if (htab->sgot == NULL) 3891 abort (); 3892 3893 if (h != NULL) 3894 { 3895 boolean dyn; 3896 3897 off = h->got.offset; 3898 dyn = htab->elf.dynamic_sections_created; 3899 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h) 3900 || (info->shared 3901 && (info->symbolic 3902 || h->dynindx == -1 3903 || (h->elf_link_hash_flags 3904 & ELF_LINK_FORCED_LOCAL)) 3905 && (h->elf_link_hash_flags 3906 & ELF_LINK_HASH_DEF_REGULAR))) 3907 { 3908 /* This is actually a static link, or it is a 3909 -Bsymbolic link and the symbol is defined 3910 locally, or the symbol was forced to be local 3911 because of a version file. We must initialize 3912 this entry in the global offset table. Since the 3913 offset must always be a multiple of 8, we use the 3914 least significant bit to record whether we have 3915 initialized it already. 3916 3917 When doing a dynamic link, we create a .rel.got 3918 relocation entry to initialize the value. This 3919 is done in the finish_dynamic_symbol routine. */ 3920 if ((off & 1) != 0) 3921 off &= ~1; 3922 else 3923 { 3924 bfd_put_64 (output_bfd, relocation, 3925 htab->sgot->contents + off); 3926 h->got.offset |= 1; 3927 } 3928 } 3929 else 3930 unresolved_reloc = false; 3931 } 3932 else 3933 { 3934 if (local_got_offsets == NULL) 3935 abort (); 3936 3937 off = local_got_offsets[r_symndx]; 3938 3939 /* The offset must always be a multiple of 8. We use 3940 the least significant bit to record whether we have 3941 already processed this entry. */ 3942 if ((off & 1) != 0) 3943 off &= ~1; 3944 else 3945 { 3946 bfd_put_64 (output_bfd, relocation, 3947 htab->sgot->contents + off); 3948 3949 if (info->shared) 3950 { 3951 Elf_Internal_Rela outrel; 3952 Elf64_External_Rela *loc; 3953 3954 /* We need to generate a R_PPC64_RELATIVE reloc 3955 for the dynamic linker. */ 3956 outrel.r_offset = (htab->sgot->output_section->vma 3957 + htab->sgot->output_offset 3958 + off); 3959 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 3960 outrel.r_addend = relocation; 3961 loc = (Elf64_External_Rela *) htab->srelgot->contents; 3962 loc += htab->srelgot->reloc_count++; 3963 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); 3964 } 3965 3966 local_got_offsets[r_symndx] |= 1; 3967 } 3968 } 3969 3970 if (off >= (bfd_vma) -2) 3971 abort (); 3972 3973 relocation = htab->sgot->output_offset + off; 3974 3975 /* TOC base (r2) is TOC start plus 0x8000. */ 3976 addend -= TOC_BASE_OFF; 3977 } 3978 break; 3979 3980 case R_PPC64_PLT16_HA: 3981 case R_PPC64_PLT16_HI: 3982 case R_PPC64_PLT16_LO: 3983 case R_PPC64_PLT32: 3984 case R_PPC64_PLT64: 3985 /* Relocation is to the entry for this symbol in the 3986 procedure linkage table. */ 3987 3988 /* Resolve a PLT reloc against a local symbol directly, 3989 without using the procedure linkage table. */ 3990 if (h == NULL) 3991 break; 3992 3993 if (h->plt.offset == (bfd_vma) -1 3994 || htab->splt == NULL) 3995 { 3996 /* We didn't make a PLT entry for this symbol. This 3997 happens when statically linking PIC code, or when 3998 using -Bsymbolic. */ 3999 break; 4000 } 4001 4002 relocation = (htab->splt->output_section->vma 4003 + htab->splt->output_offset 4004 + h->plt.offset); 4005 unresolved_reloc = false; 4006 break; 4007 4008 /* TOC16 relocs. We want the offset relative to the TOC base, 4009 which is the address of the start of the TOC plus 0x8000. 4010 The TOC consists of sections .got, .toc, .tocbss, and .plt, 4011 in this order. */ 4012 case R_PPC64_TOC16: 4013 case R_PPC64_TOC16_LO: 4014 case R_PPC64_TOC16_HI: 4015 case R_PPC64_TOC16_DS: 4016 case R_PPC64_TOC16_LO_DS: 4017 case R_PPC64_TOC16_HA: 4018 addend -= TOCstart + TOC_BASE_OFF; 4019 break; 4020 4021 /* Relocate against the beginning of the section. */ 4022 case R_PPC64_SECTOFF: 4023 case R_PPC64_SECTOFF_LO: 4024 case R_PPC64_SECTOFF_HI: 4025 case R_PPC64_SECTOFF_DS: 4026 case R_PPC64_SECTOFF_LO_DS: 4027 case R_PPC64_SECTOFF_HA: 4028 if (sec != (asection *) 0) 4029 addend -= sec->output_section->vma; 4030 break; 4031 4032 case R_PPC64_REL24: 4033 break; 4034 4035 /* Relocations that may need to be propagated if this is a 4036 dynamic object. */ 4037 case R_PPC64_REL14: 4038 case R_PPC64_REL14_BRNTAKEN: 4039 case R_PPC64_REL14_BRTAKEN: 4040 case R_PPC64_REL32: 4041 case R_PPC64_REL64: 4042 case R_PPC64_ADDR14: 4043 case R_PPC64_ADDR14_BRNTAKEN: 4044 case R_PPC64_ADDR14_BRTAKEN: 4045 case R_PPC64_ADDR16: 4046 case R_PPC64_ADDR16_DS: 4047 case R_PPC64_ADDR16_HA: 4048 case R_PPC64_ADDR16_HI: 4049 case R_PPC64_ADDR16_HIGHER: 4050 case R_PPC64_ADDR16_HIGHERA: 4051 case R_PPC64_ADDR16_HIGHEST: 4052 case R_PPC64_ADDR16_HIGHESTA: 4053 case R_PPC64_ADDR16_LO: 4054 case R_PPC64_ADDR16_LO_DS: 4055 case R_PPC64_ADDR24: 4056 case R_PPC64_ADDR30: 4057 case R_PPC64_ADDR32: 4058 case R_PPC64_ADDR64: 4059 case R_PPC64_UADDR16: 4060 case R_PPC64_UADDR32: 4061 case R_PPC64_UADDR64: 4062 /* r_symndx will be zero only for relocs against symbols 4063 from removed linkonce sections, or sections discarded by 4064 a linker script. */ 4065 if (r_symndx == 0) 4066 break; 4067 /* Fall thru. */ 4068 4069 case R_PPC64_TOC: 4070 if ((input_section->flags & SEC_ALLOC) == 0) 4071 break; 4072 4073 if (NO_OPD_RELOCS && is_opd) 4074 break; 4075 4076 if ((info->shared 4077 && (IS_ABSOLUTE_RELOC (r_type) 4078 || (h != NULL 4079 && h->dynindx != -1 4080 && (! info->symbolic 4081 || (h->elf_link_hash_flags 4082 & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 4083 || (!info->shared 4084 && h != NULL 4085 && h->dynindx != -1 4086 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 4087 && (((h->elf_link_hash_flags 4088 & ELF_LINK_HASH_DEF_DYNAMIC) != 0 4089 && (h->elf_link_hash_flags 4090 & ELF_LINK_HASH_DEF_REGULAR) == 0) 4091 || h->root.type == bfd_link_hash_undefweak 4092 || h->root.type == bfd_link_hash_undefined))) 4093 { 4094 Elf_Internal_Rela outrel; 4095 boolean skip, relocate; 4096 asection *sreloc; 4097 Elf64_External_Rela *loc; 4098 4099 /* When generating a dynamic object, these relocations 4100 are copied into the output file to be resolved at run 4101 time. */ 4102 4103 skip = false; 4104 relocate = false; 4105 4106 outrel.r_offset = 4107 _bfd_elf_section_offset (output_bfd, info, input_section, 4108 rel->r_offset); 4109 if (outrel.r_offset == (bfd_vma) -1) 4110 skip = true; 4111 else if (outrel.r_offset == (bfd_vma) -2) 4112 skip = true, relocate = true; 4113 outrel.r_offset += (input_section->output_section->vma 4114 + input_section->output_offset); 4115 outrel.r_addend = addend; 4116 4117 if (skip) 4118 memset (&outrel, 0, sizeof outrel); 4119 else if (h != NULL 4120 && h->dynindx != -1 4121 && !is_opd 4122 && (!IS_ABSOLUTE_RELOC (r_type) 4123 || !info->shared 4124 || !info->symbolic 4125 || (h->elf_link_hash_flags 4126 & ELF_LINK_HASH_DEF_REGULAR) == 0)) 4127 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type); 4128 else 4129 { 4130 /* This symbol is local, or marked to become local, 4131 or this is an opd section reloc which must point 4132 at a local function. */ 4133 outrel.r_addend += relocation; 4134 relocate = true; 4135 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC) 4136 { 4137 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 4138 } 4139 else 4140 { 4141 long indx = 0; 4142 4143 if (bfd_is_abs_section (sec)) 4144 ; 4145 else if (sec == NULL || sec->owner == NULL) 4146 { 4147 bfd_set_error (bfd_error_bad_value); 4148 return false; 4149 } 4150 else 4151 { 4152 asection *osec; 4153 4154 osec = sec->output_section; 4155 indx = elf_section_data (osec)->dynindx; 4156 4157 /* We are turning this relocation into one 4158 against a section symbol, so subtract out 4159 the output section's address but not the 4160 offset of the input section in the output 4161 section. */ 4162 outrel.r_addend -= osec->vma; 4163 } 4164 4165 outrel.r_info = ELF64_R_INFO (indx, r_type); 4166 } 4167 } 4168 4169 sreloc = elf_section_data (input_section)->sreloc; 4170 if (sreloc == NULL) 4171 abort (); 4172 4173 loc = (Elf64_External_Rela *) sreloc->contents; 4174 loc += sreloc->reloc_count++; 4175 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); 4176 4177 /* If this reloc is against an external symbol, it will 4178 be computed at runtime, so there's no need to do 4179 anything now. */ 4180 if (! relocate) 4181 continue; 4182 } 4183 break; 4184 4185 case R_PPC64_COPY: 4186 case R_PPC64_GLOB_DAT: 4187 case R_PPC64_JMP_SLOT: 4188 case R_PPC64_RELATIVE: 4189 /* We shouldn't ever see these dynamic relocs in relocatable 4190 files. */ 4191 /* Fall thru */ 4192 4193 case R_PPC64_PLTGOT16: 4194 case R_PPC64_PLTGOT16_DS: 4195 case R_PPC64_PLTGOT16_HA: 4196 case R_PPC64_PLTGOT16_HI: 4197 case R_PPC64_PLTGOT16_LO: 4198 case R_PPC64_PLTGOT16_LO_DS: 4199 case R_PPC64_PLTREL32: 4200 case R_PPC64_PLTREL64: 4201 /* These ones haven't been implemented yet. */ 4202 4203 (*_bfd_error_handler) 4204 (_("%s: Relocation %s is not supported for symbol %s."), 4205 bfd_archive_filename (input_bfd), 4206 ppc64_elf_howto_table[(int) r_type]->name, sym_name); 4207 4208 bfd_set_error (bfd_error_invalid_operation); 4209 ret = false; 4210 continue; 4211 } 4212 4213 /* Do any further special processing. */ 4214 switch (r_type) 4215 { 4216 default: 4217 break; 4218 4219 case R_PPC64_ADDR16_HA: 4220 case R_PPC64_ADDR16_HIGHERA: 4221 case R_PPC64_ADDR16_HIGHESTA: 4222 case R_PPC64_PLT16_HA: 4223 case R_PPC64_TOC16_HA: 4224 case R_PPC64_SECTOFF_HA: 4225 /* It's just possible that this symbol is a weak symbol 4226 that's not actually defined anywhere. In that case, 4227 'sec' would be NULL, and we should leave the symbol 4228 alone (it will be set to zero elsewhere in the link). */ 4229 if (sec != NULL) 4230 /* Add 0x10000 if sign bit in 0:15 is set. */ 4231 addend += ((relocation + addend) & 0x8000) << 1; 4232 break; 4233 4234 case R_PPC64_ADDR16_DS: 4235 case R_PPC64_ADDR16_LO_DS: 4236 case R_PPC64_GOT16_DS: 4237 case R_PPC64_GOT16_LO_DS: 4238 case R_PPC64_PLT16_LO_DS: 4239 case R_PPC64_SECTOFF_DS: 4240 case R_PPC64_SECTOFF_LO_DS: 4241 case R_PPC64_TOC16_DS: 4242 case R_PPC64_TOC16_LO_DS: 4243 case R_PPC64_PLTGOT16_DS: 4244 case R_PPC64_PLTGOT16_LO_DS: 4245 if (((relocation + addend) & 3) != 0) 4246 { 4247 (*_bfd_error_handler) 4248 (_("%s: error: relocation %s not a multiple of 4"), 4249 bfd_archive_filename (input_bfd), 4250 ppc64_elf_howto_table[(int) r_type]->name); 4251 bfd_set_error (bfd_error_bad_value); 4252 ret = false; 4253 continue; 4254 } 4255 break; 4256 } 4257 4258 /* FIXME: Why do we allow debugging sections to escape this error? 4259 More importantly, why do we not emit dynamic relocs above in 4260 debugging sections (which are ! SEC_ALLOC)? If we had 4261 emitted the dynamic reloc, we could remove the fudge here. */ 4262 if (unresolved_reloc 4263 && !(info->shared 4264 && (input_section->flags & SEC_DEBUGGING) != 0 4265 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0)) 4266 (*_bfd_error_handler) 4267 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"), 4268 bfd_archive_filename (input_bfd), 4269 bfd_get_section_name (input_bfd, input_section), 4270 (long) rel->r_offset, 4271 h->root.root.string); 4272 4273 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type], 4274 input_bfd, 4275 input_section, 4276 contents, 4277 offset, 4278 relocation, 4279 addend); 4280 4281 if (r == bfd_reloc_ok) 4282 ; 4283 else if (r == bfd_reloc_overflow) 4284 { 4285 const char *name; 4286 4287 if (h != NULL) 4288 { 4289 if (h->root.type == bfd_link_hash_undefweak 4290 && ppc64_elf_howto_table[(int) r_type]->pc_relative) 4291 { 4292 /* Assume this is a call protected by other code that 4293 detects the symbol is undefined. If this is the case, 4294 we can safely ignore the overflow. If not, the 4295 program is hosed anyway, and a little warning isn't 4296 going to help. */ 4297 4298 continue; 4299 } 4300 4301 name = h->root.root.string; 4302 } 4303 else 4304 { 4305 name = bfd_elf_string_from_elf_section (input_bfd, 4306 symtab_hdr->sh_link, 4307 sym->st_name); 4308 if (name == NULL) 4309 continue; 4310 if (*name == '\0') 4311 name = bfd_section_name (input_bfd, sec); 4312 } 4313 4314 if (! ((*info->callbacks->reloc_overflow) 4315 (info, name, ppc64_elf_howto_table[(int) r_type]->name, 4316 (bfd_vma) 0, input_bfd, input_section, offset))) 4317 return false; 4318 } 4319 else 4320 ret = false; 4321 } 4322 4323 return ret; 4324} 4325 4326/* Finish up dynamic symbol handling. We set the contents of various 4327 dynamic sections here. */ 4328 4329static boolean 4330ppc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym) 4331 bfd *output_bfd; 4332 struct bfd_link_info *info; 4333 struct elf_link_hash_entry *h; 4334 Elf_Internal_Sym *sym; 4335{ 4336 struct ppc_link_hash_table *htab; 4337 bfd *dynobj; 4338 4339 htab = ppc_hash_table (info); 4340 dynobj = htab->elf.dynobj; 4341 4342 if (h->plt.offset != (bfd_vma) -1 4343 && ((struct ppc_link_hash_entry *) h)->is_func_descriptor) 4344 { 4345 Elf_Internal_Rela rela; 4346 Elf64_External_Rela *loc; 4347 4348 /* This symbol has an entry in the procedure linkage table. Set 4349 it up. */ 4350 4351 if (htab->splt == NULL 4352 || htab->srelplt == NULL 4353 || htab->sglink == NULL) 4354 abort (); 4355 4356 /* Create a JMP_SLOT reloc to inform the dynamic linker to 4357 fill in the PLT entry. */ 4358 4359 rela.r_offset = (htab->splt->output_section->vma 4360 + htab->splt->output_offset 4361 + h->plt.offset); 4362 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT); 4363 rela.r_addend = 0; 4364 4365 loc = (Elf64_External_Rela *) htab->srelplt->contents; 4366 loc += (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE; 4367 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); 4368 } 4369 4370 if (h->got.offset != (bfd_vma) -1) 4371 { 4372 Elf_Internal_Rela rela; 4373 Elf64_External_Rela *loc; 4374 4375 /* This symbol has an entry in the global offset table. Set it 4376 up. */ 4377 4378 if (htab->sgot == NULL || htab->srelgot == NULL) 4379 abort (); 4380 4381 rela.r_offset = (htab->sgot->output_section->vma 4382 + htab->sgot->output_offset 4383 + (h->got.offset &~ (bfd_vma) 1)); 4384 4385 /* If this is a static link, or it is a -Bsymbolic link and the 4386 symbol is defined locally or was forced to be local because 4387 of a version file, we just want to emit a RELATIVE reloc. 4388 The entry in the global offset table will already have been 4389 initialized in the relocate_section function. */ 4390 if (info->shared 4391 && (info->symbolic 4392 || h->dynindx == -1 4393 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) 4394 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) 4395 { 4396 BFD_ASSERT((h->got.offset & 1) != 0); 4397 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE); 4398 rela.r_addend = (h->root.u.def.value 4399 + h->root.u.def.section->output_section->vma 4400 + h->root.u.def.section->output_offset); 4401 } 4402 else 4403 { 4404 BFD_ASSERT ((h->got.offset & 1) == 0); 4405 bfd_put_64 (output_bfd, (bfd_vma) 0, 4406 htab->sgot->contents + h->got.offset); 4407 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_GLOB_DAT); 4408 rela.r_addend = 0; 4409 } 4410 4411 loc = (Elf64_External_Rela *) htab->srelgot->contents; 4412 loc += htab->srelgot->reloc_count++; 4413 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); 4414 } 4415 4416 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0) 4417 { 4418 Elf_Internal_Rela rela; 4419 Elf64_External_Rela *loc; 4420 4421 /* This symbol needs a copy reloc. Set it up. */ 4422 4423 if (h->dynindx == -1 4424 || (h->root.type != bfd_link_hash_defined 4425 && h->root.type != bfd_link_hash_defweak) 4426 || htab->srelbss == NULL) 4427 abort (); 4428 4429 rela.r_offset = (h->root.u.def.value 4430 + h->root.u.def.section->output_section->vma 4431 + h->root.u.def.section->output_offset); 4432 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY); 4433 rela.r_addend = 0; 4434 loc = (Elf64_External_Rela *) htab->srelbss->contents; 4435 loc += htab->srelbss->reloc_count++; 4436 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); 4437 } 4438 4439 /* Mark some specially defined symbols as absolute. */ 4440 if (strcmp (h->root.root.string, "_DYNAMIC") == 0) 4441 sym->st_shndx = SHN_ABS; 4442 4443 return true; 4444} 4445 4446/* Used to decide how to sort relocs in an optimal manner for the 4447 dynamic linker, before writing them out. */ 4448 4449static enum elf_reloc_type_class 4450ppc64_elf_reloc_type_class (rela) 4451 const Elf_Internal_Rela *rela; 4452{ 4453 enum elf_ppc_reloc_type r_type; 4454 4455 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rela->r_info); 4456 switch (r_type) 4457 { 4458 case R_PPC64_RELATIVE: 4459 return reloc_class_relative; 4460 case R_PPC64_JMP_SLOT: 4461 return reloc_class_plt; 4462 case R_PPC64_COPY: 4463 return reloc_class_copy; 4464 default: 4465 return reloc_class_normal; 4466 } 4467} 4468 4469/* Finish up the dynamic sections. */ 4470 4471static boolean 4472ppc64_elf_finish_dynamic_sections (output_bfd, info) 4473 bfd *output_bfd; 4474 struct bfd_link_info *info; 4475{ 4476 struct ppc_link_hash_table *htab; 4477 bfd *dynobj; 4478 asection *sdyn; 4479 4480 htab = ppc_hash_table (info); 4481 dynobj = htab->elf.dynobj; 4482 sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); 4483 4484 if (htab->elf.dynamic_sections_created) 4485 { 4486 Elf64_External_Dyn *dyncon, *dynconend; 4487 4488 if (sdyn == NULL || htab->sgot == NULL) 4489 abort (); 4490 4491 dyncon = (Elf64_External_Dyn *) sdyn->contents; 4492 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size); 4493 for (; dyncon < dynconend; dyncon++) 4494 { 4495 Elf_Internal_Dyn dyn; 4496 asection *s; 4497 4498 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); 4499 4500 switch (dyn.d_tag) 4501 { 4502 default: 4503 continue; 4504 4505 case DT_PPC64_GLINK: 4506 dyn.d_un.d_ptr = (htab->sglink->output_section->vma 4507 + htab->sglink->output_offset); 4508 break; 4509 4510 case DT_PPC64_OPD: 4511 s = bfd_get_section_by_name (output_bfd, ".opd"); 4512 if (s != NULL) 4513 dyn.d_un.d_ptr = s->vma; 4514 break; 4515 4516 case DT_PPC64_OPDSZ: 4517 s = bfd_get_section_by_name (output_bfd, ".opd"); 4518 if (s != NULL) 4519 dyn.d_un.d_val = s->_raw_size; 4520 break; 4521 4522 case DT_PLTGOT: 4523 dyn.d_un.d_ptr = (htab->splt->output_section->vma 4524 + htab->splt->output_offset); 4525 break; 4526 4527 case DT_JMPREL: 4528 dyn.d_un.d_ptr = (htab->srelplt->output_section->vma 4529 + htab->srelplt->output_offset); 4530 break; 4531 4532 case DT_PLTRELSZ: 4533 dyn.d_un.d_val = htab->srelplt->_raw_size; 4534 break; 4535 4536 case DT_RELASZ: 4537 /* Don't count procedure linkage table relocs in the 4538 overall reloc count. */ 4539 if (htab->srelplt != NULL) 4540 dyn.d_un.d_val -= htab->srelplt->_raw_size; 4541 break; 4542 } 4543 4544 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); 4545 } 4546 } 4547 4548 if (htab->sgot != NULL && htab->sgot->_raw_size != 0) 4549 { 4550 /* Fill in the first entry in the global offset table. 4551 We use it to hold the link-time TOCbase. */ 4552 bfd_put_64 (output_bfd, 4553 elf_gp (output_bfd) + TOC_BASE_OFF, 4554 htab->sgot->contents); 4555 4556 /* Set .got entry size. */ 4557 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 8; 4558 } 4559 4560 if (htab->splt != NULL && htab->splt->_raw_size != 0) 4561 { 4562 /* Set .plt entry size. */ 4563 elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize 4564 = PLT_ENTRY_SIZE; 4565 } 4566 4567 return true; 4568} 4569 4570#define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec 4571#define TARGET_LITTLE_NAME "elf64-powerpcle" 4572#define TARGET_BIG_SYM bfd_elf64_powerpc_vec 4573#define TARGET_BIG_NAME "elf64-powerpc" 4574#define ELF_ARCH bfd_arch_powerpc 4575#define ELF_MACHINE_CODE EM_PPC64 4576#define ELF_MAXPAGESIZE 0x10000 4577#define elf_info_to_howto ppc64_elf_info_to_howto 4578 4579#ifdef EM_CYGNUS_POWERPC 4580#define ELF_MACHINE_ALT1 EM_CYGNUS_POWERPC 4581#endif 4582 4583#ifdef EM_PPC_OLD 4584#define ELF_MACHINE_ALT2 EM_PPC_OLD 4585#endif 4586 4587#define elf_backend_want_got_sym 0 4588#define elf_backend_want_plt_sym 0 4589#define elf_backend_plt_alignment 3 4590#define elf_backend_plt_not_loaded 1 4591#define elf_backend_got_symbol_offset 0 4592#define elf_backend_got_header_size 8 4593#define elf_backend_plt_header_size PLT_INITIAL_ENTRY_SIZE 4594#define elf_backend_can_gc_sections 1 4595#define elf_backend_can_refcount 1 4596 4597#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup 4598#define bfd_elf64_bfd_set_private_flags ppc64_elf_set_private_flags 4599#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data 4600#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create 4601 4602#define elf_backend_section_from_shdr ppc64_elf_section_from_shdr 4603#define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections 4604#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol 4605#define elf_backend_check_relocs ppc64_elf_check_relocs 4606#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook 4607#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook 4608#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol 4609#define elf_backend_hide_symbol ppc64_elf_hide_symbol 4610#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust 4611#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections 4612#define elf_backend_fake_sections ppc64_elf_fake_sections 4613#define elf_backend_relocate_section ppc64_elf_relocate_section 4614#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol 4615#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class 4616#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections 4617 4618#include "elf64-target.h" 4619