elf64-s390.c revision 107492
1250661Sdavidcs/* IBM S/390-specific support for 64-bit ELF 2250661Sdavidcs Copyright 2000, 2001, 2002 Free Software Foundation, Inc. 3250661Sdavidcs Contributed Martin Schwidefsky (schwidefsky@de.ibm.com). 4250661Sdavidcs 5250661Sdavidcs This file is part of BFD, the Binary File Descriptor library. 6250661Sdavidcs 7250661Sdavidcs This program is free software; you can redistribute it and/or modify 8250661Sdavidcs it under the terms of the GNU General Public License as published by 9250661Sdavidcs the Free Software Foundation; either version 2 of the License, or 10250661Sdavidcs (at your option) any later version. 11250661Sdavidcs 12250661Sdavidcs This program is distributed in the hope that it will be useful, 13250661Sdavidcs but WITHOUT ANY WARRANTY; without even the implied warranty of 14250661Sdavidcs MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15250661Sdavidcs GNU General Public License for more details. 16250661Sdavidcs 17250661Sdavidcs You should have received a copy of the GNU General Public License 18250661Sdavidcs along with this program; if not, write to the Free Software 19250661Sdavidcs Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20250661Sdavidcs 02111-1307, USA. */ 21250661Sdavidcs 22250661Sdavidcs#include "bfd.h" 23250661Sdavidcs#include "sysdep.h" 24250661Sdavidcs#include "bfdlink.h" 25250661Sdavidcs#include "libbfd.h" 26250661Sdavidcs#include "elf-bfd.h" 27250661Sdavidcs 28250661Sdavidcsstatic reloc_howto_type *elf_s390_reloc_type_lookup 29250661Sdavidcs PARAMS ((bfd *, bfd_reloc_code_real_type)); 30250661Sdavidcsstatic void elf_s390_info_to_howto 31250661Sdavidcs PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); 32250661Sdavidcsstatic boolean elf_s390_is_local_label_name 33250661Sdavidcs PARAMS ((bfd *, const char *)); 34250661Sdavidcsstatic struct bfd_hash_entry *link_hash_newfunc 35250661Sdavidcs PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); 36250661Sdavidcsstatic struct bfd_link_hash_table *elf_s390_link_hash_table_create 37250661Sdavidcs PARAMS ((bfd *)); 38250661Sdavidcsstatic boolean create_got_section 39250661Sdavidcs PARAMS((bfd *, struct bfd_link_info *)); 40250661Sdavidcsstatic boolean elf_s390_create_dynamic_sections 41250661Sdavidcs PARAMS((bfd *, struct bfd_link_info *)); 42250661Sdavidcsstatic void elf_s390_copy_indirect_symbol 43250661Sdavidcs PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *, 44250661Sdavidcs struct elf_link_hash_entry *)); 45250661Sdavidcsstatic boolean elf_s390_check_relocs 46250661Sdavidcs PARAMS ((bfd *, struct bfd_link_info *, asection *, 47250661Sdavidcs const Elf_Internal_Rela *)); 48250661Sdavidcsstatic asection *elf_s390_gc_mark_hook 49250661Sdavidcs PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *, 50250661Sdavidcs struct elf_link_hash_entry *, Elf_Internal_Sym *)); 51250661Sdavidcsstatic boolean elf_s390_gc_sweep_hook 52250661Sdavidcs PARAMS ((bfd *, struct bfd_link_info *, asection *, 53250661Sdavidcs const Elf_Internal_Rela *)); 54250661Sdavidcsstatic boolean elf_s390_adjust_dynamic_symbol 55250661Sdavidcs PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); 56250661Sdavidcsstatic boolean allocate_dynrelocs 57250661Sdavidcs PARAMS ((struct elf_link_hash_entry *, PTR)); 58250661Sdavidcsstatic boolean readonly_dynrelocs 59250661Sdavidcs PARAMS ((struct elf_link_hash_entry *, PTR)); 60250661Sdavidcsstatic boolean elf_s390_size_dynamic_sections 61250661Sdavidcs PARAMS ((bfd *, struct bfd_link_info *)); 62250661Sdavidcsstatic boolean elf_s390_relocate_section 63250661Sdavidcs PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 64250661Sdavidcs Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); 65250661Sdavidcsstatic boolean elf_s390_finish_dynamic_symbol 66250661Sdavidcs PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, 67250661Sdavidcs Elf_Internal_Sym *)); 68250661Sdavidcsstatic enum elf_reloc_type_class elf_s390_reloc_type_class 69250661Sdavidcs PARAMS ((const Elf_Internal_Rela *)); 70250661Sdavidcsstatic boolean elf_s390_finish_dynamic_sections 71250661Sdavidcs PARAMS ((bfd *, struct bfd_link_info *)); 72250661Sdavidcsstatic boolean elf_s390_object_p PARAMS ((bfd *)); 73250661Sdavidcs 74250661Sdavidcs#define USE_RELA 1 /* We want RELA relocations, not REL. */ 75250661Sdavidcs 76250661Sdavidcs#include "elf/s390.h" 77250661Sdavidcs 78250661Sdavidcs/* In case we're on a 32-bit machine, construct a 64-bit "-1" value 79250661Sdavidcs from smaller values. Start with zero, widen, *then* decrement. */ 80250661Sdavidcs#define MINUS_ONE (((bfd_vma)0) - 1) 81250661Sdavidcs 82250661Sdavidcs/* The relocation "howto" table. */ 83250661Sdavidcsstatic reloc_howto_type elf_howto_table[] = 84250661Sdavidcs{ 85250661Sdavidcs HOWTO (R_390_NONE, /* type */ 86250661Sdavidcs 0, /* rightshift */ 87250661Sdavidcs 0, /* size (0 = byte, 1 = short, 2 = long) */ 88250661Sdavidcs 0, /* bitsize */ 89250661Sdavidcs false, /* pc_relative */ 90250661Sdavidcs 0, /* bitpos */ 91250661Sdavidcs complain_overflow_dont, /* complain_on_overflow */ 92250661Sdavidcs bfd_elf_generic_reloc, /* special_function */ 93250661Sdavidcs "R_390_NONE", /* name */ 94250661Sdavidcs false, /* partial_inplace */ 95250661Sdavidcs 0, /* src_mask */ 96250661Sdavidcs 0, /* dst_mask */ 97250661Sdavidcs false), /* pcrel_offset */ 98250661Sdavidcs 99250661Sdavidcs HOWTO(R_390_8, 0, 0, 8, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_8", false, 0,0x000000ff, false), 100250661Sdavidcs HOWTO(R_390_12, 0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_12", false, 0,0x00000fff, false), 101250661Sdavidcs HOWTO(R_390_16, 0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_16", false, 0,0x0000ffff, false), 102250661Sdavidcs HOWTO(R_390_32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_32", false, 0,0xffffffff, false), 103250661Sdavidcs HOWTO(R_390_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32", false, 0,0xffffffff, true), 104250661Sdavidcs HOWTO(R_390_GOT12, 0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_GOT12", false, 0,0x00000fff, false), 105250661Sdavidcs HOWTO(R_390_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT32", false, 0,0xffffffff, false), 106250661Sdavidcs HOWTO(R_390_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32", false, 0,0xffffffff, true), 107250661Sdavidcs HOWTO(R_390_COPY, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_COPY", false, 0,MINUS_ONE, false), 108250661Sdavidcs HOWTO(R_390_GLOB_DAT, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GLOB_DAT",false, 0,MINUS_ONE, false), 109250661Sdavidcs HOWTO(R_390_JMP_SLOT, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_JMP_SLOT",false, 0,MINUS_ONE, false), 110250661Sdavidcs HOWTO(R_390_RELATIVE, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_RELATIVE",false, 0,MINUS_ONE, false), 111250661Sdavidcs HOWTO(R_390_GOTOFF, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTOFF", false, 0,MINUS_ONE, false), 112250661Sdavidcs HOWTO(R_390_GOTPC, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPC", false, 0,MINUS_ONE, true), 113250661Sdavidcs HOWTO(R_390_GOT16, 0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT16", false, 0,0x0000ffff, false), 114250661Sdavidcs HOWTO(R_390_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16", false, 0,0x0000ffff, true), 115250661Sdavidcs HOWTO(R_390_PC16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff, true), 116250661Sdavidcs HOWTO(R_390_PLT16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff, true), 117250661Sdavidcs HOWTO(R_390_PC32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32DBL", false, 0,0xffffffff, true), 118250661Sdavidcs HOWTO(R_390_PLT32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff, true), 119250661Sdavidcs HOWTO(R_390_GOTPCDBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,MINUS_ONE, true), 120250661Sdavidcs HOWTO(R_390_64, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_64", false, 0,MINUS_ONE, false), 121250661Sdavidcs HOWTO(R_390_PC64, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC64", false, 0,MINUS_ONE, true), 122250661Sdavidcs HOWTO(R_390_GOT64, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT64", false, 0,MINUS_ONE, false), 123250661Sdavidcs HOWTO(R_390_PLT64, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT64", false, 0,MINUS_ONE, true), 124250661Sdavidcs HOWTO(R_390_GOTENT, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTENT", false, 0,MINUS_ONE, true), 125250661Sdavidcs}; 126250661Sdavidcs 127250661Sdavidcs/* GNU extension to record C++ vtable hierarchy. */ 128250661Sdavidcsstatic reloc_howto_type elf64_s390_vtinherit_howto = 129250661Sdavidcs HOWTO (R_390_GNU_VTINHERIT, 0,4,0,false,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", false,0, 0, false); 130250661Sdavidcsstatic reloc_howto_type elf64_s390_vtentry_howto = 131250661Sdavidcs HOWTO (R_390_GNU_VTENTRY, 0,4,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_390_GNU_VTENTRY", false,0,0, false); 132250661Sdavidcs 133250661Sdavidcsstatic reloc_howto_type * 134250661Sdavidcself_s390_reloc_type_lookup (abfd, code) 135250661Sdavidcs bfd *abfd ATTRIBUTE_UNUSED; 136250661Sdavidcs bfd_reloc_code_real_type code; 137250661Sdavidcs{ 138250661Sdavidcs switch (code) 139250661Sdavidcs { 140250661Sdavidcs case BFD_RELOC_NONE: 141250661Sdavidcs return &elf_howto_table[(int) R_390_NONE]; 142250661Sdavidcs case BFD_RELOC_8: 143250661Sdavidcs return &elf_howto_table[(int) R_390_8]; 144250661Sdavidcs case BFD_RELOC_390_12: 145250661Sdavidcs return &elf_howto_table[(int) R_390_12]; 146250661Sdavidcs case BFD_RELOC_16: 147250661Sdavidcs return &elf_howto_table[(int) R_390_16]; 148250661Sdavidcs case BFD_RELOC_32: 149250661Sdavidcs return &elf_howto_table[(int) R_390_32]; 150250661Sdavidcs case BFD_RELOC_CTOR: 151250661Sdavidcs return &elf_howto_table[(int) R_390_32]; 152250661Sdavidcs case BFD_RELOC_32_PCREL: 153250661Sdavidcs return &elf_howto_table[(int) R_390_PC32]; 154250661Sdavidcs case BFD_RELOC_390_GOT12: 155250661Sdavidcs return &elf_howto_table[(int) R_390_GOT12]; 156250661Sdavidcs case BFD_RELOC_32_GOT_PCREL: 157250661Sdavidcs return &elf_howto_table[(int) R_390_GOT32]; 158250661Sdavidcs case BFD_RELOC_390_PLT32: 159250661Sdavidcs return &elf_howto_table[(int) R_390_PLT32]; 160250661Sdavidcs case BFD_RELOC_390_COPY: 161250661Sdavidcs return &elf_howto_table[(int) R_390_COPY]; 162250661Sdavidcs case BFD_RELOC_390_GLOB_DAT: 163250661Sdavidcs return &elf_howto_table[(int) R_390_GLOB_DAT]; 164250661Sdavidcs case BFD_RELOC_390_JMP_SLOT: 165250661Sdavidcs return &elf_howto_table[(int) R_390_JMP_SLOT]; 166250661Sdavidcs case BFD_RELOC_390_RELATIVE: 167250661Sdavidcs return &elf_howto_table[(int) R_390_RELATIVE]; 168250661Sdavidcs case BFD_RELOC_32_GOTOFF: 169250661Sdavidcs return &elf_howto_table[(int) R_390_GOTOFF]; 170250661Sdavidcs case BFD_RELOC_390_GOTPC: 171250661Sdavidcs return &elf_howto_table[(int) R_390_GOTPC]; 172250661Sdavidcs case BFD_RELOC_390_GOT16: 173250661Sdavidcs return &elf_howto_table[(int) R_390_GOT16]; 174250661Sdavidcs case BFD_RELOC_16_PCREL: 175250661Sdavidcs return &elf_howto_table[(int) R_390_PC16]; 176250661Sdavidcs case BFD_RELOC_390_PC16DBL: 177250661Sdavidcs return &elf_howto_table[(int) R_390_PC16DBL]; 178250661Sdavidcs case BFD_RELOC_390_PLT16DBL: 179250661Sdavidcs return &elf_howto_table[(int) R_390_PLT16DBL]; 180250661Sdavidcs case BFD_RELOC_VTABLE_INHERIT: 181250661Sdavidcs return &elf64_s390_vtinherit_howto; 182250661Sdavidcs case BFD_RELOC_VTABLE_ENTRY: 183250661Sdavidcs return &elf64_s390_vtentry_howto; 184250661Sdavidcs case BFD_RELOC_390_PC32DBL: 185250661Sdavidcs return &elf_howto_table[(int) R_390_PC32DBL]; 186250661Sdavidcs case BFD_RELOC_390_PLT32DBL: 187250661Sdavidcs return &elf_howto_table[(int) R_390_PLT32DBL]; 188250661Sdavidcs case BFD_RELOC_390_GOTPCDBL: 189250661Sdavidcs return &elf_howto_table[(int) R_390_GOTPCDBL]; 190250661Sdavidcs case BFD_RELOC_64: 191250661Sdavidcs return &elf_howto_table[(int) R_390_64]; 192250661Sdavidcs case BFD_RELOC_64_PCREL: 193250661Sdavidcs return &elf_howto_table[(int) R_390_PC64]; 194250661Sdavidcs case BFD_RELOC_390_GOT64: 195250661Sdavidcs return &elf_howto_table[(int) R_390_GOT64]; 196250661Sdavidcs case BFD_RELOC_390_PLT64: 197250661Sdavidcs return &elf_howto_table[(int) R_390_PLT64]; 198250661Sdavidcs case BFD_RELOC_390_GOTENT: 199250661Sdavidcs return &elf_howto_table[(int) R_390_GOTENT]; 200250661Sdavidcs default: 201250661Sdavidcs break; 202250661Sdavidcs } 203250661Sdavidcs return 0; 204250661Sdavidcs} 205250661Sdavidcs 206250661Sdavidcs/* We need to use ELF64_R_TYPE so we have our own copy of this function, 207250661Sdavidcs and elf64-s390.c has its own copy. */ 208250661Sdavidcs 209250661Sdavidcsstatic void 210250661Sdavidcself_s390_info_to_howto (abfd, cache_ptr, dst) 211250661Sdavidcs bfd *abfd ATTRIBUTE_UNUSED; 212250661Sdavidcs arelent *cache_ptr; 213250661Sdavidcs Elf_Internal_Rela *dst; 214250661Sdavidcs{ 215258898Sdavidcs switch (ELF64_R_TYPE(dst->r_info)) 216258898Sdavidcs { 217258898Sdavidcs case R_390_GNU_VTINHERIT: 218258898Sdavidcs cache_ptr->howto = &elf64_s390_vtinherit_howto; 219258898Sdavidcs break; 220258898Sdavidcs 221250661Sdavidcs case R_390_GNU_VTENTRY: 222250661Sdavidcs cache_ptr->howto = &elf64_s390_vtentry_howto; 223250661Sdavidcs break; 224250661Sdavidcs 225250661Sdavidcs default: 226250661Sdavidcs BFD_ASSERT (ELF64_R_TYPE(dst->r_info) < (unsigned int) R_390_max); 227250661Sdavidcs cache_ptr->howto = &elf_howto_table[ELF64_R_TYPE(dst->r_info)]; 228250661Sdavidcs } 229250661Sdavidcs} 230250661Sdavidcs 231250661Sdavidcsstatic boolean 232250661Sdavidcself_s390_is_local_label_name (abfd, name) 233250661Sdavidcs bfd *abfd; 234250661Sdavidcs const char *name; 235250661Sdavidcs{ 236250661Sdavidcs if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L')) 237250661Sdavidcs return true; 238250661Sdavidcs 239250661Sdavidcs return _bfd_elf_is_local_label_name (abfd, name); 240250661Sdavidcs} 241250661Sdavidcs 242250661Sdavidcs/* Functions for the 390 ELF linker. */ 243250661Sdavidcs 244250661Sdavidcs/* The name of the dynamic interpreter. This is put in the .interp 245250661Sdavidcs section. */ 246250661Sdavidcs 247250661Sdavidcs#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" 248250661Sdavidcs 249250661Sdavidcs/* The size in bytes of the first entry in the procedure linkage table. */ 250250661Sdavidcs#define PLT_FIRST_ENTRY_SIZE 32 251250661Sdavidcs/* The size in bytes of an entry in the procedure linkage table. */ 252250661Sdavidcs#define PLT_ENTRY_SIZE 32 253250661Sdavidcs 254250661Sdavidcs#define GOT_ENTRY_SIZE 8 255250661Sdavidcs 256250661Sdavidcs/* The first three entries in a procedure linkage table are reserved, 257250661Sdavidcs and the initial contents are unimportant (we zero them out). 258250661Sdavidcs Subsequent entries look like this. See the SVR4 ABI 386 259250661Sdavidcs supplement to see how this works. */ 260250661Sdavidcs 261250661Sdavidcs/* For the s390, simple addr offset can only be 0 - 4096. 262250661Sdavidcs To use the full 16777216 TB address space, several instructions 263250661Sdavidcs are needed to load an address in a register and execute 264250661Sdavidcs a branch( or just saving the address) 265250661Sdavidcs 266250661Sdavidcs Furthermore, only r 0 and 1 are free to use!!! */ 267250661Sdavidcs 268250661Sdavidcs/* The first 3 words in the GOT are then reserved. 269250661Sdavidcs Word 0 is the address of the dynamic table. 270250661Sdavidcs Word 1 is a pointer to a structure describing the object 271250661Sdavidcs Word 2 is used to point to the loader entry address. 272250661Sdavidcs 273250661Sdavidcs The code for PLT entries looks like this: 274250661Sdavidcs 275250661Sdavidcs The GOT holds the address in the PLT to be executed. 276250661Sdavidcs The loader then gets: 277250661Sdavidcs 24(15) = Pointer to the structure describing the object. 278250661Sdavidcs 28(15) = Offset in symbol table 279250661Sdavidcs The loader must then find the module where the function is 280250661Sdavidcs and insert the address in the GOT. 281250661Sdavidcs 282250661Sdavidcs PLT1: LARL 1,<fn>@GOTENT # 6 bytes Load address of GOT entry in r1 283250661Sdavidcs LG 1,0(1) # 6 bytes Load address from GOT in r1 284250661Sdavidcs BCR 15,1 # 2 bytes Jump to address 285250661Sdavidcs RET1: BASR 1,0 # 2 bytes Return from GOT 1st time 286250661Sdavidcs LGF 1,12(1) # 6 bytes Load offset in symbl table in r1 287250661Sdavidcs BRCL 15,-x # 6 bytes Jump to start of PLT 288250661Sdavidcs .long ? # 4 bytes offset into symbol table 289250661Sdavidcs 290250661Sdavidcs Total = 32 bytes per PLT entry 291250661Sdavidcs Fixup at offset 2: relative address to GOT entry 292250661Sdavidcs Fixup at offset 22: relative branch to PLT0 293250661Sdavidcs Fixup at offset 28: 32 bit offset into symbol table 294250661Sdavidcs 295250661Sdavidcs A 32 bit offset into the symbol table is enough. It allows for symbol 296250661Sdavidcs tables up to a size of 2 gigabyte. A single dynamic object (the main 297250661Sdavidcs program, any shared library) is limited to 4GB in size and I want to see 298250661Sdavidcs the program that manages to have a symbol table of more than 2 GB with a 299250661Sdavidcs total size of at max 4 GB. */ 300250661Sdavidcs 301250661Sdavidcs#define PLT_ENTRY_WORD0 (bfd_vma) 0xc0100000 302250661Sdavidcs#define PLT_ENTRY_WORD1 (bfd_vma) 0x0000e310 303250661Sdavidcs#define PLT_ENTRY_WORD2 (bfd_vma) 0x10000004 304250661Sdavidcs#define PLT_ENTRY_WORD3 (bfd_vma) 0x07f10d10 305250661Sdavidcs#define PLT_ENTRY_WORD4 (bfd_vma) 0xe310100c 306250661Sdavidcs#define PLT_ENTRY_WORD5 (bfd_vma) 0x0014c0f4 307250661Sdavidcs#define PLT_ENTRY_WORD6 (bfd_vma) 0x00000000 308250661Sdavidcs#define PLT_ENTRY_WORD7 (bfd_vma) 0x00000000 309250661Sdavidcs 310250661Sdavidcs/* The first PLT entry pushes the offset into the symbol table 311250661Sdavidcs from R1 onto the stack at 8(15) and the loader object info 312250661Sdavidcs at 12(15), loads the loader address in R1 and jumps to it. */ 313250661Sdavidcs 314250661Sdavidcs/* The first entry in the PLT: 315250661Sdavidcs 316250661Sdavidcs PLT0: 317250661Sdavidcs STG 1,56(15) # r1 contains the offset into the symbol table 318250661Sdavidcs LARL 1,_GLOBAL_OFFSET_TABLE # load address of global offset table 319250661Sdavidcs MVC 48(8,15),8(1) # move loader ino (object struct address) to stack 320250661Sdavidcs LG 1,16(1) # get entry address of loader 321250661Sdavidcs BCR 15,1 # jump to loader 322250661Sdavidcs 323250661Sdavidcs Fixup at offset 8: relative address to start of GOT. */ 324250661Sdavidcs 325250661Sdavidcs#define PLT_FIRST_ENTRY_WORD0 (bfd_vma) 0xe310f038 326250661Sdavidcs#define PLT_FIRST_ENTRY_WORD1 (bfd_vma) 0x0024c010 327250661Sdavidcs#define PLT_FIRST_ENTRY_WORD2 (bfd_vma) 0x00000000 328250661Sdavidcs#define PLT_FIRST_ENTRY_WORD3 (bfd_vma) 0xd207f030 329250661Sdavidcs#define PLT_FIRST_ENTRY_WORD4 (bfd_vma) 0x1008e310 330250661Sdavidcs#define PLT_FIRST_ENTRY_WORD5 (bfd_vma) 0x10100004 331250661Sdavidcs#define PLT_FIRST_ENTRY_WORD6 (bfd_vma) 0x07f10700 332250661Sdavidcs#define PLT_FIRST_ENTRY_WORD7 (bfd_vma) 0x07000700 333250661Sdavidcs 334250661Sdavidcs/* The s390 linker needs to keep track of the number of relocs that it 335250661Sdavidcs decides to copy as dynamic relocs in check_relocs for each symbol. 336250661Sdavidcs This is so that it can later discard them if they are found to be 337250661Sdavidcs unnecessary. We store the information in a field extending the 338250661Sdavidcs regular ELF linker hash table. */ 339250661Sdavidcs 340250661Sdavidcsstruct elf_s390_dyn_relocs 341250661Sdavidcs{ 342250661Sdavidcs struct elf_s390_dyn_relocs *next; 343250661Sdavidcs 344250661Sdavidcs /* The input section of the reloc. */ 345250661Sdavidcs asection *sec; 346250661Sdavidcs 347250661Sdavidcs /* Total number of relocs copied for the input section. */ 348250661Sdavidcs bfd_size_type count; 349250661Sdavidcs 350250661Sdavidcs /* Number of pc-relative relocs copied for the input section. */ 351250661Sdavidcs bfd_size_type pc_count; 352250661Sdavidcs}; 353250661Sdavidcs 354250661Sdavidcs/* s390 ELF linker hash entry. */ 355250661Sdavidcs 356250661Sdavidcsstruct elf_s390_link_hash_entry 357250661Sdavidcs{ 358250661Sdavidcs struct elf_link_hash_entry elf; 359250661Sdavidcs 360250661Sdavidcs /* Track dynamic relocs copied for this symbol. */ 361250661Sdavidcs struct elf_s390_dyn_relocs *dyn_relocs; 362250661Sdavidcs}; 363250661Sdavidcs 364250661Sdavidcs/* s390 ELF linker hash table. */ 365250661Sdavidcs 366250661Sdavidcsstruct elf_s390_link_hash_table 367250661Sdavidcs{ 368250661Sdavidcs struct elf_link_hash_table elf; 369250661Sdavidcs 370250661Sdavidcs /* Short-cuts to get to dynamic linker sections. */ 371250661Sdavidcs asection *sgot; 372250661Sdavidcs asection *sgotplt; 373250661Sdavidcs asection *srelgot; 374250661Sdavidcs asection *splt; 375250661Sdavidcs asection *srelplt; 376250661Sdavidcs asection *sdynbss; 377250661Sdavidcs asection *srelbss; 378250661Sdavidcs 379250661Sdavidcs /* Small local sym to section mapping cache. */ 380250661Sdavidcs struct sym_sec_cache sym_sec; 381250661Sdavidcs}; 382250661Sdavidcs 383250661Sdavidcs/* Get the s390 ELF linker hash table from a link_info structure. */ 384250661Sdavidcs 385250661Sdavidcs#define elf_s390_hash_table(p) \ 386250661Sdavidcs ((struct elf_s390_link_hash_table *) ((p)->hash)) 387250661Sdavidcs 388250661Sdavidcs/* Create an entry in an s390 ELF linker hash table. */ 389250661Sdavidcs 390250661Sdavidcsstatic struct bfd_hash_entry * 391250661Sdavidcslink_hash_newfunc (entry, table, string) 392250661Sdavidcs struct bfd_hash_entry *entry; 393250661Sdavidcs struct bfd_hash_table *table; 394250661Sdavidcs const char *string; 395250661Sdavidcs{ 396250661Sdavidcs /* Allocate the structure if it has not already been allocated by a 397250661Sdavidcs subclass. */ 398250661Sdavidcs if (entry == NULL) 399250661Sdavidcs { 400250661Sdavidcs entry = bfd_hash_allocate (table, 401250661Sdavidcs sizeof (struct elf_s390_link_hash_entry)); 402250661Sdavidcs if (entry == NULL) 403250661Sdavidcs return entry; 404250661Sdavidcs } 405250661Sdavidcs 406250661Sdavidcs /* Call the allocation method of the superclass. */ 407250661Sdavidcs entry = _bfd_elf_link_hash_newfunc (entry, table, string); 408250661Sdavidcs if (entry != NULL) 409250661Sdavidcs { 410250661Sdavidcs struct elf_s390_link_hash_entry *eh; 411250661Sdavidcs 412250661Sdavidcs eh = (struct elf_s390_link_hash_entry *) entry; 413250661Sdavidcs eh->dyn_relocs = NULL; 414250661Sdavidcs } 415250661Sdavidcs 416250661Sdavidcs return entry; 417250661Sdavidcs} 418250661Sdavidcs 419250661Sdavidcs/* Create an s390 ELF linker hash table. */ 420250661Sdavidcs 421250661Sdavidcsstatic struct bfd_link_hash_table * 422250661Sdavidcself_s390_link_hash_table_create (abfd) 423250661Sdavidcs bfd *abfd; 424250661Sdavidcs{ 425250661Sdavidcs struct elf_s390_link_hash_table *ret; 426250661Sdavidcs bfd_size_type amt = sizeof (struct elf_s390_link_hash_table); 427250661Sdavidcs 428250661Sdavidcs ret = (struct elf_s390_link_hash_table *) bfd_malloc (amt); 429250661Sdavidcs if (ret == NULL) 430250661Sdavidcs return NULL; 431250661Sdavidcs 432250661Sdavidcs if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc)) 433250661Sdavidcs { 434250661Sdavidcs free (ret); 435250661Sdavidcs return NULL; 436250661Sdavidcs } 437250661Sdavidcs 438250661Sdavidcs ret->sgot = NULL; 439250661Sdavidcs ret->sgotplt = NULL; 440250661Sdavidcs ret->srelgot = NULL; 441250661Sdavidcs ret->splt = NULL; 442250661Sdavidcs ret->srelplt = NULL; 443250661Sdavidcs ret->sdynbss = NULL; 444250661Sdavidcs ret->srelbss = NULL; 445250661Sdavidcs ret->sym_sec.abfd = NULL; 446250661Sdavidcs 447250661Sdavidcs return &ret->elf.root; 448250661Sdavidcs} 449250661Sdavidcs 450250661Sdavidcs/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up 451250661Sdavidcs shortcuts to them in our hash table. */ 452250661Sdavidcs 453250661Sdavidcsstatic boolean 454250661Sdavidcscreate_got_section (dynobj, info) 455250661Sdavidcs bfd *dynobj; 456250661Sdavidcs struct bfd_link_info *info; 457250661Sdavidcs{ 458250661Sdavidcs struct elf_s390_link_hash_table *htab; 459250661Sdavidcs 460250661Sdavidcs if (! _bfd_elf_create_got_section (dynobj, info)) 461250661Sdavidcs return false; 462250661Sdavidcs 463250661Sdavidcs htab = elf_s390_hash_table (info); 464250661Sdavidcs htab->sgot = bfd_get_section_by_name (dynobj, ".got"); 465250661Sdavidcs htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); 466250661Sdavidcs if (!htab->sgot || !htab->sgotplt) 467250661Sdavidcs abort (); 468250661Sdavidcs 469250661Sdavidcs htab->srelgot = bfd_make_section (dynobj, ".rela.got"); 470250661Sdavidcs if (htab->srelgot == NULL 471250661Sdavidcs || ! bfd_set_section_flags (dynobj, htab->srelgot, 472250661Sdavidcs (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS 473250661Sdavidcs | SEC_IN_MEMORY | SEC_LINKER_CREATED 474250661Sdavidcs | SEC_READONLY)) 475250661Sdavidcs || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3)) 476250661Sdavidcs return false; 477250661Sdavidcs return true; 478250661Sdavidcs} 479250661Sdavidcs 480250661Sdavidcs/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and 481250661Sdavidcs .rela.bss sections in DYNOBJ, and set up shortcuts to them in our 482250661Sdavidcs hash table. */ 483250661Sdavidcs 484250661Sdavidcsstatic boolean 485250661Sdavidcself_s390_create_dynamic_sections (dynobj, info) 486250661Sdavidcs bfd *dynobj; 487250661Sdavidcs struct bfd_link_info *info; 488250661Sdavidcs{ 489250661Sdavidcs struct elf_s390_link_hash_table *htab; 490250661Sdavidcs 491250661Sdavidcs htab = elf_s390_hash_table (info); 492250661Sdavidcs if (!htab->sgot && !create_got_section (dynobj, info)) 493250661Sdavidcs return false; 494250661Sdavidcs 495250661Sdavidcs if (!_bfd_elf_create_dynamic_sections (dynobj, info)) 496250661Sdavidcs return false; 497250661Sdavidcs 498250661Sdavidcs htab->splt = bfd_get_section_by_name (dynobj, ".plt"); 499250661Sdavidcs htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt"); 500250661Sdavidcs htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); 501250661Sdavidcs if (!info->shared) 502250661Sdavidcs htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss"); 503250661Sdavidcs 504250661Sdavidcs if (!htab->splt || !htab->srelplt || !htab->sdynbss 505250661Sdavidcs || (!info->shared && !htab->srelbss)) 506250661Sdavidcs abort (); 507250661Sdavidcs 508250661Sdavidcs return true; 509250661Sdavidcs} 510250661Sdavidcs 511250661Sdavidcs/* Copy the extra info we tack onto an elf_link_hash_entry. */ 512250661Sdavidcs 513250661Sdavidcsstatic void 514250661Sdavidcself_s390_copy_indirect_symbol (bed, dir, ind) 515250661Sdavidcs struct elf_backend_data *bed; 516250661Sdavidcs struct elf_link_hash_entry *dir, *ind; 517250661Sdavidcs{ 518250661Sdavidcs struct elf_s390_link_hash_entry *edir, *eind; 519250661Sdavidcs 520250661Sdavidcs edir = (struct elf_s390_link_hash_entry *) dir; 521250661Sdavidcs eind = (struct elf_s390_link_hash_entry *) ind; 522250661Sdavidcs 523250661Sdavidcs if (eind->dyn_relocs != NULL) 524250661Sdavidcs { 525250661Sdavidcs if (edir->dyn_relocs != NULL) 526250661Sdavidcs { 527250661Sdavidcs struct elf_s390_dyn_relocs **pp; 528250661Sdavidcs struct elf_s390_dyn_relocs *p; 529250661Sdavidcs 530250661Sdavidcs if (ind->root.type == bfd_link_hash_indirect) 531250661Sdavidcs abort (); 532250661Sdavidcs 533250661Sdavidcs /* Add reloc counts against the weak sym to the strong sym 534250661Sdavidcs list. Merge any entries against the same section. */ 535250661Sdavidcs for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 536250661Sdavidcs { 537250661Sdavidcs struct elf_s390_dyn_relocs *q; 538250661Sdavidcs 539250661Sdavidcs for (q = edir->dyn_relocs; q != NULL; q = q->next) 540250661Sdavidcs if (q->sec == p->sec) 541250661Sdavidcs { 542250661Sdavidcs q->pc_count += p->pc_count; 543250661Sdavidcs q->count += p->count; 544250661Sdavidcs *pp = p->next; 545250661Sdavidcs break; 546250661Sdavidcs } 547250661Sdavidcs if (q == NULL) 548250661Sdavidcs pp = &p->next; 549250661Sdavidcs } 550250661Sdavidcs *pp = edir->dyn_relocs; 551250661Sdavidcs } 552250661Sdavidcs 553250661Sdavidcs edir->dyn_relocs = eind->dyn_relocs; 554250661Sdavidcs eind->dyn_relocs = NULL; 555250661Sdavidcs } 556250661Sdavidcs 557250661Sdavidcs _bfd_elf_link_hash_copy_indirect (bed, dir, ind); 558250661Sdavidcs} 559250661Sdavidcs 560250661Sdavidcs/* Look through the relocs for a section during the first phase, and 561250661Sdavidcs allocate space in the global offset table or procedure linkage 562250661Sdavidcs table. */ 563250661Sdavidcs 564250661Sdavidcsstatic boolean 565250661Sdavidcself_s390_check_relocs (abfd, info, sec, relocs) 566250661Sdavidcs bfd *abfd; 567250661Sdavidcs struct bfd_link_info *info; 568250661Sdavidcs asection *sec; 569250661Sdavidcs const Elf_Internal_Rela *relocs; 570250661Sdavidcs{ 571250661Sdavidcs struct elf_s390_link_hash_table *htab; 572250661Sdavidcs Elf_Internal_Shdr *symtab_hdr; 573250661Sdavidcs struct elf_link_hash_entry **sym_hashes; 574250661Sdavidcs const Elf_Internal_Rela *rel; 575250661Sdavidcs const Elf_Internal_Rela *rel_end; 576250661Sdavidcs asection *sreloc; 577250661Sdavidcs 578250661Sdavidcs if (info->relocateable) 579250661Sdavidcs return true; 580250661Sdavidcs 581250661Sdavidcs htab = elf_s390_hash_table (info); 582250661Sdavidcs symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 583250661Sdavidcs sym_hashes = elf_sym_hashes (abfd); 584250661Sdavidcs 585250661Sdavidcs sreloc = NULL; 586250661Sdavidcs 587250661Sdavidcs rel_end = relocs + sec->reloc_count; 588250661Sdavidcs for (rel = relocs; rel < rel_end; rel++) 589250661Sdavidcs { 590250661Sdavidcs unsigned long r_symndx; 591250661Sdavidcs struct elf_link_hash_entry *h; 592250661Sdavidcs 593250661Sdavidcs r_symndx = ELF64_R_SYM (rel->r_info); 594250661Sdavidcs 595250661Sdavidcs if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) 596250661Sdavidcs { 597250661Sdavidcs (*_bfd_error_handler) (_("%s: bad symbol index: %d"), 598250661Sdavidcs bfd_archive_filename (abfd), 599250661Sdavidcs r_symndx); 600250661Sdavidcs return false; 601250661Sdavidcs } 602250661Sdavidcs 603250661Sdavidcs if (r_symndx < symtab_hdr->sh_info) 604250661Sdavidcs h = NULL; 605250661Sdavidcs else 606250661Sdavidcs h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 607250661Sdavidcs 608250661Sdavidcs switch (ELF64_R_TYPE (rel->r_info)) 609250661Sdavidcs { 610250661Sdavidcs case R_390_GOT12: 611250661Sdavidcs case R_390_GOT16: 612250661Sdavidcs case R_390_GOT32: 613250661Sdavidcs case R_390_GOT64: 614250661Sdavidcs case R_390_GOTENT: 615250661Sdavidcs /* This symbol requires a global offset table entry. */ 616250661Sdavidcs if (h != NULL) 617250661Sdavidcs { 618250661Sdavidcs h->got.refcount += 1; 619250661Sdavidcs } 620250661Sdavidcs else 621250661Sdavidcs { 622250661Sdavidcs bfd_signed_vma *local_got_refcounts; 623250661Sdavidcs 624250661Sdavidcs /* This is a global offset table entry for a local symbol. */ 625250661Sdavidcs local_got_refcounts = elf_local_got_refcounts (abfd); 626250661Sdavidcs if (local_got_refcounts == NULL) 627250661Sdavidcs { 628250661Sdavidcs bfd_size_type size; 629250661Sdavidcs 630250661Sdavidcs size = symtab_hdr->sh_info; 631250661Sdavidcs size *= sizeof (bfd_signed_vma); 632250661Sdavidcs local_got_refcounts = ((bfd_signed_vma *) 633250661Sdavidcs bfd_zalloc (abfd, size)); 634250661Sdavidcs if (local_got_refcounts == NULL) 635250661Sdavidcs return false; 636250661Sdavidcs elf_local_got_refcounts (abfd) = local_got_refcounts; 637250661Sdavidcs } 638250661Sdavidcs local_got_refcounts[r_symndx] += 1; 639250661Sdavidcs } 640250661Sdavidcs /* Fall through */ 641250661Sdavidcs 642250661Sdavidcs case R_390_GOTOFF: 643250661Sdavidcs case R_390_GOTPC: 644250661Sdavidcs case R_390_GOTPCDBL: 645250661Sdavidcs if (htab->sgot == NULL) 646250661Sdavidcs { 647250661Sdavidcs if (htab->elf.dynobj == NULL) 648250661Sdavidcs htab->elf.dynobj = abfd; 649250661Sdavidcs if (!create_got_section (htab->elf.dynobj, info)) 650250661Sdavidcs return false; 651250661Sdavidcs } 652250661Sdavidcs break; 653250661Sdavidcs 654250661Sdavidcs case R_390_PLT16DBL: 655250661Sdavidcs case R_390_PLT32: 656250661Sdavidcs case R_390_PLT32DBL: 657250661Sdavidcs case R_390_PLT64: 658250661Sdavidcs /* This symbol requires a procedure linkage table entry. We 659250661Sdavidcs actually build the entry in adjust_dynamic_symbol, 660250661Sdavidcs because this might be a case of linking PIC code which is 661250661Sdavidcs never referenced by a dynamic object, in which case we 662250661Sdavidcs don't need to generate a procedure linkage table entry 663250661Sdavidcs after all. */ 664250661Sdavidcs 665250661Sdavidcs /* If this is a local symbol, we resolve it directly without 666250661Sdavidcs creating a procedure linkage table entry. */ 667250661Sdavidcs if (h == NULL) 668250661Sdavidcs continue; 669250661Sdavidcs 670250661Sdavidcs h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; 671250661Sdavidcs h->plt.refcount += 1; 672250661Sdavidcs break; 673250661Sdavidcs 674250661Sdavidcs case R_390_8: 675250661Sdavidcs case R_390_16: 676250661Sdavidcs case R_390_32: 677250661Sdavidcs case R_390_64: 678250661Sdavidcs case R_390_PC16: 679250661Sdavidcs case R_390_PC16DBL: 680250661Sdavidcs case R_390_PC32: 681250661Sdavidcs case R_390_PC32DBL: 682250661Sdavidcs case R_390_PC64: 683250661Sdavidcs if (h != NULL && !info->shared) 684250661Sdavidcs { 685250661Sdavidcs /* If this reloc is in a read-only section, we might 686250661Sdavidcs need a copy reloc. We can't check reliably at this 687250661Sdavidcs stage whether the section is read-only, as input 688250661Sdavidcs sections have not yet been mapped to output sections. 689250661Sdavidcs Tentatively set the flag for now, and correct in 690250661Sdavidcs adjust_dynamic_symbol. */ 691250661Sdavidcs h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; 692250661Sdavidcs 693250661Sdavidcs /* We may need a .plt entry if the function this reloc 694250661Sdavidcs refers to is in a shared lib. */ 695250661Sdavidcs h->plt.refcount += 1; 696250661Sdavidcs } 697250661Sdavidcs 698250661Sdavidcs /* If we are creating a shared library, and this is a reloc 699250661Sdavidcs against a global symbol, or a non PC relative reloc 700250661Sdavidcs against a local symbol, then we need to copy the reloc 701250661Sdavidcs into the shared library. However, if we are linking with 702250661Sdavidcs -Bsymbolic, we do not need to copy a reloc against a 703250661Sdavidcs global symbol which is defined in an object we are 704250661Sdavidcs including in the link (i.e., DEF_REGULAR is set). At 705250661Sdavidcs this point we have not seen all the input files, so it is 706250661Sdavidcs possible that DEF_REGULAR is not set now but will be set 707250661Sdavidcs later (it is never cleared). In case of a weak definition, 708250661Sdavidcs DEF_REGULAR may be cleared later by a strong definition in 709250661Sdavidcs a shared library. We account for that possibility below by 710250661Sdavidcs storing information in the relocs_copied field of the hash 711250661Sdavidcs table entry. A similar situation occurs when creating 712250661Sdavidcs shared libraries and symbol visibility changes render the 713250661Sdavidcs symbol local. 714250661Sdavidcs 715250661Sdavidcs If on the other hand, we are creating an executable, we 716250661Sdavidcs may need to keep relocations for symbols satisfied by a 717250661Sdavidcs dynamic library if we manage to avoid copy relocs for the 718250661Sdavidcs symbol. */ 719250661Sdavidcs if ((info->shared 720250661Sdavidcs && (sec->flags & SEC_ALLOC) != 0 721250661Sdavidcs && ((ELF64_R_TYPE (rel->r_info) != R_390_PC16 722250661Sdavidcs && ELF64_R_TYPE (rel->r_info) != R_390_PC16DBL 723250661Sdavidcs && ELF64_R_TYPE (rel->r_info) != R_390_PC32 724250661Sdavidcs && ELF64_R_TYPE (rel->r_info) != R_390_PC32DBL 725250661Sdavidcs && ELF64_R_TYPE (rel->r_info) != R_390_PC64) 726250661Sdavidcs || (h != NULL 727250661Sdavidcs && (! info->symbolic 728250661Sdavidcs || h->root.type == bfd_link_hash_defweak 729250661Sdavidcs || (h->elf_link_hash_flags 730250661Sdavidcs & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 731250661Sdavidcs || (!info->shared 732250661Sdavidcs && (sec->flags & SEC_ALLOC) != 0 733250661Sdavidcs && h != NULL 734250661Sdavidcs && (h->root.type == bfd_link_hash_defweak 735250661Sdavidcs || (h->elf_link_hash_flags 736250661Sdavidcs & ELF_LINK_HASH_DEF_REGULAR) == 0))) 737250661Sdavidcs { 738250661Sdavidcs struct elf_s390_dyn_relocs *p; 739250661Sdavidcs struct elf_s390_dyn_relocs **head; 740250661Sdavidcs 741250661Sdavidcs /* We must copy these reloc types into the output file. 742250661Sdavidcs Create a reloc section in dynobj and make room for 743250661Sdavidcs this reloc. */ 744250661Sdavidcs if (sreloc == NULL) 745250661Sdavidcs { 746250661Sdavidcs const char *name; 747250661Sdavidcs bfd *dynobj; 748250661Sdavidcs 749250661Sdavidcs name = (bfd_elf_string_from_elf_section 750250661Sdavidcs (abfd, 751250661Sdavidcs elf_elfheader (abfd)->e_shstrndx, 752250661Sdavidcs elf_section_data (sec)->rel_hdr.sh_name)); 753250661Sdavidcs if (name == NULL) 754250661Sdavidcs return false; 755250661Sdavidcs 756250661Sdavidcs if (strncmp (name, ".rela", 5) != 0 757250661Sdavidcs || strcmp (bfd_get_section_name (abfd, sec), 758250661Sdavidcs name + 5) != 0) 759250661Sdavidcs { 760250661Sdavidcs (*_bfd_error_handler) 761250661Sdavidcs (_("%s: bad relocation section name `%s\'"), 762250661Sdavidcs bfd_archive_filename (abfd), name); 763250661Sdavidcs } 764250661Sdavidcs 765250661Sdavidcs if (htab->elf.dynobj == NULL) 766250661Sdavidcs htab->elf.dynobj = abfd; 767250661Sdavidcs 768250661Sdavidcs dynobj = htab->elf.dynobj; 769250661Sdavidcs sreloc = bfd_get_section_by_name (dynobj, name); 770250661Sdavidcs if (sreloc == NULL) 771250661Sdavidcs { 772250661Sdavidcs flagword flags; 773250661Sdavidcs 774250661Sdavidcs sreloc = bfd_make_section (dynobj, name); 775250661Sdavidcs flags = (SEC_HAS_CONTENTS | SEC_READONLY 776250661Sdavidcs | SEC_IN_MEMORY | SEC_LINKER_CREATED); 777250661Sdavidcs if ((sec->flags & SEC_ALLOC) != 0) 778250661Sdavidcs flags |= SEC_ALLOC | SEC_LOAD; 779250661Sdavidcs if (sreloc == NULL 780250661Sdavidcs || ! bfd_set_section_flags (dynobj, sreloc, flags) 781250661Sdavidcs || ! bfd_set_section_alignment (dynobj, sreloc, 3)) 782250661Sdavidcs return false; 783250661Sdavidcs } 784250661Sdavidcs elf_section_data (sec)->sreloc = sreloc; 785250661Sdavidcs } 786250661Sdavidcs 787250661Sdavidcs /* If this is a global symbol, we count the number of 788250661Sdavidcs relocations we need for this symbol. */ 789250661Sdavidcs if (h != NULL) 790250661Sdavidcs { 791250661Sdavidcs head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs; 792250661Sdavidcs } 793250661Sdavidcs else 794250661Sdavidcs { 795250661Sdavidcs /* Track dynamic relocs needed for local syms too. 796250661Sdavidcs We really need local syms available to do this 797250661Sdavidcs easily. Oh well. */ 798250661Sdavidcs 799250661Sdavidcs asection *s; 800250661Sdavidcs s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, 801250661Sdavidcs sec, r_symndx); 802250661Sdavidcs if (s == NULL) 803250661Sdavidcs return false; 804250661Sdavidcs 805250661Sdavidcs head = ((struct elf_s390_dyn_relocs **) 806250661Sdavidcs &elf_section_data (s)->local_dynrel); 807250661Sdavidcs } 808250661Sdavidcs 809250661Sdavidcs p = *head; 810250661Sdavidcs if (p == NULL || p->sec != sec) 811250661Sdavidcs { 812250661Sdavidcs bfd_size_type amt = sizeof *p; 813250661Sdavidcs p = ((struct elf_s390_dyn_relocs *) 814250661Sdavidcs bfd_alloc (htab->elf.dynobj, amt)); 815250661Sdavidcs if (p == NULL) 816250661Sdavidcs return false; 817250661Sdavidcs p->next = *head; 818250661Sdavidcs *head = p; 819250661Sdavidcs p->sec = sec; 820250661Sdavidcs p->count = 0; 821250661Sdavidcs p->pc_count = 0; 822250661Sdavidcs } 823250661Sdavidcs 824250661Sdavidcs p->count += 1; 825250661Sdavidcs if (ELF64_R_TYPE (rel->r_info) == R_390_PC16 826250661Sdavidcs || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL 827250661Sdavidcs || ELF64_R_TYPE (rel->r_info) == R_390_PC32 828250661Sdavidcs || ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL 829250661Sdavidcs || ELF64_R_TYPE (rel->r_info) == R_390_PC64) 830250661Sdavidcs p->pc_count += 1; 831250661Sdavidcs } 832250661Sdavidcs break; 833250661Sdavidcs 834250661Sdavidcs /* This relocation describes the C++ object vtable hierarchy. 835250661Sdavidcs Reconstruct it for later use during GC. */ 836250661Sdavidcs case R_390_GNU_VTINHERIT: 837250661Sdavidcs if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 838250661Sdavidcs return false; 839250661Sdavidcs break; 840250661Sdavidcs 841250661Sdavidcs /* This relocation describes which C++ vtable entries are actually 842250661Sdavidcs used. Record for later use during GC. */ 843250661Sdavidcs case R_390_GNU_VTENTRY: 844250661Sdavidcs if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 845250661Sdavidcs return false; 846250661Sdavidcs break; 847250661Sdavidcs 848250661Sdavidcs default: 849250661Sdavidcs break; 850250661Sdavidcs } 851250661Sdavidcs } 852250661Sdavidcs 853250661Sdavidcs return true; 854250661Sdavidcs} 855250661Sdavidcs 856250661Sdavidcs/* Return the section that should be marked against GC for a given 857250661Sdavidcs relocation. */ 858250661Sdavidcs 859250661Sdavidcsstatic asection * 860250661Sdavidcself_s390_gc_mark_hook (sec, info, rel, h, sym) 861250661Sdavidcs asection *sec; 862250661Sdavidcs struct bfd_link_info *info ATTRIBUTE_UNUSED; 863250661Sdavidcs Elf_Internal_Rela *rel; 864250661Sdavidcs struct elf_link_hash_entry *h; 865250661Sdavidcs Elf_Internal_Sym *sym; 866250661Sdavidcs{ 867250661Sdavidcs if (h != NULL) 868250661Sdavidcs { 869250661Sdavidcs switch (ELF64_R_TYPE (rel->r_info)) 870250661Sdavidcs { 871250661Sdavidcs case R_390_GNU_VTINHERIT: 872250661Sdavidcs case R_390_GNU_VTENTRY: 873250661Sdavidcs break; 874250661Sdavidcs 875250661Sdavidcs default: 876250661Sdavidcs switch (h->root.type) 877250661Sdavidcs { 878250661Sdavidcs case bfd_link_hash_defined: 879250661Sdavidcs case bfd_link_hash_defweak: 880250661Sdavidcs return h->root.u.def.section; 881250661Sdavidcs 882250661Sdavidcs case bfd_link_hash_common: 883250661Sdavidcs return h->root.u.c.p->section; 884250661Sdavidcs 885250661Sdavidcs default: 886250661Sdavidcs break; 887250661Sdavidcs } 888250661Sdavidcs } 889250661Sdavidcs } 890250661Sdavidcs else 891250661Sdavidcs return bfd_section_from_elf_index (sec->owner, sym->st_shndx); 892250661Sdavidcs 893250661Sdavidcs return NULL; 894250661Sdavidcs} 895250661Sdavidcs 896250661Sdavidcs/* Update the got entry reference counts for the section being removed. */ 897250661Sdavidcs 898250661Sdavidcsstatic boolean 899250661Sdavidcself_s390_gc_sweep_hook (abfd, info, sec, relocs) 900250661Sdavidcs bfd *abfd; 901250661Sdavidcs struct bfd_link_info *info; 902250661Sdavidcs asection *sec; 903250661Sdavidcs const Elf_Internal_Rela *relocs; 904250661Sdavidcs{ 905250661Sdavidcs Elf_Internal_Shdr *symtab_hdr; 906250661Sdavidcs struct elf_link_hash_entry **sym_hashes; 907250661Sdavidcs bfd_signed_vma *local_got_refcounts; 908250661Sdavidcs const Elf_Internal_Rela *rel, *relend; 909250661Sdavidcs unsigned long r_symndx; 910250661Sdavidcs struct elf_link_hash_entry *h; 911250661Sdavidcs 912250661Sdavidcs elf_section_data (sec)->local_dynrel = NULL; 913250661Sdavidcs 914250661Sdavidcs symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 915250661Sdavidcs sym_hashes = elf_sym_hashes (abfd); 916250661Sdavidcs local_got_refcounts = elf_local_got_refcounts (abfd); 917250661Sdavidcs 918250661Sdavidcs relend = relocs + sec->reloc_count; 919250661Sdavidcs for (rel = relocs; rel < relend; rel++) 920250661Sdavidcs switch (ELF64_R_TYPE (rel->r_info)) 921250661Sdavidcs { 922250661Sdavidcs case R_390_GOT12: 923250661Sdavidcs case R_390_GOT16: 924250661Sdavidcs case R_390_GOT32: 925250661Sdavidcs case R_390_GOT64: 926250661Sdavidcs case R_390_GOTOFF: 927250661Sdavidcs case R_390_GOTPC: 928250661Sdavidcs case R_390_GOTPCDBL: 929250661Sdavidcs case R_390_GOTENT: 930250661Sdavidcs r_symndx = ELF64_R_SYM (rel->r_info); 931250661Sdavidcs if (r_symndx >= symtab_hdr->sh_info) 932250661Sdavidcs { 933250661Sdavidcs h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 934250661Sdavidcs if (h->got.refcount > 0) 935250661Sdavidcs h->got.refcount -= 1; 936250661Sdavidcs } 937250661Sdavidcs else if (local_got_refcounts != NULL) 938250661Sdavidcs { 939250661Sdavidcs if (local_got_refcounts[r_symndx] > 0) 940250661Sdavidcs local_got_refcounts[r_symndx] -= 1; 941250661Sdavidcs } 942250661Sdavidcs break; 943250661Sdavidcs 944250661Sdavidcs case R_390_8: 945250661Sdavidcs case R_390_12: 946250661Sdavidcs case R_390_16: 947250661Sdavidcs case R_390_32: 948250661Sdavidcs case R_390_64: 949250661Sdavidcs case R_390_PC16: 950250661Sdavidcs case R_390_PC16DBL: 951250661Sdavidcs case R_390_PC32: 952250661Sdavidcs case R_390_PC32DBL: 953250661Sdavidcs case R_390_PC64: 954250661Sdavidcs r_symndx = ELF64_R_SYM (rel->r_info); 955250661Sdavidcs if (r_symndx >= symtab_hdr->sh_info) 956250661Sdavidcs { 957250661Sdavidcs struct elf_s390_link_hash_entry *eh; 958250661Sdavidcs struct elf_s390_dyn_relocs **pp; 959250661Sdavidcs struct elf_s390_dyn_relocs *p; 960250661Sdavidcs 961250661Sdavidcs h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 962250661Sdavidcs 963250661Sdavidcs if (!info->shared && h->plt.refcount > 0) 964250661Sdavidcs h->plt.refcount -= 1; 965250661Sdavidcs 966250661Sdavidcs eh = (struct elf_s390_link_hash_entry *) h; 967250661Sdavidcs 968250661Sdavidcs for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) 969250661Sdavidcs if (p->sec == sec) 970250661Sdavidcs { 971250661Sdavidcs if (ELF64_R_TYPE (rel->r_info) == R_390_PC16 972250661Sdavidcs || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL 973250661Sdavidcs || ELF64_R_TYPE (rel->r_info) == R_390_PC32) 974250661Sdavidcs p->pc_count -= 1; 975250661Sdavidcs p->count -= 1; 976250661Sdavidcs if (p->count == 0) 977250661Sdavidcs *pp = p->next; 978250661Sdavidcs break; 979250661Sdavidcs } 980250661Sdavidcs } 981250661Sdavidcs break; 982250661Sdavidcs 983250661Sdavidcs case R_390_PLT16DBL: 984250661Sdavidcs case R_390_PLT32: 985250661Sdavidcs case R_390_PLT32DBL: 986250661Sdavidcs case R_390_PLT64: 987250661Sdavidcs r_symndx = ELF64_R_SYM (rel->r_info); 988250661Sdavidcs if (r_symndx >= symtab_hdr->sh_info) 989250661Sdavidcs { 990250661Sdavidcs h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 991250661Sdavidcs if (h->plt.refcount > 0) 992250661Sdavidcs h->plt.refcount -= 1; 993250661Sdavidcs } 994250661Sdavidcs break; 995250661Sdavidcs 996250661Sdavidcs default: 997250661Sdavidcs break; 998250661Sdavidcs } 999250661Sdavidcs 1000250661Sdavidcs return true; 1001250661Sdavidcs} 1002250661Sdavidcs 1003250661Sdavidcs/* Adjust a symbol defined by a dynamic object and referenced by a 1004250661Sdavidcs regular object. The current definition is in some section of the 1005250661Sdavidcs dynamic object, but we're not including those sections. We have to 1006250661Sdavidcs change the definition to something the rest of the link can 1007250661Sdavidcs understand. */ 1008250661Sdavidcs 1009250661Sdavidcsstatic boolean 1010250661Sdavidcself_s390_adjust_dynamic_symbol (info, h) 1011250661Sdavidcs struct bfd_link_info *info; 1012250661Sdavidcs struct elf_link_hash_entry *h; 1013250661Sdavidcs{ 1014250661Sdavidcs struct elf_s390_link_hash_table *htab; 1015250661Sdavidcs struct elf_s390_link_hash_entry * eh; 1016250661Sdavidcs struct elf_s390_dyn_relocs *p; 1017250661Sdavidcs asection *s; 1018250661Sdavidcs unsigned int power_of_two; 1019250661Sdavidcs 1020250661Sdavidcs /* If this is a function, put it in the procedure linkage table. We 1021250661Sdavidcs will fill in the contents of the procedure linkage table later 1022250661Sdavidcs (although we could actually do it here). */ 1023250661Sdavidcs if (h->type == STT_FUNC 1024250661Sdavidcs || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) 1025250661Sdavidcs { 1026250661Sdavidcs if (h->plt.refcount <= 0 1027250661Sdavidcs || (! info->shared 1028250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 1029250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0 1030250661Sdavidcs && h->root.type != bfd_link_hash_undefweak 1031250661Sdavidcs && h->root.type != bfd_link_hash_undefined)) 1032250661Sdavidcs { 1033250661Sdavidcs /* This case can occur if we saw a PLT32 reloc in an input 1034250661Sdavidcs file, but the symbol was never referred to by a dynamic 1035250661Sdavidcs object, or if all references were garbage collected. In 1036250661Sdavidcs such a case, we don't actually need to build a procedure 1037250661Sdavidcs linkage table, and we can just do a PC32 reloc instead. */ 1038250661Sdavidcs h->plt.offset = (bfd_vma) -1; 1039250661Sdavidcs h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 1040250661Sdavidcs } 1041250661Sdavidcs 1042250661Sdavidcs return true; 1043250661Sdavidcs } 1044250661Sdavidcs else 1045250661Sdavidcs /* It's possible that we incorrectly decided a .plt reloc was 1046250661Sdavidcs needed for an R_390_PC32 reloc to a non-function sym in 1047250661Sdavidcs check_relocs. We can't decide accurately between function and 1048250661Sdavidcs non-function syms in check-relocs; Objects loaded later in 1049250661Sdavidcs the link may change h->type. So fix it now. */ 1050250661Sdavidcs h->plt.offset = (bfd_vma) -1; 1051250661Sdavidcs 1052250661Sdavidcs /* If this is a weak symbol, and there is a real definition, the 1053250661Sdavidcs processor independent code will have arranged for us to see the 1054250661Sdavidcs real definition first, and we can just use the same value. */ 1055250661Sdavidcs if (h->weakdef != NULL) 1056250661Sdavidcs { 1057250661Sdavidcs BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined 1058250661Sdavidcs || h->weakdef->root.type == bfd_link_hash_defweak); 1059250661Sdavidcs h->root.u.def.section = h->weakdef->root.u.def.section; 1060250661Sdavidcs h->root.u.def.value = h->weakdef->root.u.def.value; 1061250661Sdavidcs return true; 1062250661Sdavidcs } 1063250661Sdavidcs 1064250661Sdavidcs /* This is a reference to a symbol defined by a dynamic object which 1065250661Sdavidcs is not a function. */ 1066250661Sdavidcs 1067250661Sdavidcs /* If we are creating a shared library, we must presume that the 1068250661Sdavidcs only references to the symbol are via the global offset table. 1069250661Sdavidcs For such cases we need not do anything here; the relocations will 1070250661Sdavidcs be handled correctly by relocate_section. */ 1071250661Sdavidcs if (info->shared) 1072250661Sdavidcs return true; 1073250661Sdavidcs 1074250661Sdavidcs /* If there are no references to this symbol that do not use the 1075250661Sdavidcs GOT, we don't need to generate a copy reloc. */ 1076250661Sdavidcs if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0) 1077250661Sdavidcs return true; 1078258898Sdavidcs 1079258898Sdavidcs /* If -z nocopyreloc was given, we won't generate them either. */ 1080258898Sdavidcs if (info->nocopyreloc) 1081258898Sdavidcs { 1082258898Sdavidcs h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF; 1083250661Sdavidcs return true; 1084250661Sdavidcs } 1085250661Sdavidcs 1086250661Sdavidcs eh = (struct elf_s390_link_hash_entry *) h; 1087250661Sdavidcs for (p = eh->dyn_relocs; p != NULL; p = p->next) 1088250661Sdavidcs { 1089250661Sdavidcs s = p->sec->output_section; 1090250661Sdavidcs if (s != NULL && (s->flags & SEC_READONLY) != 0) 1091250661Sdavidcs break; 1092250661Sdavidcs } 1093250661Sdavidcs 1094250661Sdavidcs /* If we didn't find any dynamic relocs in read-only sections, then 1095250661Sdavidcs we'll be keeping the dynamic relocs and avoiding the copy reloc. */ 1096250661Sdavidcs if (p == NULL) 1097250661Sdavidcs { 1098250661Sdavidcs h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF; 1099250661Sdavidcs return true; 1100250661Sdavidcs } 1101250661Sdavidcs 1102250661Sdavidcs /* We must allocate the symbol in our .dynbss section, which will 1103250661Sdavidcs become part of the .bss section of the executable. There will be 1104250661Sdavidcs an entry for this symbol in the .dynsym section. The dynamic 1105250661Sdavidcs object will contain position independent code, so all references 1106250661Sdavidcs from the dynamic object to this symbol will go through the global 1107250661Sdavidcs offset table. The dynamic linker will use the .dynsym entry to 1108250661Sdavidcs determine the address it must put in the global offset table, so 1109250661Sdavidcs both the dynamic object and the regular object will refer to the 1110250661Sdavidcs same memory location for the variable. */ 1111250661Sdavidcs 1112250661Sdavidcs htab = elf_s390_hash_table (info); 1113250661Sdavidcs 1114250661Sdavidcs /* We must generate a R_390_COPY reloc to tell the dynamic linker to 1115250661Sdavidcs copy the initial value out of the dynamic object and into the 1116250661Sdavidcs runtime process image. */ 1117250661Sdavidcs if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) 1118250661Sdavidcs { 1119250661Sdavidcs htab->srelbss->_raw_size += sizeof (Elf64_External_Rela); 1120250661Sdavidcs h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY; 1121250661Sdavidcs } 1122250661Sdavidcs 1123250661Sdavidcs /* We need to figure out the alignment required for this symbol. I 1124250661Sdavidcs have no idea how ELF linkers handle this. */ 1125250661Sdavidcs power_of_two = bfd_log2 (h->size); 1126250661Sdavidcs if (power_of_two > 3) 1127250661Sdavidcs power_of_two = 3; 1128250661Sdavidcs 1129250661Sdavidcs /* Apply the required alignment. */ 1130250661Sdavidcs s = htab->sdynbss; 1131250661Sdavidcs s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two)); 1132250661Sdavidcs if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s)) 1133250661Sdavidcs { 1134250661Sdavidcs if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two)) 1135250661Sdavidcs return false; 1136250661Sdavidcs } 1137250661Sdavidcs 1138250661Sdavidcs /* Define the symbol as being at this point in the section. */ 1139250661Sdavidcs h->root.u.def.section = s; 1140250661Sdavidcs h->root.u.def.value = s->_raw_size; 1141250661Sdavidcs 1142250661Sdavidcs /* Increment the section size to make room for the symbol. */ 1143250661Sdavidcs s->_raw_size += h->size; 1144250661Sdavidcs 1145250661Sdavidcs return true; 1146250661Sdavidcs} 1147250661Sdavidcs 1148250661Sdavidcs/* This is the condition under which elf_s390_finish_dynamic_symbol 1149250661Sdavidcs will be called from elflink.h. If elflink.h doesn't call our 1150250661Sdavidcs finish_dynamic_symbol routine, we'll need to do something about 1151250661Sdavidcs initializing any .plt and .got entries in elf_s390_relocate_section. */ 1152250661Sdavidcs#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \ 1153250661Sdavidcs ((DYN) \ 1154250661Sdavidcs && ((INFO)->shared \ 1155250661Sdavidcs || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \ 1156250661Sdavidcs && ((H)->dynindx != -1 \ 1157250661Sdavidcs || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)) 1158250661Sdavidcs 1159250661Sdavidcs/* Allocate space in .plt, .got and associated reloc sections for 1160250661Sdavidcs dynamic relocs. */ 1161250661Sdavidcs 1162250661Sdavidcsstatic boolean 1163250661Sdavidcsallocate_dynrelocs (h, inf) 1164250661Sdavidcs struct elf_link_hash_entry *h; 1165250661Sdavidcs PTR inf; 1166250661Sdavidcs{ 1167250661Sdavidcs struct bfd_link_info *info; 1168250661Sdavidcs struct elf_s390_link_hash_table *htab; 1169250661Sdavidcs struct elf_s390_link_hash_entry *eh; 1170250661Sdavidcs struct elf_s390_dyn_relocs *p; 1171250661Sdavidcs 1172250661Sdavidcs if (h->root.type == bfd_link_hash_indirect) 1173250661Sdavidcs return true; 1174250661Sdavidcs 1175250661Sdavidcs if (h->root.type == bfd_link_hash_warning) 1176250661Sdavidcs h = (struct elf_link_hash_entry *) h->root.u.i.link; 1177250661Sdavidcs 1178250661Sdavidcs info = (struct bfd_link_info *) inf; 1179250661Sdavidcs htab = elf_s390_hash_table (info); 1180250661Sdavidcs 1181250661Sdavidcs if (htab->elf.dynamic_sections_created 1182250661Sdavidcs && h->plt.refcount > 0) 1183250661Sdavidcs { 1184250661Sdavidcs /* Make sure this symbol is output as a dynamic symbol. 1185250661Sdavidcs Undefined weak syms won't yet be marked as dynamic. */ 1186250661Sdavidcs if (h->dynindx == -1 1187250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 1188250661Sdavidcs { 1189250661Sdavidcs if (! bfd_elf64_link_record_dynamic_symbol (info, h)) 1190250661Sdavidcs return false; 1191250661Sdavidcs } 1192250661Sdavidcs 1193250661Sdavidcs if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h)) 1194250661Sdavidcs { 1195250661Sdavidcs asection *s = htab->splt; 1196250661Sdavidcs 1197250661Sdavidcs /* If this is the first .plt entry, make room for the special 1198250661Sdavidcs first entry. */ 1199250661Sdavidcs if (s->_raw_size == 0) 1200250661Sdavidcs s->_raw_size += PLT_FIRST_ENTRY_SIZE; 1201250661Sdavidcs 1202250661Sdavidcs h->plt.offset = s->_raw_size; 1203250661Sdavidcs 1204250661Sdavidcs /* If this symbol is not defined in a regular file, and we are 1205250661Sdavidcs not generating a shared library, then set the symbol to this 1206250661Sdavidcs location in the .plt. This is required to make function 1207250661Sdavidcs pointers compare as equal between the normal executable and 1208250661Sdavidcs the shared library. */ 1209250661Sdavidcs if (! info->shared 1210250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 1211250661Sdavidcs { 1212250661Sdavidcs h->root.u.def.section = s; 1213250661Sdavidcs h->root.u.def.value = h->plt.offset; 1214250661Sdavidcs } 1215250661Sdavidcs 1216250661Sdavidcs /* Make room for this entry. */ 1217250661Sdavidcs s->_raw_size += PLT_ENTRY_SIZE; 1218250661Sdavidcs 1219250661Sdavidcs /* We also need to make an entry in the .got.plt section, which 1220250661Sdavidcs will be placed in the .got section by the linker script. */ 1221250661Sdavidcs htab->sgotplt->_raw_size += GOT_ENTRY_SIZE; 1222250661Sdavidcs 1223250661Sdavidcs /* We also need to make an entry in the .rela.plt section. */ 1224250661Sdavidcs htab->srelplt->_raw_size += sizeof (Elf64_External_Rela); 1225250661Sdavidcs } 1226250661Sdavidcs else 1227250661Sdavidcs { 1228250661Sdavidcs h->plt.offset = (bfd_vma) -1; 1229250661Sdavidcs h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 1230250661Sdavidcs } 1231250661Sdavidcs } 1232250661Sdavidcs else 1233250661Sdavidcs { 1234250661Sdavidcs h->plt.offset = (bfd_vma) -1; 1235250661Sdavidcs h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; 1236250661Sdavidcs } 1237250661Sdavidcs 1238250661Sdavidcs if (h->got.refcount > 0) 1239250661Sdavidcs { 1240250661Sdavidcs asection *s; 1241250661Sdavidcs boolean dyn; 1242250661Sdavidcs 1243250661Sdavidcs /* Make sure this symbol is output as a dynamic symbol. 1244250661Sdavidcs Undefined weak syms won't yet be marked as dynamic. */ 1245250661Sdavidcs if (h->dynindx == -1 1246250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 1247250661Sdavidcs { 1248250661Sdavidcs if (! bfd_elf64_link_record_dynamic_symbol (info, h)) 1249250661Sdavidcs return false; 1250250661Sdavidcs } 1251250661Sdavidcs 1252250661Sdavidcs s = htab->sgot; 1253250661Sdavidcs h->got.offset = s->_raw_size; 1254250661Sdavidcs s->_raw_size += GOT_ENTRY_SIZE; 1255250661Sdavidcs dyn = htab->elf.dynamic_sections_created; 1256250661Sdavidcs if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)) 1257250661Sdavidcs htab->srelgot->_raw_size += sizeof (Elf64_External_Rela); 1258250661Sdavidcs } 1259250661Sdavidcs else 1260250661Sdavidcs h->got.offset = (bfd_vma) -1; 1261250661Sdavidcs 1262250661Sdavidcs eh = (struct elf_s390_link_hash_entry *) h; 1263250661Sdavidcs if (eh->dyn_relocs == NULL) 1264250661Sdavidcs return true; 1265250661Sdavidcs 1266250661Sdavidcs /* In the shared -Bsymbolic case, discard space allocated for 1267250661Sdavidcs dynamic pc-relative relocs against symbols which turn out to be 1268250661Sdavidcs defined in regular objects. For the normal shared case, discard 1269250661Sdavidcs space for pc-relative relocs that have become local due to symbol 1270250661Sdavidcs visibility changes. */ 1271250661Sdavidcs 1272250661Sdavidcs if (info->shared) 1273250661Sdavidcs { 1274250661Sdavidcs if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0 1275250661Sdavidcs && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0 1276250661Sdavidcs || info->symbolic)) 1277250661Sdavidcs { 1278250661Sdavidcs struct elf_s390_dyn_relocs **pp; 1279250661Sdavidcs 1280250661Sdavidcs for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 1281250661Sdavidcs { 1282250661Sdavidcs p->count -= p->pc_count; 1283250661Sdavidcs p->pc_count = 0; 1284250661Sdavidcs if (p->count == 0) 1285250661Sdavidcs *pp = p->next; 1286250661Sdavidcs else 1287250661Sdavidcs pp = &p->next; 1288250661Sdavidcs } 1289250661Sdavidcs } 1290250661Sdavidcs } 1291250661Sdavidcs else 1292250661Sdavidcs { 1293250661Sdavidcs /* For the non-shared case, discard space for relocs against 1294250661Sdavidcs symbols which turn out to need copy relocs or are not 1295250661Sdavidcs dynamic. */ 1296250661Sdavidcs 1297250661Sdavidcs if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 1298250661Sdavidcs && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 1299250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 1300250661Sdavidcs || (htab->elf.dynamic_sections_created 1301250661Sdavidcs && (h->root.type == bfd_link_hash_undefweak 1302250661Sdavidcs || h->root.type == bfd_link_hash_undefined)))) 1303250661Sdavidcs { 1304250661Sdavidcs /* Make sure this symbol is output as a dynamic symbol. 1305250661Sdavidcs Undefined weak syms won't yet be marked as dynamic. */ 1306250661Sdavidcs if (h->dynindx == -1 1307250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) 1308250661Sdavidcs { 1309250661Sdavidcs if (! bfd_elf64_link_record_dynamic_symbol (info, h)) 1310250661Sdavidcs return false; 1311250661Sdavidcs } 1312250661Sdavidcs 1313250661Sdavidcs /* If that succeeded, we know we'll be keeping all the 1314250661Sdavidcs relocs. */ 1315250661Sdavidcs if (h->dynindx != -1) 1316250661Sdavidcs goto keep; 1317250661Sdavidcs } 1318250661Sdavidcs 1319250661Sdavidcs eh->dyn_relocs = NULL; 1320250661Sdavidcs 1321250661Sdavidcs keep: ; 1322250661Sdavidcs } 1323250661Sdavidcs 1324250661Sdavidcs /* Finally, allocate space. */ 1325250661Sdavidcs for (p = eh->dyn_relocs; p != NULL; p = p->next) 1326250661Sdavidcs { 1327250661Sdavidcs asection *sreloc = elf_section_data (p->sec)->sreloc; 1328250661Sdavidcs sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela); 1329250661Sdavidcs } 1330250661Sdavidcs 1331250661Sdavidcs return true; 1332250661Sdavidcs} 1333250661Sdavidcs 1334250661Sdavidcs/* Find any dynamic relocs that apply to read-only sections. */ 1335250661Sdavidcs 1336250661Sdavidcsstatic boolean 1337250661Sdavidcsreadonly_dynrelocs (h, inf) 1338250661Sdavidcs struct elf_link_hash_entry *h; 1339250661Sdavidcs PTR inf; 1340250661Sdavidcs{ 1341250661Sdavidcs struct elf_s390_link_hash_entry *eh; 1342250661Sdavidcs struct elf_s390_dyn_relocs *p; 1343250661Sdavidcs 1344250661Sdavidcs if (h->root.type == bfd_link_hash_warning) 1345250661Sdavidcs h = (struct elf_link_hash_entry *) h->root.u.i.link; 1346250661Sdavidcs 1347250661Sdavidcs eh = (struct elf_s390_link_hash_entry *) h; 1348250661Sdavidcs for (p = eh->dyn_relocs; p != NULL; p = p->next) 1349250661Sdavidcs { 1350250661Sdavidcs asection *s = p->sec->output_section; 1351250661Sdavidcs 1352250661Sdavidcs if (s != NULL && (s->flags & SEC_READONLY) != 0) 1353250661Sdavidcs { 1354250661Sdavidcs struct bfd_link_info *info = (struct bfd_link_info *) inf; 1355250661Sdavidcs 1356250661Sdavidcs info->flags |= DF_TEXTREL; 1357250661Sdavidcs 1358250661Sdavidcs /* Not an error, just cut short the traversal. */ 1359250661Sdavidcs return false; 1360250661Sdavidcs } 1361250661Sdavidcs } 1362250661Sdavidcs return true; 1363250661Sdavidcs} 1364250661Sdavidcs 1365250661Sdavidcs/* Set the sizes of the dynamic sections. */ 1366250661Sdavidcs 1367250661Sdavidcsstatic boolean 1368250661Sdavidcself_s390_size_dynamic_sections (output_bfd, info) 1369250661Sdavidcs bfd *output_bfd ATTRIBUTE_UNUSED; 1370250661Sdavidcs struct bfd_link_info *info; 1371250661Sdavidcs{ 1372250661Sdavidcs struct elf_s390_link_hash_table *htab; 1373250661Sdavidcs bfd *dynobj; 1374250661Sdavidcs asection *s; 1375250661Sdavidcs boolean relocs; 1376250661Sdavidcs bfd *ibfd; 1377250661Sdavidcs 1378250661Sdavidcs htab = elf_s390_hash_table (info); 1379250661Sdavidcs dynobj = htab->elf.dynobj; 1380250661Sdavidcs if (dynobj == NULL) 1381250661Sdavidcs abort (); 1382250661Sdavidcs 1383250661Sdavidcs if (htab->elf.dynamic_sections_created) 1384250661Sdavidcs { 1385250661Sdavidcs /* Set the contents of the .interp section to the interpreter. */ 1386250661Sdavidcs if (! info->shared) 1387250661Sdavidcs { 1388250661Sdavidcs s = bfd_get_section_by_name (dynobj, ".interp"); 1389250661Sdavidcs if (s == NULL) 1390250661Sdavidcs abort (); 1391250661Sdavidcs s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; 1392250661Sdavidcs s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 1393250661Sdavidcs } 1394250661Sdavidcs } 1395250661Sdavidcs 1396250661Sdavidcs /* Set up .got offsets for local syms, and space for local dynamic 1397250661Sdavidcs relocs. */ 1398250661Sdavidcs for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) 1399250661Sdavidcs { 1400250661Sdavidcs bfd_signed_vma *local_got; 1401250661Sdavidcs bfd_signed_vma *end_local_got; 1402250661Sdavidcs bfd_size_type locsymcount; 1403250661Sdavidcs Elf_Internal_Shdr *symtab_hdr; 1404250661Sdavidcs asection *srela; 1405250661Sdavidcs 1406250661Sdavidcs if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 1407250661Sdavidcs continue; 1408250661Sdavidcs 1409250661Sdavidcs for (s = ibfd->sections; s != NULL; s = s->next) 1410250661Sdavidcs { 1411250661Sdavidcs struct elf_s390_dyn_relocs *p; 1412250661Sdavidcs 1413250661Sdavidcs for (p = *((struct elf_s390_dyn_relocs **) 1414250661Sdavidcs &elf_section_data (s)->local_dynrel); 1415250661Sdavidcs p != NULL; 1416250661Sdavidcs p = p->next) 1417250661Sdavidcs { 1418250661Sdavidcs if (!bfd_is_abs_section (p->sec) 1419250661Sdavidcs && bfd_is_abs_section (p->sec->output_section)) 1420250661Sdavidcs { 1421250661Sdavidcs /* Input section has been discarded, either because 1422250661Sdavidcs it is a copy of a linkonce section or due to 1423250661Sdavidcs linker script /DISCARD/, so we'll be discarding 1424250661Sdavidcs the relocs too. */ 1425250661Sdavidcs } 1426250661Sdavidcs else if (p->count != 0) 1427250661Sdavidcs { 1428250661Sdavidcs srela = elf_section_data (p->sec)->sreloc; 1429250661Sdavidcs srela->_raw_size += p->count * sizeof (Elf64_External_Rela); 1430250661Sdavidcs if ((p->sec->output_section->flags & SEC_READONLY) != 0) 1431250661Sdavidcs info->flags |= DF_TEXTREL; 1432250661Sdavidcs } 1433250661Sdavidcs } 1434250661Sdavidcs } 1435250661Sdavidcs 1436250661Sdavidcs local_got = elf_local_got_refcounts (ibfd); 1437250661Sdavidcs if (!local_got) 1438250661Sdavidcs continue; 1439250661Sdavidcs 1440250661Sdavidcs symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 1441250661Sdavidcs locsymcount = symtab_hdr->sh_info; 1442250661Sdavidcs end_local_got = local_got + locsymcount; 1443250661Sdavidcs s = htab->sgot; 1444250661Sdavidcs srela = htab->srelgot; 1445250661Sdavidcs for (; local_got < end_local_got; ++local_got) 1446250661Sdavidcs { 1447250661Sdavidcs if (*local_got > 0) 1448250661Sdavidcs { 1449250661Sdavidcs *local_got = s->_raw_size; 1450250661Sdavidcs s->_raw_size += GOT_ENTRY_SIZE; 1451250661Sdavidcs if (info->shared) 1452250661Sdavidcs srela->_raw_size += sizeof (Elf64_External_Rela); 1453250661Sdavidcs } 1454250661Sdavidcs else 1455250661Sdavidcs *local_got = (bfd_vma) -1; 1456250661Sdavidcs } 1457250661Sdavidcs } 1458250661Sdavidcs 1459250661Sdavidcs /* Allocate global sym .plt and .got entries, and space for global 1460250661Sdavidcs sym dynamic relocs. */ 1461250661Sdavidcs elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info); 1462250661Sdavidcs 1463250661Sdavidcs /* We now have determined the sizes of the various dynamic sections. 1464250661Sdavidcs Allocate memory for them. */ 1465250661Sdavidcs relocs = false; 1466250661Sdavidcs for (s = dynobj->sections; s != NULL; s = s->next) 1467250661Sdavidcs { 1468250661Sdavidcs if ((s->flags & SEC_LINKER_CREATED) == 0) 1469250661Sdavidcs continue; 1470250661Sdavidcs 1471250661Sdavidcs if (s == htab->splt 1472250661Sdavidcs || s == htab->sgot 1473250661Sdavidcs || s == htab->sgotplt) 1474250661Sdavidcs { 1475250661Sdavidcs /* Strip this section if we don't need it; see the 1476250661Sdavidcs comment below. */ 1477250661Sdavidcs } 1478250661Sdavidcs else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0) 1479250661Sdavidcs { 1480250661Sdavidcs if (s->_raw_size != 0 && s != htab->srelplt) 1481250661Sdavidcs relocs = true; 1482250661Sdavidcs 1483250661Sdavidcs /* We use the reloc_count field as a counter if we need 1484250661Sdavidcs to copy relocs into the output file. */ 1485250661Sdavidcs s->reloc_count = 0; 1486250661Sdavidcs } 1487250661Sdavidcs else 1488250661Sdavidcs { 1489250661Sdavidcs /* It's not one of our sections, so don't allocate space. */ 1490250661Sdavidcs continue; 1491250661Sdavidcs } 1492250661Sdavidcs 1493250661Sdavidcs if (s->_raw_size == 0) 1494250661Sdavidcs { 1495250661Sdavidcs /* If we don't need this section, strip it from the 1496250661Sdavidcs output file. This is to handle .rela.bss and 1497250661Sdavidcs .rela.plt. We must create it in 1498250661Sdavidcs create_dynamic_sections, because it must be created 1499250661Sdavidcs before the linker maps input sections to output 1500250661Sdavidcs sections. The linker does that before 1501250661Sdavidcs adjust_dynamic_symbol is called, and it is that 1502250661Sdavidcs function which decides whether anything needs to go 1503250661Sdavidcs into these sections. */ 1504250661Sdavidcs 1505250661Sdavidcs _bfd_strip_section_from_output (info, s); 1506250661Sdavidcs continue; 1507250661Sdavidcs } 1508250661Sdavidcs 1509250661Sdavidcs /* Allocate memory for the section contents. We use bfd_zalloc 1510250661Sdavidcs here in case unused entries are not reclaimed before the 1511250661Sdavidcs section's contents are written out. This should not happen, 1512250661Sdavidcs but this way if it does, we get a R_390_NONE reloc instead 1513250661Sdavidcs of garbage. */ 1514250661Sdavidcs s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size); 1515250661Sdavidcs if (s->contents == NULL) 1516250661Sdavidcs return false; 1517250661Sdavidcs } 1518250661Sdavidcs 1519250661Sdavidcs if (htab->elf.dynamic_sections_created) 1520250661Sdavidcs { 1521250661Sdavidcs /* Add some entries to the .dynamic section. We fill in the 1522250661Sdavidcs values later, in elf_s390_finish_dynamic_sections, but we 1523250661Sdavidcs must add the entries now so that we get the correct size for 1524250661Sdavidcs the .dynamic section. The DT_DEBUG entry is filled in by the 1525250661Sdavidcs dynamic linker and used by the debugger. */ 1526250661Sdavidcs#define add_dynamic_entry(TAG, VAL) \ 1527250661Sdavidcs bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL)) 1528250661Sdavidcs 1529250661Sdavidcs if (! info->shared) 1530250661Sdavidcs { 1531250661Sdavidcs if (!add_dynamic_entry (DT_DEBUG, 0)) 1532250661Sdavidcs return false; 1533250661Sdavidcs } 1534250661Sdavidcs 1535250661Sdavidcs if (htab->splt->_raw_size != 0) 1536250661Sdavidcs { 1537250661Sdavidcs if (!add_dynamic_entry (DT_PLTGOT, 0) 1538250661Sdavidcs || !add_dynamic_entry (DT_PLTRELSZ, 0) 1539250661Sdavidcs || !add_dynamic_entry (DT_PLTREL, DT_RELA) 1540250661Sdavidcs || !add_dynamic_entry (DT_JMPREL, 0)) 1541250661Sdavidcs return false; 1542250661Sdavidcs } 1543250661Sdavidcs 1544250661Sdavidcs if (relocs) 1545250661Sdavidcs { 1546250661Sdavidcs if (!add_dynamic_entry (DT_RELA, 0) 1547250661Sdavidcs || !add_dynamic_entry (DT_RELASZ, 0) 1548250661Sdavidcs || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela))) 1549250661Sdavidcs return false; 1550250661Sdavidcs 1551250661Sdavidcs /* If any dynamic relocs apply to a read-only section, 1552250661Sdavidcs then we need a DT_TEXTREL entry. */ 1553250661Sdavidcs if ((info->flags & DF_TEXTREL) == 0) 1554250661Sdavidcs elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, 1555250661Sdavidcs (PTR) info); 1556250661Sdavidcs 1557250661Sdavidcs if ((info->flags & DF_TEXTREL) != 0) 1558250661Sdavidcs { 1559250661Sdavidcs if (!add_dynamic_entry (DT_TEXTREL, 0)) 1560250661Sdavidcs return false; 1561250661Sdavidcs } 1562250661Sdavidcs } 1563250661Sdavidcs } 1564250661Sdavidcs#undef add_dynamic_entry 1565250661Sdavidcs 1566250661Sdavidcs return true; 1567250661Sdavidcs} 1568250661Sdavidcs 1569250661Sdavidcs/* Relocate a 390 ELF section. */ 1570250661Sdavidcs 1571250661Sdavidcsstatic boolean 1572250661Sdavidcself_s390_relocate_section (output_bfd, info, input_bfd, input_section, 1573250661Sdavidcs contents, relocs, local_syms, local_sections) 1574250661Sdavidcs bfd *output_bfd; 1575250661Sdavidcs struct bfd_link_info *info; 1576250661Sdavidcs bfd *input_bfd; 1577250661Sdavidcs asection *input_section; 1578250661Sdavidcs bfd_byte *contents; 1579250661Sdavidcs Elf_Internal_Rela *relocs; 1580250661Sdavidcs Elf_Internal_Sym *local_syms; 1581250661Sdavidcs asection **local_sections; 1582250661Sdavidcs{ 1583250661Sdavidcs struct elf_s390_link_hash_table *htab; 1584250661Sdavidcs Elf_Internal_Shdr *symtab_hdr; 1585250661Sdavidcs struct elf_link_hash_entry **sym_hashes; 1586250661Sdavidcs bfd_vma *local_got_offsets; 1587250661Sdavidcs Elf_Internal_Rela *rel; 1588250661Sdavidcs Elf_Internal_Rela *relend; 1589250661Sdavidcs 1590250661Sdavidcs if (info->relocateable) 1591250661Sdavidcs return true; 1592250661Sdavidcs 1593250661Sdavidcs htab = elf_s390_hash_table (info); 1594250661Sdavidcs symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 1595250661Sdavidcs sym_hashes = elf_sym_hashes (input_bfd); 1596250661Sdavidcs local_got_offsets = elf_local_got_offsets (input_bfd); 1597250661Sdavidcs 1598250661Sdavidcs rel = relocs; 1599250661Sdavidcs relend = relocs + input_section->reloc_count; 1600250661Sdavidcs for (; rel < relend; rel++) 1601250661Sdavidcs { 1602250661Sdavidcs int r_type; 1603250661Sdavidcs reloc_howto_type *howto; 1604250661Sdavidcs unsigned long r_symndx; 1605250661Sdavidcs struct elf_link_hash_entry *h; 1606250661Sdavidcs Elf_Internal_Sym *sym; 1607250661Sdavidcs asection *sec; 1608250661Sdavidcs bfd_vma off; 1609250661Sdavidcs bfd_vma relocation; 1610250661Sdavidcs boolean unresolved_reloc; 1611250661Sdavidcs bfd_reloc_status_type r; 1612250661Sdavidcs 1613250661Sdavidcs r_type = ELF64_R_TYPE (rel->r_info); 1614250661Sdavidcs if (r_type == (int) R_390_GNU_VTINHERIT 1615250661Sdavidcs || r_type == (int) R_390_GNU_VTENTRY) 1616250661Sdavidcs continue; 1617250661Sdavidcs if (r_type < 0 || r_type >= (int) R_390_max) 1618250661Sdavidcs { 1619250661Sdavidcs bfd_set_error (bfd_error_bad_value); 1620250661Sdavidcs return false; 1621250661Sdavidcs } 1622250661Sdavidcs 1623250661Sdavidcs howto = elf_howto_table + r_type; 1624250661Sdavidcs r_symndx = ELF64_R_SYM (rel->r_info); 1625250661Sdavidcs h = NULL; 1626250661Sdavidcs sym = NULL; 1627250661Sdavidcs sec = NULL; 1628250661Sdavidcs unresolved_reloc = false; 1629250661Sdavidcs if (r_symndx < symtab_hdr->sh_info) 1630250661Sdavidcs { 1631250661Sdavidcs sym = local_syms + r_symndx; 1632250661Sdavidcs sec = local_sections[r_symndx]; 1633250661Sdavidcs relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); 1634250661Sdavidcs } 1635250661Sdavidcs else 1636250661Sdavidcs { 1637250661Sdavidcs h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 1638250661Sdavidcs while (h->root.type == bfd_link_hash_indirect 1639250661Sdavidcs || h->root.type == bfd_link_hash_warning) 1640250661Sdavidcs h = (struct elf_link_hash_entry *) h->root.u.i.link; 1641250661Sdavidcs 1642250661Sdavidcs if (h->root.type == bfd_link_hash_defined 1643250661Sdavidcs || h->root.type == bfd_link_hash_defweak) 1644250661Sdavidcs { 1645250661Sdavidcs sec = h->root.u.def.section; 1646250661Sdavidcs if (sec->output_section == NULL) 1647250661Sdavidcs { 1648250661Sdavidcs /* Set a flag that will be cleared later if we find a 1649250661Sdavidcs relocation value for this symbol. output_section 1650250661Sdavidcs is typically NULL for symbols satisfied by a shared 1651250661Sdavidcs library. */ 1652250661Sdavidcs unresolved_reloc = true; 1653250661Sdavidcs relocation = 0; 1654250661Sdavidcs } 1655250661Sdavidcs else 1656250661Sdavidcs relocation = (h->root.u.def.value 1657250661Sdavidcs + sec->output_section->vma 1658250661Sdavidcs + sec->output_offset); 1659250661Sdavidcs } 1660250661Sdavidcs else if (h->root.type == bfd_link_hash_undefweak) 1661250661Sdavidcs relocation = 0; 1662250661Sdavidcs else if (info->shared 1663250661Sdavidcs && (!info->symbolic || info->allow_shlib_undefined) 1664250661Sdavidcs && !info->no_undefined 1665250661Sdavidcs && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 1666250661Sdavidcs relocation = 0; 1667250661Sdavidcs else 1668250661Sdavidcs { 1669250661Sdavidcs if (! ((*info->callbacks->undefined_symbol) 1670250661Sdavidcs (info, h->root.root.string, input_bfd, 1671250661Sdavidcs input_section, rel->r_offset, 1672250661Sdavidcs (!info->shared || info->no_undefined 1673250661Sdavidcs || ELF_ST_VISIBILITY (h->other))))) 1674250661Sdavidcs return false; 1675250661Sdavidcs relocation = 0; 1676250661Sdavidcs } 1677250661Sdavidcs } 1678250661Sdavidcs 1679250661Sdavidcs switch (r_type) 1680250661Sdavidcs { 1681250661Sdavidcs case R_390_GOT12: 1682250661Sdavidcs case R_390_GOT16: 1683250661Sdavidcs case R_390_GOT32: 1684250661Sdavidcs case R_390_GOT64: 1685250661Sdavidcs case R_390_GOTENT: 1686250661Sdavidcs /* Relocation is to the entry for this symbol in the global 1687250661Sdavidcs offset table. */ 1688250661Sdavidcs if (htab->sgot == NULL) 1689250661Sdavidcs abort (); 1690250661Sdavidcs 1691250661Sdavidcs if (h != NULL) 1692250661Sdavidcs { 1693250661Sdavidcs boolean dyn; 1694250661Sdavidcs 1695250661Sdavidcs off = h->got.offset; 1696250661Sdavidcs dyn = htab->elf.dynamic_sections_created; 1697250661Sdavidcs if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h) 1698250661Sdavidcs || (info->shared 1699250661Sdavidcs && (info->symbolic 1700250661Sdavidcs || h->dynindx == -1 1701250661Sdavidcs || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) 1702250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) 1703250661Sdavidcs { 1704250661Sdavidcs /* This is actually a static link, or it is a 1705250661Sdavidcs -Bsymbolic link and the symbol is defined 1706250661Sdavidcs locally, or the symbol was forced to be local 1707250661Sdavidcs because of a version file. We must initialize 1708250661Sdavidcs this entry in the global offset table. Since the 1709250661Sdavidcs offset must always be a multiple of 2, we use the 1710250661Sdavidcs least significant bit to record whether we have 1711250661Sdavidcs initialized it already. 1712250661Sdavidcs 1713250661Sdavidcs When doing a dynamic link, we create a .rel.got 1714250661Sdavidcs relocation entry to initialize the value. This 1715250661Sdavidcs is done in the finish_dynamic_symbol routine. */ 1716250661Sdavidcs if ((off & 1) != 0) 1717250661Sdavidcs off &= ~1; 1718250661Sdavidcs else 1719250661Sdavidcs { 1720250661Sdavidcs bfd_put_64 (output_bfd, relocation, 1721250661Sdavidcs htab->sgot->contents + off); 1722250661Sdavidcs h->got.offset |= 1; 1723250661Sdavidcs } 1724250661Sdavidcs } 1725250661Sdavidcs else 1726250661Sdavidcs unresolved_reloc = false; 1727250661Sdavidcs } 1728250661Sdavidcs else 1729250661Sdavidcs { 1730250661Sdavidcs if (local_got_offsets == NULL) 1731250661Sdavidcs abort (); 1732250661Sdavidcs 1733250661Sdavidcs off = local_got_offsets[r_symndx]; 1734250661Sdavidcs 1735250661Sdavidcs /* The offset must always be a multiple of 8. We use 1736250661Sdavidcs the least significant bit to record whether we have 1737250661Sdavidcs already generated the necessary reloc. */ 1738250661Sdavidcs if ((off & 1) != 0) 1739250661Sdavidcs off &= ~1; 1740250661Sdavidcs else 1741250661Sdavidcs { 1742250661Sdavidcs bfd_put_64 (output_bfd, relocation, 1743250661Sdavidcs htab->sgot->contents + off); 1744250661Sdavidcs 1745250661Sdavidcs if (info->shared) 1746250661Sdavidcs { 1747250661Sdavidcs asection *srelgot; 1748250661Sdavidcs Elf_Internal_Rela outrel; 1749250661Sdavidcs Elf64_External_Rela *loc; 1750250661Sdavidcs 1751250661Sdavidcs srelgot = htab->srelgot; 1752250661Sdavidcs if (srelgot == NULL) 1753250661Sdavidcs abort (); 1754250661Sdavidcs 1755250661Sdavidcs outrel.r_offset = (htab->sgot->output_section->vma 1756250661Sdavidcs + htab->sgot->output_offset 1757250661Sdavidcs + off); 1758250661Sdavidcs outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE); 1759250661Sdavidcs outrel.r_addend = relocation; 1760250661Sdavidcs loc = (Elf64_External_Rela *) srelgot->contents; 1761250661Sdavidcs loc += srelgot->reloc_count++; 1762250661Sdavidcs bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); 1763250661Sdavidcs } 1764250661Sdavidcs 1765250661Sdavidcs local_got_offsets[r_symndx] |= 1; 1766250661Sdavidcs } 1767250661Sdavidcs } 1768250661Sdavidcs 1769250661Sdavidcs if (off >= (bfd_vma) -2) 1770250661Sdavidcs abort (); 1771250661Sdavidcs 1772250661Sdavidcs relocation = htab->sgot->output_offset + off; 1773250661Sdavidcs 1774250661Sdavidcs /* 1775250661Sdavidcs * For @GOTENT the relocation is against the offset between 1776250661Sdavidcs * the instruction and the symbols entry in the GOT and not 1777250661Sdavidcs * between the start of the GOT and the symbols entry. We 1778250661Sdavidcs * add the vma of the GOT to get the correct value. 1779250661Sdavidcs */ 1780250661Sdavidcs if (r_type == R_390_GOTENT) 1781250661Sdavidcs relocation += htab->sgot->output_section->vma; 1782250661Sdavidcs 1783250661Sdavidcs break; 1784250661Sdavidcs 1785250661Sdavidcs case R_390_GOTOFF: 1786250661Sdavidcs /* Relocation is relative to the start of the global offset 1787250661Sdavidcs table. */ 1788250661Sdavidcs 1789250661Sdavidcs /* Note that sgot->output_offset is not involved in this 1790250661Sdavidcs calculation. We always want the start of .got. If we 1791250661Sdavidcs defined _GLOBAL_OFFSET_TABLE in a different way, as is 1792250661Sdavidcs permitted by the ABI, we might have to change this 1793250661Sdavidcs calculation. */ 1794250661Sdavidcs relocation -= htab->sgot->output_section->vma; 1795250661Sdavidcs 1796250661Sdavidcs break; 1797250661Sdavidcs 1798250661Sdavidcs case R_390_GOTPC: 1799250661Sdavidcs case R_390_GOTPCDBL: 1800250661Sdavidcs /* Use global offset table as symbol value. */ 1801250661Sdavidcs relocation = htab->sgot->output_section->vma; 1802250661Sdavidcs unresolved_reloc = false; 1803250661Sdavidcs break; 1804250661Sdavidcs 1805250661Sdavidcs case R_390_PLT16DBL: 1806250661Sdavidcs case R_390_PLT32: 1807250661Sdavidcs case R_390_PLT32DBL: 1808250661Sdavidcs case R_390_PLT64: 1809250661Sdavidcs /* Relocation is to the entry for this symbol in the 1810250661Sdavidcs procedure linkage table. */ 1811250661Sdavidcs 1812250661Sdavidcs /* Resolve a PLT32 reloc against a local symbol directly, 1813250661Sdavidcs without using the procedure linkage table. */ 1814250661Sdavidcs if (h == NULL) 1815250661Sdavidcs break; 1816250661Sdavidcs 1817250661Sdavidcs if (h->plt.offset == (bfd_vma) -1 1818250661Sdavidcs || htab->splt == NULL) 1819250661Sdavidcs { 1820250661Sdavidcs /* We didn't make a PLT entry for this symbol. This 1821250661Sdavidcs happens when statically linking PIC code, or when 1822250661Sdavidcs using -Bsymbolic. */ 1823250661Sdavidcs break; 1824250661Sdavidcs } 1825250661Sdavidcs 1826250661Sdavidcs relocation = (htab->splt->output_section->vma 1827250661Sdavidcs + htab->splt->output_offset 1828250661Sdavidcs + h->plt.offset); 1829250661Sdavidcs unresolved_reloc = false; 1830250661Sdavidcs break; 1831250661Sdavidcs 1832250661Sdavidcs case R_390_8: 1833250661Sdavidcs case R_390_16: 1834250661Sdavidcs case R_390_32: 1835250661Sdavidcs case R_390_64: 1836250661Sdavidcs case R_390_PC16: 1837250661Sdavidcs case R_390_PC16DBL: 1838250661Sdavidcs case R_390_PC32: 1839250661Sdavidcs case R_390_PC32DBL: 1840250661Sdavidcs case R_390_PC64: 1841250661Sdavidcs /* r_symndx will be zero only for relocs against symbols 1842250661Sdavidcs from removed linkonce sections, or sections discarded by 1843250661Sdavidcs a linker script. */ 1844250661Sdavidcs if (r_symndx == 0 1845250661Sdavidcs || (input_section->flags & SEC_ALLOC) == 0) 1846250661Sdavidcs break; 1847250661Sdavidcs 1848250661Sdavidcs if ((info->shared 1849250661Sdavidcs && ((r_type != R_390_PC16 1850250661Sdavidcs && r_type != R_390_PC16DBL 1851250661Sdavidcs && r_type != R_390_PC32 1852250661Sdavidcs && r_type != R_390_PC32DBL 1853250661Sdavidcs && r_type != R_390_PC64) 1854250661Sdavidcs || (h != NULL 1855250661Sdavidcs && h->dynindx != -1 1856250661Sdavidcs && (! info->symbolic 1857250661Sdavidcs || (h->elf_link_hash_flags 1858250661Sdavidcs & ELF_LINK_HASH_DEF_REGULAR) == 0)))) 1859250661Sdavidcs || (!info->shared 1860250661Sdavidcs && h != NULL 1861250661Sdavidcs && h->dynindx != -1 1862250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 1863250661Sdavidcs && (((h->elf_link_hash_flags 1864250661Sdavidcs & ELF_LINK_HASH_DEF_DYNAMIC) != 0 1865250661Sdavidcs && (h->elf_link_hash_flags 1866250661Sdavidcs & ELF_LINK_HASH_DEF_REGULAR) == 0) 1867250661Sdavidcs || h->root.type == bfd_link_hash_undefweak 1868250661Sdavidcs || h->root.type == bfd_link_hash_undefined))) 1869250661Sdavidcs { 1870250661Sdavidcs Elf_Internal_Rela outrel; 1871250661Sdavidcs boolean skip, relocate; 1872250661Sdavidcs asection *sreloc; 1873250661Sdavidcs Elf64_External_Rela *loc; 1874250661Sdavidcs 1875250661Sdavidcs /* When generating a shared object, these relocations 1876250661Sdavidcs are copied into the output file to be resolved at run 1877250661Sdavidcs time. */ 1878250661Sdavidcs 1879250661Sdavidcs skip = false; 1880250661Sdavidcs relocate = false; 1881250661Sdavidcs 1882250661Sdavidcs outrel.r_offset = 1883250661Sdavidcs _bfd_elf_section_offset (output_bfd, info, input_section, 1884250661Sdavidcs rel->r_offset); 1885250661Sdavidcs if (outrel.r_offset == (bfd_vma) -1) 1886250661Sdavidcs skip = true; 1887250661Sdavidcs else if (outrel.r_offset == (bfd_vma) -2) 1888250661Sdavidcs skip = true, relocate = true; 1889250661Sdavidcs 1890250661Sdavidcs outrel.r_offset += (input_section->output_section->vma 1891250661Sdavidcs + input_section->output_offset); 1892250661Sdavidcs 1893250661Sdavidcs if (skip) 1894250661Sdavidcs memset (&outrel, 0, sizeof outrel); 1895250661Sdavidcs else if (h != NULL 1896250661Sdavidcs && h->dynindx != -1 1897250661Sdavidcs && (r_type == R_390_PC16 1898250661Sdavidcs || r_type == R_390_PC16DBL 1899250661Sdavidcs || r_type == R_390_PC32 1900250661Sdavidcs || r_type == R_390_PC32DBL 1901250661Sdavidcs || r_type == R_390_PC64 1902250661Sdavidcs || !info->shared 1903250661Sdavidcs || !info->symbolic 1904250661Sdavidcs || (h->elf_link_hash_flags 1905250661Sdavidcs & ELF_LINK_HASH_DEF_REGULAR) == 0)) 1906250661Sdavidcs { 1907250661Sdavidcs outrel.r_info = ELF64_R_INFO (h->dynindx, r_type); 1908250661Sdavidcs outrel.r_addend = rel->r_addend; 1909250661Sdavidcs } 1910250661Sdavidcs else 1911250661Sdavidcs { 1912250661Sdavidcs /* This symbol is local, or marked to become local. */ 1913250661Sdavidcs relocate = true; 1914250661Sdavidcs outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE); 1915250661Sdavidcs outrel.r_addend = relocation + rel->r_addend; 1916250661Sdavidcs } 1917250661Sdavidcs 1918250661Sdavidcs sreloc = elf_section_data (input_section)->sreloc; 1919250661Sdavidcs if (sreloc == NULL) 1920250661Sdavidcs abort (); 1921250661Sdavidcs 1922250661Sdavidcs loc = (Elf64_External_Rela *) sreloc->contents; 1923250661Sdavidcs loc += sreloc->reloc_count++; 1924250661Sdavidcs bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); 1925250661Sdavidcs 1926250661Sdavidcs /* If this reloc is against an external symbol, we do 1927250661Sdavidcs not want to fiddle with the addend. Otherwise, we 1928250661Sdavidcs need to include the symbol value so that it becomes 1929250661Sdavidcs an addend for the dynamic reloc. */ 1930250661Sdavidcs if (! relocate) 1931250661Sdavidcs continue; 1932250661Sdavidcs } 1933250661Sdavidcs 1934250661Sdavidcs break; 1935250661Sdavidcs 1936250661Sdavidcs default: 1937250661Sdavidcs break; 1938250661Sdavidcs } 1939250661Sdavidcs 1940250661Sdavidcs /* Dynamic relocs are not propagated for SEC_DEBUGGING sections 1941250661Sdavidcs because such sections are not SEC_ALLOC and thus ld.so will 1942250661Sdavidcs not process them. */ 1943250661Sdavidcs if (unresolved_reloc 1944250661Sdavidcs && !((input_section->flags & SEC_DEBUGGING) != 0 1945250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0)) 1946250661Sdavidcs (*_bfd_error_handler) 1947250661Sdavidcs (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"), 1948250661Sdavidcs bfd_archive_filename (input_bfd), 1949250661Sdavidcs bfd_get_section_name (input_bfd, input_section), 1950250661Sdavidcs (long) rel->r_offset, 1951250661Sdavidcs h->root.root.string); 1952250661Sdavidcs 1953250661Sdavidcs r = _bfd_final_link_relocate (howto, input_bfd, input_section, 1954250661Sdavidcs contents, rel->r_offset, 1955250661Sdavidcs relocation, rel->r_addend); 1956250661Sdavidcs 1957250661Sdavidcs if (r != bfd_reloc_ok) 1958250661Sdavidcs { 1959250661Sdavidcs const char *name; 1960250661Sdavidcs 1961250661Sdavidcs if (h != NULL) 1962250661Sdavidcs name = h->root.root.string; 1963250661Sdavidcs else 1964250661Sdavidcs { 1965250661Sdavidcs name = bfd_elf_string_from_elf_section (input_bfd, 1966250661Sdavidcs symtab_hdr->sh_link, 1967250661Sdavidcs sym->st_name); 1968250661Sdavidcs if (name == NULL) 1969250661Sdavidcs return false; 1970250661Sdavidcs if (*name == '\0') 1971250661Sdavidcs name = bfd_section_name (input_bfd, sec); 1972250661Sdavidcs } 1973250661Sdavidcs 1974250661Sdavidcs if (r == bfd_reloc_overflow) 1975250661Sdavidcs { 1976250661Sdavidcs 1977250661Sdavidcs if (! ((*info->callbacks->reloc_overflow) 1978250661Sdavidcs (info, name, howto->name, (bfd_vma) 0, 1979250661Sdavidcs input_bfd, input_section, rel->r_offset))) 1980250661Sdavidcs return false; 1981250661Sdavidcs } 1982250661Sdavidcs else 1983250661Sdavidcs { 1984250661Sdavidcs (*_bfd_error_handler) 1985250661Sdavidcs (_("%s(%s+0x%lx): reloc against `%s': error %d"), 1986250661Sdavidcs bfd_archive_filename (input_bfd), 1987250661Sdavidcs bfd_get_section_name (input_bfd, input_section), 1988250661Sdavidcs (long) rel->r_offset, name, (int) r); 1989250661Sdavidcs return false; 1990250661Sdavidcs } 1991250661Sdavidcs } 1992250661Sdavidcs } 1993250661Sdavidcs 1994250661Sdavidcs return true; 1995250661Sdavidcs} 1996250661Sdavidcs 1997250661Sdavidcs/* Finish up dynamic symbol handling. We set the contents of various 1998250661Sdavidcs dynamic sections here. */ 1999250661Sdavidcs 2000250661Sdavidcsstatic boolean 2001250661Sdavidcself_s390_finish_dynamic_symbol (output_bfd, info, h, sym) 2002250661Sdavidcs bfd *output_bfd; 2003250661Sdavidcs struct bfd_link_info *info; 2004250661Sdavidcs struct elf_link_hash_entry *h; 2005250661Sdavidcs Elf_Internal_Sym *sym; 2006250661Sdavidcs{ 2007250661Sdavidcs struct elf_s390_link_hash_table *htab; 2008250661Sdavidcs 2009250661Sdavidcs htab = elf_s390_hash_table (info); 2010250661Sdavidcs 2011250661Sdavidcs if (h->plt.offset != (bfd_vma) -1) 2012250661Sdavidcs { 2013250661Sdavidcs bfd_vma plt_index; 2014250661Sdavidcs bfd_vma got_offset; 2015250661Sdavidcs Elf_Internal_Rela rela; 2016250661Sdavidcs Elf64_External_Rela *loc; 2017250661Sdavidcs 2018250661Sdavidcs /* This symbol has an entry in the procedure linkage table. Set 2019250661Sdavidcs it up. */ 2020250661Sdavidcs 2021250661Sdavidcs if (h->dynindx == -1 2022250661Sdavidcs || htab->splt == NULL 2023250661Sdavidcs || htab->sgotplt == NULL 2024250661Sdavidcs || htab->srelplt == NULL) 2025250661Sdavidcs abort (); 2026250661Sdavidcs 2027250661Sdavidcs /* Calc. index no. 2028250661Sdavidcs Current offset - size first entry / entry size. */ 2029250661Sdavidcs plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE; 2030250661Sdavidcs 2031250661Sdavidcs /* Offset in GOT is PLT index plus GOT headers(3) times 8, 2032250661Sdavidcs addr & GOT addr. */ 2033250661Sdavidcs got_offset = (plt_index + 3) * GOT_ENTRY_SIZE; 2034250661Sdavidcs 2035250661Sdavidcs /* Fill in the blueprint of a PLT. */ 2036250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD0, 2037250661Sdavidcs htab->splt->contents + h->plt.offset); 2038250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD1, 2039250661Sdavidcs htab->splt->contents + h->plt.offset + 4); 2040250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2, 2041250661Sdavidcs htab->splt->contents + h->plt.offset + 8); 2042250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD3, 2043250661Sdavidcs htab->splt->contents + h->plt.offset + 12); 2044250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD4, 2045250661Sdavidcs htab->splt->contents + h->plt.offset + 16); 2046250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD5, 2047250661Sdavidcs htab->splt->contents + h->plt.offset + 20); 2048250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD6, 2049250661Sdavidcs htab->splt->contents + h->plt.offset + 24); 2050250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD7, 2051250661Sdavidcs htab->splt->contents + h->plt.offset + 28); 2052250661Sdavidcs /* Fixup the relative address to the GOT entry */ 2053250661Sdavidcs bfd_put_32 (output_bfd, 2054250661Sdavidcs (htab->sgotplt->output_section->vma + 2055250661Sdavidcs htab->sgotplt->output_offset + got_offset 2056250661Sdavidcs - (htab->splt->output_section->vma + h->plt.offset))/2, 2057250661Sdavidcs htab->splt->contents + h->plt.offset + 2); 2058250661Sdavidcs /* Fixup the relative branch to PLT 0 */ 2059250661Sdavidcs bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE + 2060250661Sdavidcs (PLT_ENTRY_SIZE * plt_index) + 22)/2, 2061250661Sdavidcs htab->splt->contents + h->plt.offset + 24); 2062250661Sdavidcs /* Fixup offset into symbol table */ 2063250661Sdavidcs bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela), 2064250661Sdavidcs htab->splt->contents + h->plt.offset + 28); 2065250661Sdavidcs 2066250661Sdavidcs /* Fill in the entry in the global offset table. 2067250661Sdavidcs Points to instruction after GOT offset. */ 2068250661Sdavidcs bfd_put_64 (output_bfd, 2069250661Sdavidcs (htab->splt->output_section->vma 2070250661Sdavidcs + htab->splt->output_offset 2071250661Sdavidcs + h->plt.offset 2072250661Sdavidcs + 14), 2073250661Sdavidcs htab->sgotplt->contents + got_offset); 2074250661Sdavidcs 2075250661Sdavidcs /* Fill in the entry in the .rela.plt section. */ 2076250661Sdavidcs rela.r_offset = (htab->sgotplt->output_section->vma 2077250661Sdavidcs + htab->sgotplt->output_offset 2078250661Sdavidcs + got_offset); 2079250661Sdavidcs rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT); 2080250661Sdavidcs rela.r_addend = 0; 2081250661Sdavidcs loc = (Elf64_External_Rela *) htab->srelplt->contents + plt_index; 2082250661Sdavidcs bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); 2083250661Sdavidcs 2084250661Sdavidcs if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) 2085250661Sdavidcs { 2086250661Sdavidcs /* Mark the symbol as undefined, rather than as defined in 2087250661Sdavidcs the .plt section. Leave the value alone. This is a clue 2088250661Sdavidcs for the dynamic linker, to make function pointer 2089250661Sdavidcs comparisons work between an application and shared 2090250661Sdavidcs library. */ 2091250661Sdavidcs sym->st_shndx = SHN_UNDEF; 2092250661Sdavidcs } 2093250661Sdavidcs } 2094250661Sdavidcs 2095250661Sdavidcs if (h->got.offset != (bfd_vma) -1) 2096250661Sdavidcs { 2097250661Sdavidcs Elf_Internal_Rela rela; 2098250661Sdavidcs Elf64_External_Rela *loc; 2099250661Sdavidcs 2100250661Sdavidcs /* This symbol has an entry in the global offset table. Set it 2101250661Sdavidcs up. */ 2102250661Sdavidcs 2103250661Sdavidcs if (htab->sgot == NULL || htab->srelgot == NULL) 2104250661Sdavidcs abort (); 2105250661Sdavidcs 2106250661Sdavidcs rela.r_offset = (htab->sgot->output_section->vma 2107250661Sdavidcs + htab->sgot->output_offset 2108250661Sdavidcs + (h->got.offset &~ (bfd_vma) 1)); 2109250661Sdavidcs 2110250661Sdavidcs /* If this is a static link, or it is a -Bsymbolic link and the 2111250661Sdavidcs symbol is defined locally or was forced to be local because 2112250661Sdavidcs of a version file, we just want to emit a RELATIVE reloc. 2113250661Sdavidcs The entry in the global offset table will already have been 2114250661Sdavidcs initialized in the relocate_section function. */ 2115250661Sdavidcs if (info->shared 2116250661Sdavidcs && (info->symbolic 2117250661Sdavidcs || h->dynindx == -1 2118250661Sdavidcs || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) 2119250661Sdavidcs && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) 2120250661Sdavidcs { 2121250661Sdavidcs BFD_ASSERT((h->got.offset & 1) != 0); 2122250661Sdavidcs rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE); 2123250661Sdavidcs rela.r_addend = (h->root.u.def.value 2124250661Sdavidcs + h->root.u.def.section->output_section->vma 2125250661Sdavidcs + h->root.u.def.section->output_offset); 2126250661Sdavidcs } 2127250661Sdavidcs else 2128250661Sdavidcs { 2129250661Sdavidcs BFD_ASSERT((h->got.offset & 1) == 0); 2130250661Sdavidcs bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgot->contents + h->got.offset); 2131250661Sdavidcs rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT); 2132250661Sdavidcs rela.r_addend = 0; 2133250661Sdavidcs } 2134250661Sdavidcs 2135250661Sdavidcs loc = (Elf64_External_Rela *) htab->srelgot->contents; 2136250661Sdavidcs loc += htab->srelgot->reloc_count++; 2137250661Sdavidcs bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); 2138250661Sdavidcs } 2139250661Sdavidcs 2140250661Sdavidcs if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0) 2141250661Sdavidcs { 2142250661Sdavidcs Elf_Internal_Rela rela; 2143250661Sdavidcs Elf64_External_Rela *loc; 2144250661Sdavidcs 2145250661Sdavidcs /* This symbols needs a copy reloc. Set it up. */ 2146250661Sdavidcs 2147250661Sdavidcs if (h->dynindx == -1 2148250661Sdavidcs || (h->root.type != bfd_link_hash_defined 2149250661Sdavidcs && h->root.type != bfd_link_hash_defweak) 2150250661Sdavidcs || htab->srelbss == NULL) 2151250661Sdavidcs abort (); 2152250661Sdavidcs 2153250661Sdavidcs rela.r_offset = (h->root.u.def.value 2154250661Sdavidcs + h->root.u.def.section->output_section->vma 2155250661Sdavidcs + h->root.u.def.section->output_offset); 2156250661Sdavidcs rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY); 2157250661Sdavidcs rela.r_addend = 0; 2158250661Sdavidcs loc = (Elf64_External_Rela *) htab->srelbss->contents; 2159250661Sdavidcs loc += htab->srelbss->reloc_count++; 2160250661Sdavidcs bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); 2161250661Sdavidcs } 2162250661Sdavidcs 2163250661Sdavidcs /* Mark some specially defined symbols as absolute. */ 2164250661Sdavidcs if (strcmp (h->root.root.string, "_DYNAMIC") == 0 2165250661Sdavidcs || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0 2166250661Sdavidcs || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0) 2167250661Sdavidcs sym->st_shndx = SHN_ABS; 2168250661Sdavidcs 2169250661Sdavidcs return true; 2170250661Sdavidcs} 2171250661Sdavidcs 2172250661Sdavidcs/* Used to decide how to sort relocs in an optimal manner for the 2173250661Sdavidcs dynamic linker, before writing them out. */ 2174250661Sdavidcs 2175250661Sdavidcsstatic enum elf_reloc_type_class 2176250661Sdavidcself_s390_reloc_type_class (rela) 2177250661Sdavidcs const Elf_Internal_Rela *rela; 2178250661Sdavidcs{ 2179250661Sdavidcs switch ((int) ELF64_R_TYPE (rela->r_info)) 2180250661Sdavidcs { 2181250661Sdavidcs case R_390_RELATIVE: 2182250661Sdavidcs return reloc_class_relative; 2183250661Sdavidcs case R_390_JMP_SLOT: 2184250661Sdavidcs return reloc_class_plt; 2185250661Sdavidcs case R_390_COPY: 2186250661Sdavidcs return reloc_class_copy; 2187250661Sdavidcs default: 2188250661Sdavidcs return reloc_class_normal; 2189250661Sdavidcs } 2190250661Sdavidcs} 2191250661Sdavidcs 2192250661Sdavidcs/* Finish up the dynamic sections. */ 2193250661Sdavidcs 2194250661Sdavidcsstatic boolean 2195250661Sdavidcself_s390_finish_dynamic_sections (output_bfd, info) 2196250661Sdavidcs bfd *output_bfd; 2197250661Sdavidcs struct bfd_link_info *info; 2198250661Sdavidcs{ 2199250661Sdavidcs struct elf_s390_link_hash_table *htab; 2200250661Sdavidcs bfd *dynobj; 2201250661Sdavidcs asection *sdyn; 2202250661Sdavidcs 2203250661Sdavidcs htab = elf_s390_hash_table (info); 2204250661Sdavidcs dynobj = htab->elf.dynobj; 2205250661Sdavidcs sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); 2206250661Sdavidcs 2207250661Sdavidcs if (htab->elf.dynamic_sections_created) 2208250661Sdavidcs { 2209250661Sdavidcs Elf64_External_Dyn *dyncon, *dynconend; 2210250661Sdavidcs 2211250661Sdavidcs if (sdyn == NULL || htab->sgot == NULL) 2212250661Sdavidcs abort (); 2213250661Sdavidcs 2214250661Sdavidcs dyncon = (Elf64_External_Dyn *) sdyn->contents; 2215250661Sdavidcs dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size); 2216250661Sdavidcs for (; dyncon < dynconend; dyncon++) 2217250661Sdavidcs { 2218250661Sdavidcs Elf_Internal_Dyn dyn; 2219250661Sdavidcs asection *s; 2220250661Sdavidcs 2221250661Sdavidcs bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); 2222250661Sdavidcs 2223250661Sdavidcs switch (dyn.d_tag) 2224250661Sdavidcs { 2225250661Sdavidcs default: 2226250661Sdavidcs continue; 2227250661Sdavidcs 2228250661Sdavidcs case DT_PLTGOT: 2229250661Sdavidcs dyn.d_un.d_ptr = htab->sgot->output_section->vma; 2230250661Sdavidcs break; 2231250661Sdavidcs 2232250661Sdavidcs case DT_JMPREL: 2233250661Sdavidcs dyn.d_un.d_ptr = htab->srelplt->output_section->vma; 2234250661Sdavidcs break; 2235250661Sdavidcs 2236250661Sdavidcs case DT_PLTRELSZ: 2237250661Sdavidcs s = htab->srelplt->output_section; 2238250661Sdavidcs if (s->_cooked_size != 0) 2239250661Sdavidcs dyn.d_un.d_val = s->_cooked_size; 2240250661Sdavidcs else 2241250661Sdavidcs dyn.d_un.d_val = s->_raw_size; 2242250661Sdavidcs break; 2243250661Sdavidcs 2244250661Sdavidcs case DT_RELASZ: 2245250661Sdavidcs /* The procedure linkage table relocs (DT_JMPREL) should 2246250661Sdavidcs not be included in the overall relocs (DT_RELA). 2247250661Sdavidcs Therefore, we override the DT_RELASZ entry here to 2248250661Sdavidcs make it not include the JMPREL relocs. Since the 2249250661Sdavidcs linker script arranges for .rela.plt to follow all 2250250661Sdavidcs other relocation sections, we don't have to worry 2251250661Sdavidcs about changing the DT_RELA entry. */ 2252250661Sdavidcs s = htab->srelplt->output_section; 2253250661Sdavidcs if (s->_cooked_size != 0) 2254250661Sdavidcs dyn.d_un.d_val -= s->_cooked_size; 2255250661Sdavidcs else 2256250661Sdavidcs dyn.d_un.d_val -= s->_raw_size; 2257250661Sdavidcs break; 2258250661Sdavidcs } 2259250661Sdavidcs 2260250661Sdavidcs bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); 2261250661Sdavidcs } 2262250661Sdavidcs 2263250661Sdavidcs /* Fill in the special first entry in the procedure linkage table. */ 2264250661Sdavidcs if (htab->splt && htab->splt->_raw_size > 0) 2265250661Sdavidcs { 2266250661Sdavidcs /* fill in blueprint for plt 0 entry */ 2267250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD0, 2268250661Sdavidcs htab->splt->contents ); 2269250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD1, 2270250661Sdavidcs htab->splt->contents +4 ); 2271250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD3, 2272250661Sdavidcs htab->splt->contents +12 ); 2273250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD4, 2274250661Sdavidcs htab->splt->contents +16 ); 2275250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD5, 2276250661Sdavidcs htab->splt->contents +20 ); 2277250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD6, 2278250661Sdavidcs htab->splt->contents + 24); 2279250661Sdavidcs bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD7, 2280250661Sdavidcs htab->splt->contents + 28 ); 2281250661Sdavidcs /* Fixup relative address to start of GOT */ 2282250661Sdavidcs bfd_put_32 (output_bfd, 2283250661Sdavidcs (htab->sgotplt->output_section->vma + 2284250661Sdavidcs htab->sgotplt->output_offset 2285250661Sdavidcs - htab->splt->output_section->vma - 6)/2, 2286250661Sdavidcs htab->splt->contents + 8); 2287250661Sdavidcs } 2288250661Sdavidcs elf_section_data (htab->splt->output_section) 2289250661Sdavidcs ->this_hdr.sh_entsize = PLT_ENTRY_SIZE; 2290250661Sdavidcs } 2291250661Sdavidcs 2292250661Sdavidcs if (htab->sgotplt) 2293250661Sdavidcs { 2294250661Sdavidcs /* Fill in the first three entries in the global offset table. */ 2295250661Sdavidcs if (htab->sgotplt->_raw_size > 0) 2296250661Sdavidcs { 2297250661Sdavidcs bfd_put_64 (output_bfd, 2298250661Sdavidcs (sdyn == NULL ? (bfd_vma) 0 2299250661Sdavidcs : sdyn->output_section->vma + sdyn->output_offset), 2300250661Sdavidcs htab->sgotplt->contents); 2301250661Sdavidcs /* One entry for shared object struct ptr. */ 2302250661Sdavidcs bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8); 2303250661Sdavidcs /* One entry for _dl_runtime_resolve. */ 2304250661Sdavidcs bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 12); 2305250661Sdavidcs } 2306250661Sdavidcs 2307250661Sdavidcs elf_section_data (htab->sgot->output_section) 2308250661Sdavidcs ->this_hdr.sh_entsize = 8; 2309250661Sdavidcs } 2310250661Sdavidcs return true; 2311250661Sdavidcs} 2312250661Sdavidcs 2313250661Sdavidcsstatic boolean 2314250661Sdavidcself_s390_object_p (abfd) 2315250661Sdavidcs bfd *abfd; 2316250661Sdavidcs{ 2317250661Sdavidcs return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_64); 2318250661Sdavidcs} 2319250661Sdavidcs 2320250661Sdavidcs/* 2321250661Sdavidcs * Why was the hash table entry size definition changed from 2322250661Sdavidcs * ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and 2323250661Sdavidcs * this is the only reason for the s390_elf64_size_info structure. 2324250661Sdavidcs */ 2325250661Sdavidcs 2326250661Sdavidcsconst struct elf_size_info s390_elf64_size_info = 2327250661Sdavidcs{ 2328250661Sdavidcs sizeof (Elf64_External_Ehdr), 2329250661Sdavidcs sizeof (Elf64_External_Phdr), 2330250661Sdavidcs sizeof (Elf64_External_Shdr), 2331250661Sdavidcs sizeof (Elf64_External_Rel), 2332250661Sdavidcs sizeof (Elf64_External_Rela), 2333250661Sdavidcs sizeof (Elf64_External_Sym), 2334250661Sdavidcs sizeof (Elf64_External_Dyn), 2335250661Sdavidcs sizeof (Elf_External_Note), 2336250661Sdavidcs 8, /* hash-table entry size */ 2337250661Sdavidcs 1, /* internal relocations per external relocations */ 2338250661Sdavidcs 64, /* arch_size */ 2339250661Sdavidcs 8, /* file_align */ 2340250661Sdavidcs ELFCLASS64, EV_CURRENT, 2341250661Sdavidcs bfd_elf64_write_out_phdrs, 2342250661Sdavidcs bfd_elf64_write_shdrs_and_ehdr, 2343250661Sdavidcs bfd_elf64_write_relocs, 2344250661Sdavidcs bfd_elf64_swap_symbol_in, 2345250661Sdavidcs bfd_elf64_swap_symbol_out, 2346250661Sdavidcs bfd_elf64_slurp_reloc_table, 2347250661Sdavidcs bfd_elf64_slurp_symbol_table, 2348250661Sdavidcs bfd_elf64_swap_dyn_in, 2349250661Sdavidcs bfd_elf64_swap_dyn_out, 2350250661Sdavidcs NULL, 2351250661Sdavidcs NULL, 2352250661Sdavidcs NULL, 2353250661Sdavidcs NULL 2354250661Sdavidcs}; 2355250661Sdavidcs 2356250661Sdavidcs#define TARGET_BIG_SYM bfd_elf64_s390_vec 2357250661Sdavidcs#define TARGET_BIG_NAME "elf64-s390" 2358250661Sdavidcs#define ELF_ARCH bfd_arch_s390 2359250661Sdavidcs#define ELF_MACHINE_CODE EM_S390 2360250661Sdavidcs#define ELF_MACHINE_ALT1 EM_S390_OLD 2361250661Sdavidcs#define ELF_MAXPAGESIZE 0x1000 2362250661Sdavidcs 2363250661Sdavidcs#define elf_backend_size_info s390_elf64_size_info 2364250661Sdavidcs 2365250661Sdavidcs#define elf_backend_can_gc_sections 1 2366250661Sdavidcs#define elf_backend_can_refcount 1 2367250661Sdavidcs#define elf_backend_want_got_plt 1 2368250661Sdavidcs#define elf_backend_plt_readonly 1 2369250661Sdavidcs#define elf_backend_want_plt_sym 0 2370250661Sdavidcs#define elf_backend_got_header_size 24 2371250661Sdavidcs#define elf_backend_plt_header_size PLT_ENTRY_SIZE 2372250661Sdavidcs#define elf_backend_rela_normal 1 2373250661Sdavidcs 2374250661Sdavidcs#define elf_info_to_howto elf_s390_info_to_howto 2375250661Sdavidcs 2376250661Sdavidcs#define bfd_elf64_bfd_is_local_label_name elf_s390_is_local_label_name 2377250661Sdavidcs#define bfd_elf64_bfd_link_hash_table_create elf_s390_link_hash_table_create 2378250661Sdavidcs#define bfd_elf64_bfd_reloc_type_lookup elf_s390_reloc_type_lookup 2379250661Sdavidcs 2380250661Sdavidcs#define elf_backend_adjust_dynamic_symbol elf_s390_adjust_dynamic_symbol 2381250661Sdavidcs#define elf_backend_check_relocs elf_s390_check_relocs 2382250661Sdavidcs#define elf_backend_copy_indirect_symbol elf_s390_copy_indirect_symbol 2383250661Sdavidcs#define elf_backend_create_dynamic_sections elf_s390_create_dynamic_sections 2384250661Sdavidcs#define elf_backend_finish_dynamic_sections elf_s390_finish_dynamic_sections 2385250661Sdavidcs#define elf_backend_finish_dynamic_symbol elf_s390_finish_dynamic_symbol 2386250661Sdavidcs#define elf_backend_gc_mark_hook elf_s390_gc_mark_hook 2387250661Sdavidcs#define elf_backend_gc_sweep_hook elf_s390_gc_sweep_hook 2388250661Sdavidcs#define elf_backend_reloc_type_class elf_s390_reloc_type_class 2389250661Sdavidcs#define elf_backend_relocate_section elf_s390_relocate_section 2390250661Sdavidcs#define elf_backend_size_dynamic_sections elf_s390_size_dynamic_sections 2391250661Sdavidcs#define elf_backend_reloc_type_class elf_s390_reloc_type_class 2392250661Sdavidcs 2393250661Sdavidcs#define elf_backend_object_p elf_s390_object_p 2394250661Sdavidcs 2395250661Sdavidcs#include "elf64-target.h" 2396250661Sdavidcs