1 1.1 christos /* SPARC-specific support for ELF 2 1.10 christos Copyright (C) 2005-2025 Free Software Foundation, Inc. 3 1.1 christos 4 1.1 christos This file is part of BFD, the Binary File Descriptor library. 5 1.1 christos 6 1.1 christos This program is free software; you can redistribute it and/or modify 7 1.1 christos it under the terms of the GNU General Public License as published by 8 1.1 christos the Free Software Foundation; either version 3 of the License, or 9 1.1 christos (at your option) any later version. 10 1.1 christos 11 1.1 christos This program is distributed in the hope that it will be useful, 12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 christos GNU General Public License for more details. 15 1.1 christos 16 1.1 christos You should have received a copy of the GNU General Public License 17 1.1 christos along with this program; if not, write to the Free Software 18 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 1.1 christos MA 02110-1301, USA. */ 20 1.1 christos 21 1.1 christos 22 1.1 christos /* This file handles functionality common to the different SPARC ABI's. */ 23 1.1 christos 24 1.1 christos #include "sysdep.h" 25 1.1 christos #include "bfd.h" 26 1.1 christos #include "bfdlink.h" 27 1.1 christos #include "libbfd.h" 28 1.1 christos #include "libiberty.h" 29 1.1 christos #include "elf-bfd.h" 30 1.1 christos #include "elf/sparc.h" 31 1.1 christos #include "opcode/sparc.h" 32 1.1 christos #include "elfxx-sparc.h" 33 1.1 christos #include "elf-vxworks.h" 34 1.1 christos #include "objalloc.h" 35 1.1 christos #include "hashtab.h" 36 1.1 christos 37 1.1 christos /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */ 38 1.1 christos #define MINUS_ONE (~ (bfd_vma) 0) 39 1.1 christos 40 1.1 christos #define ABI_64_P(abfd) \ 41 1.1 christos (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64) 42 1.1 christos 43 1.1 christos /* The relocation "howto" table. */ 44 1.1 christos 45 1.1 christos /* Utility for performing the standard initial work of an instruction 46 1.1 christos relocation. 47 1.1 christos *PRELOCATION will contain the relocated item. 48 1.1 christos *PINSN will contain the instruction from the input stream. 49 1.1 christos If the result is `bfd_reloc_other' the caller can continue with 50 1.1 christos performing the relocation. Otherwise it must stop and return the 51 1.1 christos value to its caller. */ 52 1.1 christos 53 1.1 christos static bfd_reloc_status_type 54 1.1 christos init_insn_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 55 1.1 christos void * data, asection *input_section, bfd *output_bfd, 56 1.1 christos bfd_vma *prelocation, bfd_vma *pinsn) 57 1.1 christos { 58 1.1 christos bfd_vma relocation; 59 1.1 christos reloc_howto_type *howto = reloc_entry->howto; 60 1.1 christos 61 1.1 christos if (output_bfd != (bfd *) NULL 62 1.1 christos && (symbol->flags & BSF_SECTION_SYM) == 0 63 1.1 christos && (! howto->partial_inplace 64 1.1 christos || reloc_entry->addend == 0)) 65 1.1 christos { 66 1.1 christos reloc_entry->address += input_section->output_offset; 67 1.1 christos return bfd_reloc_ok; 68 1.1 christos } 69 1.1 christos 70 1.1 christos /* This works because partial_inplace is FALSE. */ 71 1.1 christos if (output_bfd != NULL) 72 1.1 christos return bfd_reloc_continue; 73 1.1 christos 74 1.1 christos if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) 75 1.1 christos return bfd_reloc_outofrange; 76 1.1 christos 77 1.1 christos relocation = (symbol->value 78 1.1 christos + symbol->section->output_section->vma 79 1.1 christos + symbol->section->output_offset); 80 1.1 christos relocation += reloc_entry->addend; 81 1.1 christos if (howto->pc_relative) 82 1.1 christos { 83 1.1 christos relocation -= (input_section->output_section->vma 84 1.1 christos + input_section->output_offset); 85 1.1 christos relocation -= reloc_entry->address; 86 1.1 christos } 87 1.1 christos 88 1.1 christos *prelocation = relocation; 89 1.1 christos *pinsn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); 90 1.1 christos return bfd_reloc_other; 91 1.1 christos } 92 1.1 christos 93 1.1 christos /* For unsupported relocs. */ 94 1.1 christos 95 1.1 christos static bfd_reloc_status_type 96 1.1 christos sparc_elf_notsup_reloc (bfd *abfd ATTRIBUTE_UNUSED, 97 1.1 christos arelent *reloc_entry ATTRIBUTE_UNUSED, 98 1.1 christos asymbol *symbol ATTRIBUTE_UNUSED, 99 1.1 christos void * data ATTRIBUTE_UNUSED, 100 1.1 christos asection *input_section ATTRIBUTE_UNUSED, 101 1.1 christos bfd *output_bfd ATTRIBUTE_UNUSED, 102 1.1 christos char **error_message ATTRIBUTE_UNUSED) 103 1.1 christos { 104 1.1 christos return bfd_reloc_notsupported; 105 1.1 christos } 106 1.1 christos 107 1.1 christos /* Handle the WDISP16 reloc. */ 108 1.1 christos 109 1.1 christos static bfd_reloc_status_type 110 1.1 christos sparc_elf_wdisp16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 111 1.1 christos void * data, asection *input_section, bfd *output_bfd, 112 1.1 christos char **error_message ATTRIBUTE_UNUSED) 113 1.1 christos { 114 1.1 christos bfd_vma relocation; 115 1.1 christos bfd_vma insn; 116 1.1 christos bfd_reloc_status_type status; 117 1.1 christos 118 1.1 christos status = init_insn_reloc (abfd, reloc_entry, symbol, data, 119 1.1 christos input_section, output_bfd, &relocation, &insn); 120 1.1 christos if (status != bfd_reloc_other) 121 1.1 christos return status; 122 1.1 christos 123 1.1 christos insn &= ~ (bfd_vma) 0x303fff; 124 1.1 christos insn |= (((relocation >> 2) & 0xc000) << 6) | ((relocation >> 2) & 0x3fff); 125 1.1 christos bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address); 126 1.1 christos 127 1.1 christos if ((bfd_signed_vma) relocation < - 0x40000 128 1.1 christos || (bfd_signed_vma) relocation > 0x3ffff) 129 1.1 christos return bfd_reloc_overflow; 130 1.1 christos else 131 1.1 christos return bfd_reloc_ok; 132 1.1 christos } 133 1.1 christos 134 1.1 christos /* Handle the WDISP10 reloc. */ 135 1.1 christos 136 1.1 christos static bfd_reloc_status_type 137 1.1 christos sparc_elf_wdisp10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 138 1.1 christos void * data, asection *input_section, bfd *output_bfd, 139 1.1 christos char **error_message ATTRIBUTE_UNUSED) 140 1.1 christos { 141 1.1 christos bfd_vma relocation; 142 1.1 christos bfd_vma insn; 143 1.1 christos bfd_reloc_status_type status; 144 1.1 christos 145 1.1 christos status = init_insn_reloc (abfd, reloc_entry, symbol, data, 146 1.1 christos input_section, output_bfd, &relocation, &insn); 147 1.1 christos if (status != bfd_reloc_other) 148 1.1 christos return status; 149 1.1 christos 150 1.1 christos insn &= ~ (bfd_vma) 0x181fe0; 151 1.1 christos insn |= (((relocation >> 2) & 0x300) << 11) 152 1.1 christos | (((relocation >> 2) & 0xff) << 5); 153 1.1 christos bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address); 154 1.1 christos 155 1.1 christos if ((bfd_signed_vma) relocation < - 0x1000 156 1.1 christos || (bfd_signed_vma) relocation > 0xfff) 157 1.1 christos return bfd_reloc_overflow; 158 1.1 christos else 159 1.1 christos return bfd_reloc_ok; 160 1.1 christos } 161 1.1 christos 162 1.1 christos /* Handle the HIX22 reloc. */ 163 1.1 christos 164 1.1 christos static bfd_reloc_status_type 165 1.1 christos sparc_elf_hix22_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 166 1.1 christos void * data, asection *input_section, bfd *output_bfd, 167 1.1 christos char **error_message ATTRIBUTE_UNUSED) 168 1.1 christos { 169 1.1 christos bfd_vma relocation; 170 1.1 christos bfd_vma insn; 171 1.1 christos bfd_reloc_status_type status; 172 1.1 christos 173 1.1 christos status = init_insn_reloc (abfd, reloc_entry, symbol, data, 174 1.1 christos input_section, output_bfd, &relocation, &insn); 175 1.1 christos if (status != bfd_reloc_other) 176 1.1 christos return status; 177 1.1 christos 178 1.1 christos relocation ^= MINUS_ONE; 179 1.1 christos insn = (insn &~ (bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff); 180 1.1 christos bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address); 181 1.1 christos 182 1.1 christos if ((relocation & ~ (bfd_vma) 0xffffffff) != 0) 183 1.1 christos return bfd_reloc_overflow; 184 1.1 christos else 185 1.1 christos return bfd_reloc_ok; 186 1.1 christos } 187 1.1 christos 188 1.1 christos /* Handle the LOX10 reloc. */ 189 1.1 christos 190 1.1 christos static bfd_reloc_status_type 191 1.1 christos sparc_elf_lox10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 192 1.1 christos void * data, asection *input_section, bfd *output_bfd, 193 1.1 christos char **error_message ATTRIBUTE_UNUSED) 194 1.1 christos { 195 1.1 christos bfd_vma relocation; 196 1.1 christos bfd_vma insn; 197 1.1 christos bfd_reloc_status_type status; 198 1.1 christos 199 1.1 christos status = init_insn_reloc (abfd, reloc_entry, symbol, data, 200 1.1 christos input_section, output_bfd, &relocation, &insn); 201 1.1 christos if (status != bfd_reloc_other) 202 1.1 christos return status; 203 1.1 christos 204 1.1 christos insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff); 205 1.1 christos bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address); 206 1.1 christos 207 1.1 christos return bfd_reloc_ok; 208 1.1 christos } 209 1.1 christos 210 1.1 christos static reloc_howto_type _bfd_sparc_elf_howto_table[] = 211 1.1 christos { 212 1.8 christos HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true), 213 1.8 christos HOWTO(R_SPARC_8, 0,1, 8,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_8", false,0,0x000000ff,true), 214 1.8 christos HOWTO(R_SPARC_16, 0,2,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_16", false,0,0x0000ffff,true), 215 1.8 christos HOWTO(R_SPARC_32, 0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_32", false,0,0xffffffff,true), 216 1.8 christos HOWTO(R_SPARC_DISP8, 0,1, 8,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP8", false,0,0x000000ff,true), 217 1.8 christos HOWTO(R_SPARC_DISP16, 0,2,16,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP16", false,0,0x0000ffff,true), 218 1.8 christos HOWTO(R_SPARC_DISP32, 0,4,32,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP32", false,0,0xffffffff,true), 219 1.8 christos HOWTO(R_SPARC_WDISP30, 2,4,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP30", false,0,0x3fffffff,true), 220 1.8 christos HOWTO(R_SPARC_WDISP22, 2,4,22,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP22", false,0,0x003fffff,true), 221 1.8 christos HOWTO(R_SPARC_HI22, 10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HI22", false,0,0x003fffff,true), 222 1.8 christos HOWTO(R_SPARC_22, 0,4,22,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_22", false,0,0x003fffff,true), 223 1.8 christos HOWTO(R_SPARC_13, 0,4,13,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_13", false,0,0x00001fff,true), 224 1.8 christos HOWTO(R_SPARC_LO10, 0,4,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LO10", false,0,0x000003ff,true), 225 1.8 christos HOWTO(R_SPARC_GOT10, 0,4,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT10", false,0,0x000003ff,true), 226 1.8 christos HOWTO(R_SPARC_GOT13, 0,4,13,false,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_GOT13", false,0,0x00001fff,true), 227 1.8 christos HOWTO(R_SPARC_GOT22, 10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT22", false,0,0x003fffff,true), 228 1.8 christos HOWTO(R_SPARC_PC10, 0,4,10,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC10", false,0,0x000003ff,true), 229 1.8 christos HOWTO(R_SPARC_PC22, 10,4,22,true, 0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PC22", false,0,0x003fffff,true), 230 1.8 christos HOWTO(R_SPARC_WPLT30, 2,4,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WPLT30", false,0,0x3fffffff,true), 231 1.8 christos HOWTO(R_SPARC_COPY, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_COPY", false,0,0x00000000,true), 232 1.8 christos HOWTO(R_SPARC_GLOB_DAT, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GLOB_DAT",false,0,0x00000000,true), 233 1.8 christos HOWTO(R_SPARC_JMP_SLOT, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_JMP_SLOT",false,0,0x00000000,true), 234 1.8 christos HOWTO(R_SPARC_RELATIVE, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_RELATIVE",false,0,0x00000000,true), 235 1.8 christos HOWTO(R_SPARC_UA32, 0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA32", false,0,0xffffffff,true), 236 1.8 christos HOWTO(R_SPARC_PLT32, 0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PLT32", false,0,0xffffffff,true), 237 1.8 christos HOWTO(R_SPARC_HIPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_HIPLT22", false,0,0x00000000,true), 238 1.8 christos HOWTO(R_SPARC_LOPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_LOPLT10", false,0,0x00000000,true), 239 1.8 christos HOWTO(R_SPARC_PCPLT32, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_PCPLT32", false,0,0x00000000,true), 240 1.8 christos HOWTO(R_SPARC_PCPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_PCPLT22", false,0,0x00000000,true), 241 1.8 christos HOWTO(R_SPARC_PCPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_PCPLT10", false,0,0x00000000,true), 242 1.8 christos HOWTO(R_SPARC_10, 0,4,10,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_10", false,0,0x000003ff,true), 243 1.8 christos HOWTO(R_SPARC_11, 0,4,11,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_11", false,0,0x000007ff,true), 244 1.8 christos HOWTO(R_SPARC_64, 0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_64", false,0,MINUS_ONE, true), 245 1.8 christos HOWTO(R_SPARC_OLO10, 0,4,13,false,0,complain_overflow_signed, sparc_elf_notsup_reloc, "R_SPARC_OLO10", false,0,0x00001fff,true), 246 1.8 christos HOWTO(R_SPARC_HH22, 42,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc, "R_SPARC_HH22", false,0,0x003fffff,true), 247 1.8 christos HOWTO(R_SPARC_HM10, 32,4,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HM10", false,0,0x000003ff,true), 248 1.8 christos HOWTO(R_SPARC_LM22, 10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LM22", false,0,0x003fffff,true), 249 1.8 christos HOWTO(R_SPARC_PC_HH22, 42,4,22,true, 0,complain_overflow_unsigned,bfd_elf_generic_reloc, "R_SPARC_PC_HH22", false,0,0x003fffff,true), 250 1.8 christos HOWTO(R_SPARC_PC_HM10, 32,4,10,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC_HM10", false,0,0x000003ff,true), 251 1.8 christos HOWTO(R_SPARC_PC_LM22, 10,4,22,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC_LM22", false,0,0x003fffff,true), 252 1.8 christos HOWTO(R_SPARC_WDISP16, 2,4,16,true, 0,complain_overflow_signed, sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", false,0,0x00000000,true), 253 1.8 christos HOWTO(R_SPARC_WDISP19, 2,4,19,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP19", false,0,0x0007ffff,true), 254 1.8 christos HOWTO(R_SPARC_UNUSED_42, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_UNUSED_42",false,0,0x00000000,true), 255 1.8 christos HOWTO(R_SPARC_7, 0,4, 7,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_7", false,0,0x0000007f,true), 256 1.8 christos HOWTO(R_SPARC_5, 0,4, 5,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_5", false,0,0x0000001f,true), 257 1.8 christos HOWTO(R_SPARC_6, 0,4, 6,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_6", false,0,0x0000003f,true), 258 1.8 christos HOWTO(R_SPARC_DISP64, 0,8,64,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP64", false,0,MINUS_ONE, true), 259 1.8 christos HOWTO(R_SPARC_PLT64, 0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PLT64", false,0,MINUS_ONE, true), 260 1.8 christos HOWTO(R_SPARC_HIX22, 0,8, 0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc, "R_SPARC_HIX22", false,0,MINUS_ONE, false), 261 1.8 christos HOWTO(R_SPARC_LOX10, 0,8, 0,false,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_LOX10", false,0,MINUS_ONE, false), 262 1.8 christos HOWTO(R_SPARC_H44, 22,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc, "R_SPARC_H44", false,0,0x003fffff,false), 263 1.8 christos HOWTO(R_SPARC_M44, 12,4,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_M44", false,0,0x000003ff,false), 264 1.8 christos HOWTO(R_SPARC_L44, 0,4,13,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_L44", false,0,0x00000fff,false), 265 1.8 christos HOWTO(R_SPARC_REGISTER, 0,8, 0,false,0,complain_overflow_bitfield,sparc_elf_notsup_reloc, "R_SPARC_REGISTER",false,0,MINUS_ONE, false), 266 1.8 christos HOWTO(R_SPARC_UA64, 0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA64", false,0,MINUS_ONE, true), 267 1.8 christos HOWTO(R_SPARC_UA16, 0,2,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA16", false,0,0x0000ffff,true), 268 1.8 christos HOWTO(R_SPARC_TLS_GD_HI22,10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_HI22",false,0,0x003fffff,true), 269 1.8 christos HOWTO(R_SPARC_TLS_GD_LO10,0,4,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_LO10",false,0,0x000003ff,true), 270 1.8 christos HOWTO(R_SPARC_TLS_GD_ADD,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_ADD",false,0,0x00000000,true), 271 1.8 christos HOWTO(R_SPARC_TLS_GD_CALL,2,4,30,true,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_CALL",false,0,0x3fffffff,true), 272 1.8 christos HOWTO(R_SPARC_TLS_LDM_HI22,10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_HI22",false,0,0x003fffff,true), 273 1.8 christos HOWTO(R_SPARC_TLS_LDM_LO10,0,4,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_LO10",false,0,0x000003ff,true), 274 1.8 christos HOWTO(R_SPARC_TLS_LDM_ADD,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_ADD",false,0,0x00000000,true), 275 1.8 christos HOWTO(R_SPARC_TLS_LDM_CALL,2,4,30,true,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_CALL",false,0,0x3fffffff,true), 276 1.8 christos HOWTO(R_SPARC_TLS_LDO_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_TLS_LDO_HIX22",false,0,0x003fffff, false), 277 1.8 christos HOWTO(R_SPARC_TLS_LDO_LOX10,0,4,0,false,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_TLS_LDO_LOX10",false,0,0x000003ff, false), 278 1.8 christos HOWTO(R_SPARC_TLS_LDO_ADD,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDO_ADD",false,0,0x00000000,true), 279 1.8 christos HOWTO(R_SPARC_TLS_IE_HI22,10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_HI22",false,0,0x003fffff,true), 280 1.8 christos HOWTO(R_SPARC_TLS_IE_LO10,0,4,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_LO10",false,0,0x000003ff,true), 281 1.8 christos HOWTO(R_SPARC_TLS_IE_LD,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_LD",false,0,0x00000000,true), 282 1.8 christos HOWTO(R_SPARC_TLS_IE_LDX,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_LDX",false,0,0x00000000,true), 283 1.8 christos HOWTO(R_SPARC_TLS_IE_ADD,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_ADD",false,0,0x00000000,true), 284 1.8 christos HOWTO(R_SPARC_TLS_LE_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc, "R_SPARC_TLS_LE_HIX22",false,0,0x003fffff, false), 285 1.8 christos HOWTO(R_SPARC_TLS_LE_LOX10,0,4,0,false,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_TLS_LE_LOX10",false,0,0x000003ff, false), 286 1.8 christos HOWTO(R_SPARC_TLS_DTPMOD32,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD32",false,0,0x00000000,true), 287 1.8 christos HOWTO(R_SPARC_TLS_DTPMOD64,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD64",false,0,0x00000000,true), 288 1.8 christos HOWTO(R_SPARC_TLS_DTPOFF32,0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF32",false,0,0xffffffff,true), 289 1.8 christos HOWTO(R_SPARC_TLS_DTPOFF64,0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF64",false,0,MINUS_ONE,true), 290 1.8 christos HOWTO(R_SPARC_TLS_TPOFF32,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF32",false,0,0x00000000,true), 291 1.8 christos HOWTO(R_SPARC_TLS_TPOFF64,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF64",false,0,0x00000000,true), 292 1.8 christos HOWTO(R_SPARC_GOTDATA_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_HIX22",false,0,0x003fffff, false), 293 1.8 christos HOWTO(R_SPARC_GOTDATA_LOX10,0,4,0,false,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_GOTDATA_LOX10",false,0,0x000003ff, false), 294 1.8 christos HOWTO(R_SPARC_GOTDATA_OP_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_OP_HIX22",false,0,0x003fffff, false), 295 1.8 christos HOWTO(R_SPARC_GOTDATA_OP_LOX10,0,4,0,false,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_GOTDATA_OP_LOX10",false,0,0x000003ff, false), 296 1.8 christos HOWTO(R_SPARC_GOTDATA_OP,0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOTDATA_OP",false,0,0x00000000,true), 297 1.8 christos HOWTO(R_SPARC_H34,12,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,"R_SPARC_H34",false,0,0x003fffff,false), 298 1.8 christos HOWTO(R_SPARC_SIZE32,0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE32",false,0,0xffffffff,true), 299 1.8 christos HOWTO(R_SPARC_SIZE64,0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE64",false,0,MINUS_ONE, true), 300 1.8 christos HOWTO(R_SPARC_WDISP10,2,4,10,true, 0,complain_overflow_signed,sparc_elf_wdisp10_reloc,"R_SPARC_WDISP10",false,0,0x00000000,true), 301 1.1 christos }; 302 1.1 christos static reloc_howto_type sparc_jmp_irel_howto = 303 1.8 christos HOWTO(R_SPARC_JMP_IREL, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_JMP_IREL",false,0,0x00000000,true); 304 1.1 christos static reloc_howto_type sparc_irelative_howto = 305 1.8 christos HOWTO(R_SPARC_IRELATIVE, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_IRELATIVE",false,0,0x00000000,true); 306 1.1 christos static reloc_howto_type sparc_vtinherit_howto = 307 1.8 christos HOWTO (R_SPARC_GNU_VTINHERIT, 0,4,0,false,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", false,0, 0, false); 308 1.1 christos static reloc_howto_type sparc_vtentry_howto = 309 1.8 christos HOWTO (R_SPARC_GNU_VTENTRY, 0,4,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_SPARC_GNU_VTENTRY", false,0,0, false); 310 1.1 christos static reloc_howto_type sparc_rev32_howto = 311 1.8 christos HOWTO(R_SPARC_REV32, 0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", false,0,0xffffffff,true); 312 1.1 christos 313 1.1 christos reloc_howto_type * 314 1.6 christos _bfd_sparc_elf_reloc_type_lookup (bfd *abfd, 315 1.1 christos bfd_reloc_code_real_type code) 316 1.1 christos { 317 1.1 christos /* We explicitly handle each relocation type in the switch 318 1.1 christos instead of using a lookup table for efficiency. */ 319 1.1 christos switch (code) 320 1.1 christos { 321 1.1 christos case BFD_RELOC_NONE: 322 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_NONE]; 323 1.1 christos 324 1.1 christos case BFD_RELOC_8: 325 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_8]; 326 1.1 christos 327 1.1 christos case BFD_RELOC_16: 328 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_16]; 329 1.1 christos 330 1.1 christos case BFD_RELOC_32: 331 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_32]; 332 1.1 christos 333 1.1 christos case BFD_RELOC_8_PCREL: 334 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_DISP8]; 335 1.1 christos 336 1.1 christos case BFD_RELOC_16_PCREL: 337 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_DISP16]; 338 1.1 christos 339 1.1 christos case BFD_RELOC_32_PCREL: 340 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_DISP32]; 341 1.1 christos 342 1.1 christos case BFD_RELOC_32_PCREL_S2: 343 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP30]; 344 1.1 christos 345 1.1 christos case BFD_RELOC_SPARC_WDISP22: 346 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP22]; 347 1.1 christos 348 1.1 christos case BFD_RELOC_HI22: 349 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_HI22]; 350 1.1 christos 351 1.1 christos case BFD_RELOC_SPARC22: 352 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_22]; 353 1.1 christos 354 1.1 christos case BFD_RELOC_SPARC13: 355 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_13]; 356 1.1 christos 357 1.1 christos case BFD_RELOC_LO10: 358 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_LO10]; 359 1.1 christos 360 1.1 christos case BFD_RELOC_SPARC_GOT10: 361 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOT10]; 362 1.1 christos 363 1.1 christos case BFD_RELOC_SPARC_GOT13: 364 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOT13]; 365 1.1 christos 366 1.1 christos case BFD_RELOC_SPARC_GOT22: 367 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOT22]; 368 1.1 christos 369 1.1 christos case BFD_RELOC_SPARC_PC10: 370 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_PC10]; 371 1.1 christos 372 1.1 christos case BFD_RELOC_SPARC_PC22: 373 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_PC22]; 374 1.1 christos 375 1.1 christos case BFD_RELOC_SPARC_WPLT30: 376 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_WPLT30]; 377 1.1 christos 378 1.1 christos case BFD_RELOC_SPARC_COPY: 379 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_COPY]; 380 1.1 christos 381 1.1 christos case BFD_RELOC_SPARC_GLOB_DAT: 382 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GLOB_DAT]; 383 1.1 christos 384 1.1 christos case BFD_RELOC_SPARC_JMP_SLOT: 385 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_JMP_SLOT]; 386 1.1 christos 387 1.1 christos case BFD_RELOC_SPARC_RELATIVE: 388 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_RELATIVE]; 389 1.1 christos 390 1.1 christos case BFD_RELOC_SPARC_UA32: 391 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_UA32]; 392 1.1 christos 393 1.1 christos case BFD_RELOC_SPARC_PLT32: 394 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_PLT32]; 395 1.1 christos 396 1.1 christos case BFD_RELOC_SPARC_10: 397 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_10]; 398 1.1 christos 399 1.1 christos case BFD_RELOC_SPARC_11: 400 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_11]; 401 1.1 christos 402 1.1 christos case BFD_RELOC_SPARC_64: 403 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_64]; 404 1.1 christos 405 1.1 christos case BFD_RELOC_SPARC_OLO10: 406 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_OLO10]; 407 1.1 christos 408 1.1 christos case BFD_RELOC_SPARC_HH22: 409 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_HH22]; 410 1.1 christos 411 1.1 christos case BFD_RELOC_SPARC_HM10: 412 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_HM10]; 413 1.1 christos 414 1.1 christos case BFD_RELOC_SPARC_LM22: 415 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_LM22]; 416 1.1 christos 417 1.1 christos case BFD_RELOC_SPARC_PC_HH22: 418 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HH22]; 419 1.1 christos 420 1.1 christos case BFD_RELOC_SPARC_PC_HM10: 421 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HM10]; 422 1.1 christos 423 1.1 christos case BFD_RELOC_SPARC_PC_LM22: 424 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_PC_LM22]; 425 1.1 christos 426 1.1 christos case BFD_RELOC_SPARC_WDISP16: 427 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP16]; 428 1.1 christos 429 1.1 christos case BFD_RELOC_SPARC_WDISP19: 430 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP19]; 431 1.1 christos 432 1.1 christos case BFD_RELOC_SPARC_7: 433 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_7]; 434 1.1 christos 435 1.1 christos case BFD_RELOC_SPARC_5: 436 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_5]; 437 1.1 christos 438 1.1 christos case BFD_RELOC_SPARC_6: 439 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_6]; 440 1.1 christos 441 1.1 christos case BFD_RELOC_SPARC_DISP64: 442 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_DISP64]; 443 1.1 christos 444 1.1 christos case BFD_RELOC_SPARC_PLT64: 445 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_PLT64]; 446 1.1 christos 447 1.1 christos case BFD_RELOC_SPARC_HIX22: 448 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_HIX22]; 449 1.1 christos 450 1.1 christos case BFD_RELOC_SPARC_LOX10: 451 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_LOX10]; 452 1.1 christos 453 1.1 christos case BFD_RELOC_SPARC_H44: 454 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_H44]; 455 1.1 christos 456 1.1 christos case BFD_RELOC_SPARC_M44: 457 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_M44]; 458 1.1 christos 459 1.1 christos case BFD_RELOC_SPARC_L44: 460 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_L44]; 461 1.1 christos 462 1.1 christos case BFD_RELOC_SPARC_REGISTER: 463 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_REGISTER]; 464 1.1 christos 465 1.1 christos case BFD_RELOC_SPARC_UA64: 466 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_UA64]; 467 1.1 christos 468 1.1 christos case BFD_RELOC_SPARC_UA16: 469 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_UA16]; 470 1.1 christos 471 1.1 christos case BFD_RELOC_SPARC_TLS_GD_HI22: 472 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_HI22]; 473 1.1 christos 474 1.1 christos case BFD_RELOC_SPARC_TLS_GD_LO10: 475 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_LO10]; 476 1.1 christos 477 1.1 christos case BFD_RELOC_SPARC_TLS_GD_ADD: 478 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_ADD]; 479 1.1 christos 480 1.1 christos case BFD_RELOC_SPARC_TLS_GD_CALL: 481 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_CALL]; 482 1.1 christos 483 1.1 christos case BFD_RELOC_SPARC_TLS_LDM_HI22: 484 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_HI22]; 485 1.1 christos 486 1.1 christos case BFD_RELOC_SPARC_TLS_LDM_LO10: 487 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_LO10]; 488 1.1 christos 489 1.1 christos case BFD_RELOC_SPARC_TLS_LDM_ADD: 490 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_ADD]; 491 1.1 christos 492 1.1 christos case BFD_RELOC_SPARC_TLS_LDM_CALL: 493 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_CALL]; 494 1.1 christos 495 1.1 christos case BFD_RELOC_SPARC_TLS_LDO_HIX22: 496 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_HIX22]; 497 1.1 christos 498 1.1 christos case BFD_RELOC_SPARC_TLS_LDO_LOX10: 499 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_LOX10]; 500 1.1 christos 501 1.1 christos case BFD_RELOC_SPARC_TLS_LDO_ADD: 502 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_ADD]; 503 1.1 christos 504 1.1 christos case BFD_RELOC_SPARC_TLS_IE_HI22: 505 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_HI22]; 506 1.1 christos 507 1.1 christos case BFD_RELOC_SPARC_TLS_IE_LO10: 508 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LO10]; 509 1.1 christos 510 1.1 christos case BFD_RELOC_SPARC_TLS_IE_LD: 511 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LD]; 512 1.1 christos 513 1.1 christos case BFD_RELOC_SPARC_TLS_IE_LDX: 514 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LDX]; 515 1.1 christos 516 1.1 christos case BFD_RELOC_SPARC_TLS_IE_ADD: 517 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_ADD]; 518 1.1 christos 519 1.1 christos case BFD_RELOC_SPARC_TLS_LE_HIX22: 520 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_HIX22]; 521 1.1 christos 522 1.1 christos case BFD_RELOC_SPARC_TLS_LE_LOX10: 523 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_LOX10]; 524 1.1 christos 525 1.1 christos case BFD_RELOC_SPARC_TLS_DTPMOD32: 526 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD32]; 527 1.1 christos 528 1.1 christos case BFD_RELOC_SPARC_TLS_DTPMOD64: 529 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD64]; 530 1.1 christos 531 1.1 christos case BFD_RELOC_SPARC_TLS_DTPOFF32: 532 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF32]; 533 1.1 christos 534 1.1 christos case BFD_RELOC_SPARC_TLS_DTPOFF64: 535 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF64]; 536 1.1 christos 537 1.1 christos case BFD_RELOC_SPARC_TLS_TPOFF32: 538 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF32]; 539 1.1 christos 540 1.1 christos case BFD_RELOC_SPARC_TLS_TPOFF64: 541 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF64]; 542 1.1 christos 543 1.1 christos case BFD_RELOC_SPARC_GOTDATA_HIX22: 544 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_HIX22]; 545 1.1 christos 546 1.1 christos case BFD_RELOC_SPARC_GOTDATA_LOX10: 547 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_LOX10]; 548 1.1 christos 549 1.1 christos case BFD_RELOC_SPARC_GOTDATA_OP_HIX22: 550 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_HIX22]; 551 1.1 christos 552 1.1 christos case BFD_RELOC_SPARC_GOTDATA_OP_LOX10: 553 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_LOX10]; 554 1.1 christos 555 1.1 christos case BFD_RELOC_SPARC_GOTDATA_OP: 556 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP]; 557 1.1 christos 558 1.1 christos case BFD_RELOC_SPARC_H34: 559 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_H34]; 560 1.1 christos 561 1.1 christos case BFD_RELOC_SPARC_SIZE32: 562 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE32]; 563 1.1 christos 564 1.1 christos case BFD_RELOC_SPARC_SIZE64: 565 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE64]; 566 1.1 christos 567 1.1 christos case BFD_RELOC_SPARC_WDISP10: 568 1.1 christos return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP10]; 569 1.1 christos 570 1.1 christos case BFD_RELOC_SPARC_JMP_IREL: 571 1.1 christos return &sparc_jmp_irel_howto; 572 1.1 christos 573 1.1 christos case BFD_RELOC_SPARC_IRELATIVE: 574 1.1 christos return &sparc_irelative_howto; 575 1.1 christos 576 1.1 christos case BFD_RELOC_VTABLE_INHERIT: 577 1.1 christos return &sparc_vtinherit_howto; 578 1.1 christos 579 1.1 christos case BFD_RELOC_VTABLE_ENTRY: 580 1.1 christos return &sparc_vtentry_howto; 581 1.1 christos 582 1.1 christos case BFD_RELOC_SPARC_REV32: 583 1.1 christos return &sparc_rev32_howto; 584 1.1 christos 585 1.1 christos default: 586 1.1 christos break; 587 1.1 christos } 588 1.6 christos /* xgettext:c-format */ 589 1.6 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code); 590 1.6 christos bfd_set_error (bfd_error_bad_value); 591 1.6 christos return NULL; 592 1.1 christos } 593 1.1 christos 594 1.1 christos reloc_howto_type * 595 1.1 christos _bfd_sparc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 596 1.1 christos const char *r_name) 597 1.1 christos { 598 1.1 christos unsigned int i; 599 1.1 christos 600 1.6 christos for (i = 0; i < ARRAY_SIZE (_bfd_sparc_elf_howto_table); i++) 601 1.1 christos if (_bfd_sparc_elf_howto_table[i].name != NULL 602 1.1 christos && strcasecmp (_bfd_sparc_elf_howto_table[i].name, r_name) == 0) 603 1.1 christos return &_bfd_sparc_elf_howto_table[i]; 604 1.1 christos 605 1.1 christos if (strcasecmp (sparc_vtinherit_howto.name, r_name) == 0) 606 1.1 christos return &sparc_vtinherit_howto; 607 1.1 christos if (strcasecmp (sparc_vtentry_howto.name, r_name) == 0) 608 1.1 christos return &sparc_vtentry_howto; 609 1.1 christos if (strcasecmp (sparc_rev32_howto.name, r_name) == 0) 610 1.1 christos return &sparc_rev32_howto; 611 1.1 christos 612 1.1 christos return NULL; 613 1.1 christos } 614 1.1 christos 615 1.1 christos reloc_howto_type * 616 1.6 christos _bfd_sparc_elf_info_to_howto_ptr (bfd *abfd ATTRIBUTE_UNUSED, 617 1.6 christos unsigned int r_type) 618 1.1 christos { 619 1.1 christos switch (r_type) 620 1.1 christos { 621 1.1 christos case R_SPARC_JMP_IREL: 622 1.1 christos return &sparc_jmp_irel_howto; 623 1.1 christos 624 1.1 christos case R_SPARC_IRELATIVE: 625 1.1 christos return &sparc_irelative_howto; 626 1.1 christos 627 1.1 christos case R_SPARC_GNU_VTINHERIT: 628 1.1 christos return &sparc_vtinherit_howto; 629 1.1 christos 630 1.1 christos case R_SPARC_GNU_VTENTRY: 631 1.1 christos return &sparc_vtentry_howto; 632 1.1 christos 633 1.1 christos case R_SPARC_REV32: 634 1.1 christos return &sparc_rev32_howto; 635 1.1 christos 636 1.1 christos default: 637 1.1 christos if (r_type >= (unsigned int) R_SPARC_max_std) 638 1.1 christos { 639 1.6 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 640 1.6 christos abfd, r_type); 641 1.6 christos bfd_set_error (bfd_error_bad_value); 642 1.6 christos return NULL; 643 1.1 christos } 644 1.1 christos return &_bfd_sparc_elf_howto_table[r_type]; 645 1.1 christos } 646 1.1 christos } 647 1.1 christos 648 1.1 christos /* Both 32-bit and 64-bit sparc encode this in an identical manner, 649 1.1 christos so just take advantage of that. */ 650 1.1 christos #define SPARC_ELF_R_TYPE(r_info) \ 651 1.1 christos ((r_info) & 0xff) 652 1.1 christos 653 1.8 christos bool 654 1.6 christos _bfd_sparc_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, 655 1.1 christos Elf_Internal_Rela *dst) 656 1.1 christos { 657 1.1 christos unsigned int r_type = SPARC_ELF_R_TYPE (dst->r_info); 658 1.1 christos 659 1.6 christos if ((cache_ptr->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, r_type)) == NULL) 660 1.6 christos { 661 1.6 christos bfd_set_error (bfd_error_bad_value); 662 1.8 christos return false; 663 1.6 christos } 664 1.8 christos return true; 665 1.1 christos } 666 1.1 christos 667 1.1 christos 669 1.1 christos /* The nop opcode we use. */ 670 1.1 christos #define SPARC_NOP 0x01000000 671 1.1 christos 672 1.1 christos #define SPARC_INSN_BYTES 4 673 1.6 christos 674 1.6 christos /* Is an undefined weak symbol resolved to 0 ? 675 1.6 christos Reference to an undefined weak symbol is resolved to 0 when 676 1.6 christos building an executable if it isn't dynamic and 677 1.6 christos 1. Has non-GOT/non-PLT relocations in text section. 678 1.6 christos Or 679 1.6 christos 2. Has no GOT/PLT relocation. */ 680 1.6 christos #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH) \ 681 1.6 christos ((EH)->elf.root.type == bfd_link_hash_undefweak \ 682 1.6 christos && bfd_link_executable (INFO) \ 683 1.6 christos && (_bfd_sparc_elf_hash_table (INFO)->interp == NULL \ 684 1.6 christos || !(INFO)->dynamic_undefined_weak \ 685 1.6 christos || (EH)->has_non_got_reloc \ 686 1.1 christos || !(EH)->has_got_reloc)) 687 1.1 christos 688 1.1 christos /* SPARC ELF linker hash entry. */ 689 1.1 christos 690 1.1 christos struct _bfd_sparc_elf_link_hash_entry 691 1.1 christos { 692 1.1 christos struct elf_link_hash_entry elf; 693 1.1 christos 694 1.1 christos #define GOT_UNKNOWN 0 695 1.1 christos #define GOT_NORMAL 1 696 1.1 christos #define GOT_TLS_GD 2 697 1.1 christos #define GOT_TLS_IE 3 698 1.6 christos unsigned char tls_type; 699 1.6 christos 700 1.6 christos /* Symbol has GOT or PLT relocations. */ 701 1.6 christos unsigned int has_got_reloc : 1; 702 1.6 christos 703 1.6 christos /* Symbol has old-style, non-relaxable GOT relocations. */ 704 1.6 christos unsigned int has_old_style_got_reloc : 1; 705 1.6 christos 706 1.6 christos /* Symbol has non-GOT/non-PLT relocations in text sections. */ 707 1.6 christos unsigned int has_non_got_reloc : 1; 708 1.1 christos 709 1.1 christos }; 710 1.1 christos 711 1.1 christos #define _bfd_sparc_elf_hash_entry(ent) ((struct _bfd_sparc_elf_link_hash_entry *)(ent)) 712 1.1 christos 713 1.1 christos struct _bfd_sparc_elf_obj_tdata 714 1.1 christos { 715 1.1 christos struct elf_obj_tdata root; 716 1.1 christos 717 1.1 christos /* tls_type for each local got entry. */ 718 1.1 christos char *local_got_tls_type; 719 1.1 christos 720 1.8 christos /* TRUE if TLS GD relocs has been seen for this object. */ 721 1.1 christos bool has_tlsgd; 722 1.1 christos }; 723 1.1 christos 724 1.1 christos #define _bfd_sparc_elf_tdata(abfd) \ 725 1.1 christos ((struct _bfd_sparc_elf_obj_tdata *) (abfd)->tdata.any) 726 1.1 christos 727 1.1 christos #define _bfd_sparc_elf_local_got_tls_type(abfd) \ 728 1.1 christos (_bfd_sparc_elf_tdata (abfd)->local_got_tls_type) 729 1.1 christos 730 1.1 christos #define is_sparc_elf(bfd) \ 731 1.1 christos (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ 732 1.1 christos && elf_tdata (bfd) != NULL \ 733 1.1 christos && elf_object_id (bfd) == SPARC_ELF_DATA) 734 1.8 christos 735 1.1 christos bool 736 1.1 christos _bfd_sparc_elf_mkobject (bfd *abfd) 737 1.10 christos { 738 1.10 christos return bfd_elf_allocate_object (abfd, 739 1.1 christos sizeof (struct _bfd_sparc_elf_obj_tdata)); 740 1.1 christos } 741 1.1 christos 742 1.1 christos static void 743 1.1 christos sparc_put_word_32 (bfd *abfd, bfd_vma val, void *ptr) 744 1.1 christos { 745 1.1 christos bfd_put_32 (abfd, val, ptr); 746 1.1 christos } 747 1.1 christos 748 1.1 christos static void 749 1.1 christos sparc_put_word_64 (bfd *abfd, bfd_vma val, void *ptr) 750 1.1 christos { 751 1.1 christos bfd_put_64 (abfd, val, ptr); 752 1.1 christos } 753 1.1 christos 754 1.1 christos static void 755 1.1 christos sparc_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel) 756 1.1 christos { 757 1.1 christos const struct elf_backend_data *bed; 758 1.1 christos bfd_byte *loc; 759 1.1 christos 760 1.6 christos bed = get_elf_backend_data (abfd); 761 1.1 christos BFD_ASSERT (s->reloc_count * bed->s->sizeof_rela < s->size); 762 1.1 christos loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela); 763 1.1 christos bed->s->swap_reloca_out (abfd, rel, loc); 764 1.1 christos } 765 1.1 christos 766 1.1 christos static bfd_vma 767 1.1 christos sparc_elf_r_info_64 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED, 768 1.1 christos bfd_vma rel_index ATTRIBUTE_UNUSED, 769 1.1 christos bfd_vma type ATTRIBUTE_UNUSED) 770 1.1 christos { 771 1.1 christos return ELF64_R_INFO (rel_index, 772 1.1 christos (in_rel ? 773 1.1 christos ELF64_R_TYPE_INFO (ELF64_R_TYPE_DATA (in_rel->r_info), 774 1.1 christos type) : type)); 775 1.1 christos } 776 1.1 christos 777 1.1 christos static bfd_vma 778 1.1 christos sparc_elf_r_info_32 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED, 779 1.1 christos bfd_vma rel_index, bfd_vma type) 780 1.1 christos { 781 1.1 christos return ELF32_R_INFO (rel_index, type); 782 1.1 christos } 783 1.1 christos 784 1.1 christos static bfd_vma 785 1.1 christos sparc_elf_r_symndx_64 (bfd_vma r_info) 786 1.1 christos { 787 1.1 christos bfd_vma r_symndx = ELF32_R_SYM (r_info); 788 1.1 christos return (r_symndx >> 24); 789 1.1 christos } 790 1.1 christos 791 1.1 christos static bfd_vma 792 1.1 christos sparc_elf_r_symndx_32 (bfd_vma r_info) 793 1.1 christos { 794 1.1 christos return ELF32_R_SYM (r_info); 795 1.1 christos } 796 1.1 christos 797 1.1 christos /* PLT/GOT stuff */ 798 1.1 christos 799 1.1 christos #define PLT32_ENTRY_SIZE 12 800 1.1 christos #define PLT32_HEADER_SIZE (4 * PLT32_ENTRY_SIZE) 801 1.1 christos 802 1.1 christos /* The first four entries in a 32-bit procedure linkage table are reserved, 803 1.1 christos and the initial contents are unimportant (we zero them out). 804 1.1 christos Subsequent entries look like this. See the SVR4 ABI SPARC 805 1.1 christos supplement to see how this works. */ 806 1.1 christos 807 1.1 christos /* sethi %hi(.-.plt0),%g1. We fill in the address later. */ 808 1.1 christos #define PLT32_ENTRY_WORD0 0x03000000 809 1.1 christos /* b,a .plt0. We fill in the offset later. */ 810 1.1 christos #define PLT32_ENTRY_WORD1 0x30800000 811 1.1 christos /* nop. */ 812 1.1 christos #define PLT32_ENTRY_WORD2 SPARC_NOP 813 1.1 christos 814 1.1 christos static int 815 1.1 christos sparc32_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset, 816 1.1 christos bfd_vma max ATTRIBUTE_UNUSED, 817 1.1 christos bfd_vma *r_offset) 818 1.1 christos { 819 1.1 christos bfd_put_32 (output_bfd, 820 1.1 christos PLT32_ENTRY_WORD0 + offset, 821 1.1 christos splt->contents + offset); 822 1.1 christos bfd_put_32 (output_bfd, 823 1.1 christos (PLT32_ENTRY_WORD1 824 1.1 christos + (((- (offset + 4)) >> 2) & 0x3fffff)), 825 1.1 christos splt->contents + offset + 4); 826 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) PLT32_ENTRY_WORD2, 827 1.1 christos splt->contents + offset + 8); 828 1.1 christos 829 1.1 christos *r_offset = offset; 830 1.1 christos 831 1.1 christos return offset / PLT32_ENTRY_SIZE - 4; 832 1.1 christos } 833 1.1 christos 834 1.1 christos /* Both the headers and the entries are icache aligned. */ 835 1.1 christos #define PLT64_ENTRY_SIZE 32 836 1.1 christos #define PLT64_HEADER_SIZE (4 * PLT64_ENTRY_SIZE) 837 1.1 christos #define PLT64_LARGE_THRESHOLD 32768 838 1.1 christos 839 1.1 christos static int 840 1.1 christos sparc64_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset, 841 1.1 christos bfd_vma max, bfd_vma *r_offset) 842 1.1 christos { 843 1.1 christos unsigned char *entry = splt->contents + offset; 844 1.1 christos const unsigned int nop = SPARC_NOP; 845 1.1 christos int plt_index; 846 1.1 christos 847 1.1 christos if (offset < (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)) 848 1.1 christos { 849 1.1 christos unsigned int sethi, ba; 850 1.1 christos 851 1.1 christos *r_offset = offset; 852 1.1 christos 853 1.1 christos plt_index = (offset / PLT64_ENTRY_SIZE); 854 1.1 christos 855 1.1 christos sethi = 0x03000000 | (plt_index * PLT64_ENTRY_SIZE); 856 1.1 christos ba = 0x30680000 857 1.1 christos | (((splt->contents + PLT64_ENTRY_SIZE) - (entry + 4)) / 4 & 0x7ffff); 858 1.1 christos 859 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) sethi, entry); 860 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) ba, entry + 4); 861 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 8); 862 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 12); 863 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 16); 864 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 20); 865 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 24); 866 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 28); 867 1.1 christos } 868 1.1 christos else 869 1.1 christos { 870 1.1 christos unsigned char *ptr; 871 1.1 christos unsigned int ldx; 872 1.1 christos int block, last_block, ofs, last_ofs, chunks_this_block; 873 1.1 christos const int insn_chunk_size = (6 * 4); 874 1.1 christos const int ptr_chunk_size = (1 * 8); 875 1.1 christos const int entries_per_block = 160; 876 1.1 christos const int block_size = entries_per_block * (insn_chunk_size 877 1.1 christos + ptr_chunk_size); 878 1.1 christos 879 1.1 christos /* Entries 32768 and higher are grouped into blocks of 160. 880 1.1 christos The blocks are further subdivided into 160 sequences of 881 1.1 christos 6 instructions and 160 pointers. If a block does not require 882 1.1 christos the full 160 entries, let's say it requires N, then there 883 1.1 christos will be N sequences of 6 instructions and N pointers. */ 884 1.1 christos 885 1.1 christos offset -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE); 886 1.1 christos max -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE); 887 1.1 christos 888 1.1 christos block = offset / block_size; 889 1.1 christos last_block = max / block_size; 890 1.1 christos if (block != last_block) 891 1.1 christos { 892 1.1 christos chunks_this_block = 160; 893 1.1 christos } 894 1.1 christos else 895 1.1 christos { 896 1.1 christos last_ofs = max % block_size; 897 1.1 christos chunks_this_block = last_ofs / (insn_chunk_size + ptr_chunk_size); 898 1.1 christos } 899 1.1 christos 900 1.1 christos ofs = offset % block_size; 901 1.1 christos 902 1.1 christos plt_index = (PLT64_LARGE_THRESHOLD + 903 1.1 christos (block * 160) + 904 1.1 christos (ofs / insn_chunk_size)); 905 1.1 christos 906 1.1 christos ptr = splt->contents 907 1.1 christos + (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE) 908 1.1 christos + (block * block_size) 909 1.1 christos + (chunks_this_block * insn_chunk_size) 910 1.1 christos + (ofs / insn_chunk_size) * ptr_chunk_size; 911 1.1 christos 912 1.1 christos *r_offset = (bfd_vma) (ptr - splt->contents); 913 1.1 christos 914 1.1 christos ldx = 0xc25be000 | ((ptr - (entry+4)) & 0x1fff); 915 1.1 christos 916 1.1 christos /* mov %o7,%g5 917 1.1 christos call .+8 918 1.1 christos nop 919 1.1 christos ldx [%o7+P],%g1 920 1.1 christos jmpl %o7+%g1,%g1 921 1.1 christos mov %g5,%o7 */ 922 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0x8a10000f, entry); 923 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0x40000002, entry + 4); 924 1.6 christos bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP, entry + 8); 925 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) ldx, entry + 12); 926 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0x83c3c001, entry + 16); 927 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0x9e100005, entry + 20); 928 1.1 christos 929 1.1 christos bfd_put_64 (output_bfd, (bfd_vma) (splt->contents - (entry + 4)), ptr); 930 1.1 christos } 931 1.1 christos 932 1.1 christos return plt_index - 4; 933 1.1 christos } 934 1.1 christos 935 1.1 christos /* The format of the first PLT entry in a VxWorks executable. */ 936 1.1 christos static const bfd_vma sparc_vxworks_exec_plt0_entry[] = 937 1.1 christos { 938 1.1 christos 0x05000000, /* sethi %hi(_GLOBAL_OFFSET_TABLE_+8), %g2 */ 939 1.1 christos 0x8410a000, /* or %g2, %lo(_GLOBAL_OFFSET_TABLE_+8), %g2 */ 940 1.1 christos 0xc4008000, /* ld [ %g2 ], %g2 */ 941 1.1 christos 0x81c08000, /* jmp %g2 */ 942 1.1 christos 0x01000000 /* nop */ 943 1.1 christos }; 944 1.1 christos 945 1.1 christos /* The format of subsequent PLT entries. */ 946 1.1 christos static const bfd_vma sparc_vxworks_exec_plt_entry[] = 947 1.1 christos { 948 1.1 christos 0x03000000, /* sethi %hi(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */ 949 1.1 christos 0x82106000, /* or %g1, %lo(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */ 950 1.1 christos 0xc2004000, /* ld [ %g1 ], %g1 */ 951 1.1 christos 0x81c04000, /* jmp %g1 */ 952 1.1 christos 0x01000000, /* nop */ 953 1.1 christos 0x03000000, /* sethi %hi(f@pltindex), %g1 */ 954 1.1 christos 0x10800000, /* b _PLT_resolve */ 955 1.1 christos 0x82106000 /* or %g1, %lo(f@pltindex), %g1 */ 956 1.1 christos }; 957 1.1 christos 958 1.1 christos /* The format of the first PLT entry in a VxWorks shared object. */ 959 1.1 christos static const bfd_vma sparc_vxworks_shared_plt0_entry[] = 960 1.1 christos { 961 1.1 christos 0xc405e008, /* ld [ %l7 + 8 ], %g2 */ 962 1.1 christos 0x81c08000, /* jmp %g2 */ 963 1.1 christos 0x01000000 /* nop */ 964 1.1 christos }; 965 1.1 christos 966 1.1 christos /* The format of subsequent PLT entries. */ 967 1.1 christos static const bfd_vma sparc_vxworks_shared_plt_entry[] = 968 1.1 christos { 969 1.1 christos 0x03000000, /* sethi %hi(f@got), %g1 */ 970 1.1 christos 0x82106000, /* or %g1, %lo(f@got), %g1 */ 971 1.1 christos 0xc205c001, /* ld [ %l7 + %g1 ], %g1 */ 972 1.1 christos 0x81c04000, /* jmp %g1 */ 973 1.1 christos 0x01000000, /* nop */ 974 1.1 christos 0x03000000, /* sethi %hi(f@pltindex), %g1 */ 975 1.1 christos 0x10800000, /* b _PLT_resolve */ 976 1.1 christos 0x82106000 /* or %g1, %lo(f@pltindex), %g1 */ 977 1.1 christos }; 978 1.1 christos 979 1.1 christos #define SPARC_ELF_PUT_WORD(htab, bfd, val, ptr) \ 980 1.1 christos htab->put_word(bfd, val, ptr) 981 1.1 christos 982 1.1 christos #define SPARC_ELF_R_INFO(htab, in_rel, index, type) \ 983 1.1 christos htab->r_info(in_rel, index, type) 984 1.1 christos 985 1.1 christos #define SPARC_ELF_R_SYMNDX(htab, r_info) \ 986 1.1 christos htab->r_symndx(r_info) 987 1.1 christos 988 1.1 christos #define SPARC_ELF_WORD_BYTES(htab) \ 989 1.1 christos htab->bytes_per_word 990 1.1 christos 991 1.1 christos #define SPARC_ELF_RELA_BYTES(htab) \ 992 1.1 christos htab->bytes_per_rela 993 1.1 christos 994 1.1 christos #define SPARC_ELF_DTPOFF_RELOC(htab) \ 995 1.1 christos htab->dtpoff_reloc 996 1.1 christos 997 1.1 christos #define SPARC_ELF_DTPMOD_RELOC(htab) \ 998 1.1 christos htab->dtpmod_reloc 999 1.1 christos 1000 1.1 christos #define SPARC_ELF_TPOFF_RELOC(htab) \ 1001 1.1 christos htab->tpoff_reloc 1002 1.1 christos 1003 1.1 christos #define SPARC_ELF_BUILD_PLT_ENTRY(htab, obfd, splt, off, max, r_off) \ 1004 1.1 christos htab->build_plt_entry (obfd, splt, off, max, r_off) 1005 1.1 christos 1006 1.1 christos /* Create an entry in an SPARC ELF linker hash table. */ 1007 1.1 christos 1008 1.1 christos static struct bfd_hash_entry * 1009 1.1 christos link_hash_newfunc (struct bfd_hash_entry *entry, 1010 1.1 christos struct bfd_hash_table *table, const char *string) 1011 1.1 christos { 1012 1.1 christos /* Allocate the structure if it has not already been allocated by a 1013 1.1 christos subclass. */ 1014 1.1 christos if (entry == NULL) 1015 1.1 christos { 1016 1.1 christos entry = bfd_hash_allocate (table, 1017 1.1 christos sizeof (struct _bfd_sparc_elf_link_hash_entry)); 1018 1.1 christos if (entry == NULL) 1019 1.1 christos return entry; 1020 1.1 christos } 1021 1.1 christos 1022 1.1 christos /* Call the allocation method of the superclass. */ 1023 1.1 christos entry = _bfd_elf_link_hash_newfunc (entry, table, string); 1024 1.1 christos if (entry != NULL) 1025 1.1 christos { 1026 1.1 christos struct _bfd_sparc_elf_link_hash_entry *eh; 1027 1.1 christos 1028 1.1 christos eh = (struct _bfd_sparc_elf_link_hash_entry *) entry; 1029 1.6 christos eh->tls_type = GOT_UNKNOWN; 1030 1.6 christos eh->has_got_reloc = 0; 1031 1.1 christos eh->has_non_got_reloc = 0; 1032 1.1 christos } 1033 1.1 christos 1034 1.1 christos return entry; 1035 1.1 christos } 1036 1.1 christos 1037 1.1 christos /* The name of the dynamic interpreter. This is put in the .interp 1038 1.1 christos section. */ 1039 1.1 christos 1040 1.1 christos #define ELF32_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" 1041 1.1 christos #define ELF64_DYNAMIC_INTERPRETER "/usr/lib/sparcv9/ld.so.1" 1042 1.1 christos 1043 1.1 christos /* Compute a hash of a local hash entry. We use elf_link_hash_entry 1044 1.1 christos for local symbol so that we can handle local STT_GNU_IFUNC symbols 1045 1.1 christos as global symbol. We reuse indx and dynstr_index for local symbol 1046 1.1 christos hash since they aren't used by global symbols in this backend. */ 1047 1.1 christos 1048 1.1 christos static hashval_t 1049 1.1 christos elf_sparc_local_htab_hash (const void *ptr) 1050 1.1 christos { 1051 1.1 christos struct elf_link_hash_entry *h 1052 1.1 christos = (struct elf_link_hash_entry *) ptr; 1053 1.1 christos return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index); 1054 1.1 christos } 1055 1.1 christos 1056 1.1 christos /* Compare local hash entries. */ 1057 1.1 christos 1058 1.1 christos static int 1059 1.1 christos elf_sparc_local_htab_eq (const void *ptr1, const void *ptr2) 1060 1.1 christos { 1061 1.1 christos struct elf_link_hash_entry *h1 1062 1.1 christos = (struct elf_link_hash_entry *) ptr1; 1063 1.1 christos struct elf_link_hash_entry *h2 1064 1.1 christos = (struct elf_link_hash_entry *) ptr2; 1065 1.1 christos 1066 1.1 christos return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index; 1067 1.1 christos } 1068 1.1 christos 1069 1.1 christos /* Find and/or create a hash entry for local symbol. */ 1070 1.1 christos 1071 1.1 christos static struct elf_link_hash_entry * 1072 1.1 christos elf_sparc_get_local_sym_hash (struct _bfd_sparc_elf_link_hash_table *htab, 1073 1.8 christos bfd *abfd, const Elf_Internal_Rela *rel, 1074 1.1 christos bool create) 1075 1.1 christos { 1076 1.1 christos struct _bfd_sparc_elf_link_hash_entry e, *ret; 1077 1.1 christos asection *sec = abfd->sections; 1078 1.1 christos unsigned long r_symndx; 1079 1.1 christos hashval_t h; 1080 1.1 christos void **slot; 1081 1.1 christos 1082 1.1 christos r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info); 1083 1.1 christos h = ELF_LOCAL_SYMBOL_HASH (sec->id, r_symndx); 1084 1.1 christos 1085 1.1 christos e.elf.indx = sec->id; 1086 1.1 christos e.elf.dynstr_index = r_symndx; 1087 1.1 christos slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h, 1088 1.1 christos create ? INSERT : NO_INSERT); 1089 1.1 christos 1090 1.1 christos if (!slot) 1091 1.1 christos return NULL; 1092 1.1 christos 1093 1.1 christos if (*slot) 1094 1.1 christos { 1095 1.1 christos ret = (struct _bfd_sparc_elf_link_hash_entry *) *slot; 1096 1.1 christos return &ret->elf; 1097 1.1 christos } 1098 1.1 christos 1099 1.1 christos ret = (struct _bfd_sparc_elf_link_hash_entry *) 1100 1.1 christos objalloc_alloc ((struct objalloc *) htab->loc_hash_memory, 1101 1.1 christos sizeof (struct _bfd_sparc_elf_link_hash_entry)); 1102 1.1 christos if (ret) 1103 1.1 christos { 1104 1.1 christos memset (ret, 0, sizeof (*ret)); 1105 1.1 christos ret->elf.indx = sec->id; 1106 1.1 christos ret->elf.dynstr_index = r_symndx; 1107 1.1 christos ret->elf.dynindx = -1; 1108 1.1 christos ret->elf.plt.offset = (bfd_vma) -1; 1109 1.1 christos ret->elf.got.offset = (bfd_vma) -1; 1110 1.1 christos *slot = ret; 1111 1.1 christos } 1112 1.1 christos return &ret->elf; 1113 1.1 christos } 1114 1.3 christos 1115 1.3 christos /* Destroy a SPARC ELF linker hash table. */ 1116 1.3 christos 1117 1.3 christos static void 1118 1.3 christos _bfd_sparc_elf_link_hash_table_free (bfd *obfd) 1119 1.3 christos { 1120 1.3 christos struct _bfd_sparc_elf_link_hash_table *htab 1121 1.3 christos = (struct _bfd_sparc_elf_link_hash_table *) obfd->link.hash; 1122 1.3 christos 1123 1.3 christos if (htab->loc_hash_table) 1124 1.3 christos htab_delete (htab->loc_hash_table); 1125 1.3 christos if (htab->loc_hash_memory) 1126 1.3 christos objalloc_free ((struct objalloc *) htab->loc_hash_memory); 1127 1.3 christos _bfd_elf_link_hash_table_free (obfd); 1128 1.3 christos } 1129 1.1 christos 1130 1.1 christos /* Create a SPARC ELF linker hash table. */ 1131 1.1 christos 1132 1.1 christos struct bfd_link_hash_table * 1133 1.1 christos _bfd_sparc_elf_link_hash_table_create (bfd *abfd) 1134 1.1 christos { 1135 1.8 christos struct _bfd_sparc_elf_link_hash_table *ret; 1136 1.1 christos size_t amt = sizeof (struct _bfd_sparc_elf_link_hash_table); 1137 1.1 christos 1138 1.1 christos ret = (struct _bfd_sparc_elf_link_hash_table *) bfd_zmalloc (amt); 1139 1.1 christos if (ret == NULL) 1140 1.1 christos return NULL; 1141 1.1 christos 1142 1.1 christos if (ABI_64_P (abfd)) 1143 1.1 christos { 1144 1.1 christos ret->put_word = sparc_put_word_64; 1145 1.1 christos ret->r_info = sparc_elf_r_info_64; 1146 1.1 christos ret->r_symndx = sparc_elf_r_symndx_64; 1147 1.1 christos ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF64; 1148 1.1 christos ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD64; 1149 1.1 christos ret->tpoff_reloc = R_SPARC_TLS_TPOFF64; 1150 1.1 christos ret->word_align_power = 3; 1151 1.1 christos ret->align_power_max = 4; 1152 1.1 christos ret->bytes_per_word = 8; 1153 1.1 christos ret->bytes_per_rela = sizeof (Elf64_External_Rela); 1154 1.1 christos ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER; 1155 1.1 christos ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER; 1156 1.1 christos 1157 1.1 christos ret->build_plt_entry = sparc64_plt_entry_build; 1158 1.1 christos ret->plt_header_size = PLT64_HEADER_SIZE; 1159 1.1 christos ret->plt_entry_size = PLT64_ENTRY_SIZE; 1160 1.1 christos } 1161 1.1 christos else 1162 1.1 christos { 1163 1.1 christos ret->put_word = sparc_put_word_32; 1164 1.1 christos ret->r_info = sparc_elf_r_info_32; 1165 1.1 christos ret->r_symndx = sparc_elf_r_symndx_32; 1166 1.1 christos ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF32; 1167 1.1 christos ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD32; 1168 1.1 christos ret->tpoff_reloc = R_SPARC_TLS_TPOFF32; 1169 1.1 christos ret->word_align_power = 2; 1170 1.1 christos ret->align_power_max = 3; 1171 1.1 christos ret->bytes_per_word = 4; 1172 1.1 christos ret->bytes_per_rela = sizeof (Elf32_External_Rela); 1173 1.1 christos ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER; 1174 1.1 christos ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER; 1175 1.1 christos 1176 1.1 christos ret->build_plt_entry = sparc32_plt_entry_build; 1177 1.1 christos ret->plt_header_size = PLT32_HEADER_SIZE; 1178 1.1 christos ret->plt_entry_size = PLT32_ENTRY_SIZE; 1179 1.1 christos } 1180 1.1 christos 1181 1.10 christos if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc, 1182 1.1 christos sizeof (struct _bfd_sparc_elf_link_hash_entry))) 1183 1.1 christos { 1184 1.1 christos free (ret); 1185 1.1 christos return NULL; 1186 1.1 christos } 1187 1.1 christos 1188 1.1 christos ret->loc_hash_table = htab_try_create (1024, 1189 1.1 christos elf_sparc_local_htab_hash, 1190 1.1 christos elf_sparc_local_htab_eq, 1191 1.1 christos NULL); 1192 1.1 christos ret->loc_hash_memory = objalloc_create (); 1193 1.1 christos if (!ret->loc_hash_table || !ret->loc_hash_memory) 1194 1.3 christos { 1195 1.1 christos _bfd_sparc_elf_link_hash_table_free (abfd); 1196 1.1 christos return NULL; 1197 1.3 christos } 1198 1.1 christos ret->elf.root.hash_table_free = _bfd_sparc_elf_link_hash_table_free; 1199 1.1 christos 1200 1.1 christos return &ret->elf.root; 1201 1.1 christos } 1202 1.1 christos 1203 1.1 christos /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and 1204 1.1 christos .rela.bss sections in DYNOBJ, and set up shortcuts to them in our 1205 1.1 christos hash table. */ 1206 1.8 christos 1207 1.1 christos bool 1208 1.1 christos _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj, 1209 1.1 christos struct bfd_link_info *info) 1210 1.1 christos { 1211 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 1212 1.1 christos 1213 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 1214 1.1 christos BFD_ASSERT (htab != NULL); 1215 1.1 christos 1216 1.8 christos if (!_bfd_elf_create_dynamic_sections (dynobj, info)) 1217 1.1 christos return false; 1218 1.8 christos 1219 1.1 christos if (htab->elf.target_os == is_vxworks) 1220 1.1 christos { 1221 1.8 christos if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2)) 1222 1.3 christos return false; 1223 1.1 christos if (bfd_link_pic (info)) 1224 1.1 christos { 1225 1.1 christos htab->plt_header_size 1226 1.1 christos = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); 1227 1.1 christos htab->plt_entry_size 1228 1.1 christos = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt_entry); 1229 1.1 christos } 1230 1.1 christos else 1231 1.1 christos { 1232 1.1 christos htab->plt_header_size 1233 1.1 christos = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt0_entry); 1234 1.1 christos htab->plt_entry_size 1235 1.1 christos = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt_entry); 1236 1.1 christos } 1237 1.1 christos } 1238 1.6 christos 1239 1.6 christos if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss 1240 1.1 christos || (!bfd_link_pic (info) && !htab->elf.srelbss)) 1241 1.1 christos abort (); 1242 1.8 christos 1243 1.1 christos return true; 1244 1.1 christos } 1245 1.8 christos 1246 1.1 christos static bool 1247 1.1 christos create_ifunc_sections (bfd *abfd, struct bfd_link_info *info) 1248 1.1 christos { 1249 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd); 1250 1.1 christos struct elf_link_hash_table *htab = elf_hash_table (info); 1251 1.1 christos flagword flags, pltflags; 1252 1.1 christos asection *s; 1253 1.1 christos 1254 1.8 christos if (htab->irelifunc != NULL || htab->iplt != NULL) 1255 1.1 christos return true; 1256 1.1 christos 1257 1.1 christos flags = bed->dynamic_sec_flags; 1258 1.1 christos pltflags = flags | SEC_ALLOC | SEC_CODE | SEC_LOAD; 1259 1.1 christos 1260 1.1 christos s = bfd_make_section_with_flags (abfd, ".iplt", pltflags); 1261 1.7 christos if (s == NULL 1262 1.8 christos || !bfd_set_section_alignment (s, bed->plt_alignment)) 1263 1.1 christos return false; 1264 1.1 christos htab->iplt = s; 1265 1.1 christos 1266 1.1 christos s = bfd_make_section_with_flags (abfd, ".rela.iplt", 1267 1.1 christos flags | SEC_READONLY); 1268 1.7 christos if (s == NULL 1269 1.8 christos || !bfd_set_section_alignment (s, bed->s->log_file_align)) 1270 1.1 christos return false; 1271 1.1 christos htab->irelplt = s; 1272 1.8 christos 1273 1.1 christos return true; 1274 1.1 christos } 1275 1.1 christos 1276 1.1 christos /* Copy the extra info we tack onto an elf_link_hash_entry. */ 1277 1.1 christos 1278 1.1 christos void 1279 1.1 christos _bfd_sparc_elf_copy_indirect_symbol (struct bfd_link_info *info, 1280 1.1 christos struct elf_link_hash_entry *dir, 1281 1.1 christos struct elf_link_hash_entry *ind) 1282 1.1 christos { 1283 1.1 christos struct _bfd_sparc_elf_link_hash_entry *edir, *eind; 1284 1.1 christos 1285 1.1 christos edir = (struct _bfd_sparc_elf_link_hash_entry *) dir; 1286 1.1 christos eind = (struct _bfd_sparc_elf_link_hash_entry *) ind; 1287 1.6 christos 1288 1.1 christos if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0) 1289 1.1 christos { 1290 1.1 christos edir->tls_type = eind->tls_type; 1291 1.1 christos eind->tls_type = GOT_UNKNOWN; 1292 1.6 christos } 1293 1.6 christos 1294 1.6 christos /* Copy has_got_reloc and has_non_got_reloc. */ 1295 1.6 christos edir->has_got_reloc |= eind->has_got_reloc; 1296 1.6 christos edir->has_non_got_reloc |= eind->has_non_got_reloc; 1297 1.1 christos 1298 1.1 christos _bfd_elf_link_hash_copy_indirect (info, dir, ind); 1299 1.1 christos } 1300 1.1 christos 1301 1.1 christos static int 1302 1.1 christos sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd, 1303 1.1 christos int r_type, int is_local) 1304 1.1 christos { 1305 1.1 christos if (! ABI_64_P (abfd) 1306 1.1 christos && r_type == R_SPARC_TLS_GD_HI22 1307 1.6 christos && ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd) 1308 1.1 christos return R_SPARC_REV32; 1309 1.6 christos 1310 1.1 christos if (!bfd_link_executable (info)) 1311 1.1 christos return r_type; 1312 1.1 christos 1313 1.1 christos switch (r_type) 1314 1.1 christos { 1315 1.6 christos case R_SPARC_TLS_GD_HI22: 1316 1.1 christos return is_local ? R_SPARC_TLS_LE_HIX22 : R_SPARC_TLS_IE_HI22; 1317 1.6 christos case R_SPARC_TLS_GD_LO10: 1318 1.1 christos return is_local ? R_SPARC_TLS_LE_LOX10 : R_SPARC_TLS_IE_LO10; 1319 1.1 christos case R_SPARC_TLS_LDM_HI22: 1320 1.1 christos return R_SPARC_TLS_LE_HIX22; 1321 1.1 christos case R_SPARC_TLS_LDM_LO10: 1322 1.6 christos return R_SPARC_TLS_LE_LOX10; 1323 1.6 christos case R_SPARC_TLS_IE_HI22: 1324 1.6 christos return is_local ? R_SPARC_TLS_LE_HIX22 : r_type; 1325 1.6 christos case R_SPARC_TLS_IE_LO10: 1326 1.1 christos return is_local ? R_SPARC_TLS_LE_LOX10 : r_type; 1327 1.1 christos } 1328 1.1 christos 1329 1.1 christos return r_type; 1330 1.1 christos } 1331 1.1 christos 1332 1.1 christos /* Look through the relocs for a section during the first phase, and 1334 1.1 christos allocate space in the global offset table or procedure linkage 1335 1.8 christos table. */ 1336 1.1 christos 1337 1.1 christos bool 1338 1.1 christos _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, 1339 1.1 christos asection *sec, const Elf_Internal_Rela *relocs) 1340 1.1 christos { 1341 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 1342 1.1 christos Elf_Internal_Shdr *symtab_hdr; 1343 1.1 christos struct elf_link_hash_entry **sym_hashes; 1344 1.1 christos const Elf_Internal_Rela *rel; 1345 1.1 christos const Elf_Internal_Rela *rel_end; 1346 1.8 christos asection *sreloc; 1347 1.1 christos int num_relocs; 1348 1.3 christos bool checked_tlsgd = false; 1349 1.8 christos 1350 1.1 christos if (bfd_link_relocatable (info)) 1351 1.1 christos return true; 1352 1.1 christos 1353 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 1354 1.1 christos BFD_ASSERT (htab != NULL); 1355 1.1 christos symtab_hdr = &elf_symtab_hdr (abfd); 1356 1.1 christos sym_hashes = elf_sym_hashes (abfd); 1357 1.1 christos 1358 1.1 christos sreloc = NULL; 1359 1.1 christos 1360 1.1 christos if (ABI_64_P (abfd)) 1361 1.1 christos num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (sec)); 1362 1.1 christos else 1363 1.1 christos num_relocs = sec->reloc_count; 1364 1.1 christos 1365 1.1 christos BFD_ASSERT (is_sparc_elf (abfd) || num_relocs == 0); 1366 1.1 christos 1367 1.1 christos if (htab->elf.dynobj == NULL) 1368 1.8 christos htab->elf.dynobj = abfd; 1369 1.1 christos if (!create_ifunc_sections (htab->elf.dynobj, info)) 1370 1.1 christos return false; 1371 1.1 christos 1372 1.1 christos rel_end = relocs + num_relocs; 1373 1.1 christos for (rel = relocs; rel < rel_end; rel++) 1374 1.6 christos { 1375 1.1 christos unsigned int r_type; 1376 1.6 christos unsigned int r_symndx; 1377 1.1 christos struct elf_link_hash_entry *h; 1378 1.1 christos struct _bfd_sparc_elf_link_hash_entry *eh; 1379 1.1 christos Elf_Internal_Sym *isym; 1380 1.1 christos 1381 1.1 christos r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info); 1382 1.1 christos r_type = SPARC_ELF_R_TYPE (rel->r_info); 1383 1.1 christos 1384 1.6 christos if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) 1385 1.6 christos { 1386 1.8 christos /* xgettext:c-format */ 1387 1.1 christos _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx); 1388 1.1 christos return false; 1389 1.1 christos } 1390 1.1 christos 1391 1.1 christos isym = NULL; 1392 1.1 christos if (r_symndx < symtab_hdr->sh_info) 1393 1.8 christos { 1394 1.8 christos /* A local symbol. */ 1395 1.1 christos isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, 1396 1.8 christos r_symndx); 1397 1.1 christos if (isym == NULL) 1398 1.1 christos return false; 1399 1.1 christos 1400 1.1 christos /* Check relocation against local STT_GNU_IFUNC symbol. */ 1401 1.8 christos if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) 1402 1.1 christos { 1403 1.8 christos h = elf_sparc_get_local_sym_hash (htab, abfd, rel, true); 1404 1.3 christos if (h == NULL) 1405 1.1 christos return false; 1406 1.1 christos 1407 1.1 christos /* Fake a STT_GNU_IFUNC symbol. */ 1408 1.1 christos h->type = STT_GNU_IFUNC; 1409 1.1 christos h->def_regular = 1; 1410 1.1 christos h->ref_regular = 1; 1411 1.1 christos h->forced_local = 1; 1412 1.1 christos h->root.type = bfd_link_hash_defined; 1413 1.1 christos } 1414 1.1 christos else 1415 1.1 christos h = NULL; 1416 1.1 christos } 1417 1.1 christos else 1418 1.1 christos { 1419 1.1 christos h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 1420 1.1 christos while (h->root.type == bfd_link_hash_indirect 1421 1.1 christos || h->root.type == bfd_link_hash_warning) 1422 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 1423 1.6 christos } 1424 1.1 christos 1425 1.6 christos if (h && h->type == STT_GNU_IFUNC && h->def_regular) 1426 1.6 christos { 1427 1.1 christos h->ref_regular = 1; 1428 1.1 christos h->plt.refcount += 1; 1429 1.10 christos } 1430 1.10 christos 1431 1.10 christos /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got. */ 1432 1.10 christos if (h != NULL 1433 1.10 christos && htab->elf.sgot == NULL 1434 1.10 christos && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) 1435 1.10 christos { 1436 1.10 christos if (!_bfd_elf_create_got_section (htab->elf.dynobj, info)) 1437 1.10 christos return false; 1438 1.10 christos BFD_ASSERT (h == htab->elf.hgot); 1439 1.1 christos } 1440 1.1 christos 1441 1.1 christos /* Compatibility with old R_SPARC_REV32 reloc conflicting 1442 1.1 christos with R_SPARC_TLS_GD_HI22. */ 1443 1.1 christos if (! ABI_64_P (abfd) && ! checked_tlsgd) 1444 1.1 christos switch (r_type) 1445 1.1 christos { 1446 1.1 christos case R_SPARC_TLS_GD_HI22: 1447 1.1 christos { 1448 1.1 christos const Elf_Internal_Rela *relt; 1449 1.1 christos 1450 1.1 christos for (relt = rel + 1; relt < rel_end; relt++) 1451 1.1 christos if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10 1452 1.1 christos || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD 1453 1.8 christos || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL) 1454 1.1 christos break; 1455 1.1 christos checked_tlsgd = true; 1456 1.1 christos _bfd_sparc_elf_tdata (abfd)->has_tlsgd = relt < rel_end; 1457 1.1 christos } 1458 1.1 christos break; 1459 1.1 christos case R_SPARC_TLS_GD_LO10: 1460 1.8 christos case R_SPARC_TLS_GD_ADD: 1461 1.8 christos case R_SPARC_TLS_GD_CALL: 1462 1.1 christos checked_tlsgd = true; 1463 1.1 christos _bfd_sparc_elf_tdata (abfd)->has_tlsgd = true; 1464 1.1 christos break; 1465 1.1 christos } 1466 1.6 christos 1467 1.6 christos r_type = sparc_elf_tls_transition (info, abfd, r_type, h == NULL); 1468 1.1 christos eh = (struct _bfd_sparc_elf_link_hash_entry *) h; 1469 1.1 christos 1470 1.1 christos switch (r_type) 1471 1.1 christos { 1472 1.1 christos case R_SPARC_TLS_LDM_HI22: 1473 1.6 christos case R_SPARC_TLS_LDM_LO10: 1474 1.6 christos htab->tls_ldm_got.refcount += 1; 1475 1.1 christos if (eh != NULL) 1476 1.1 christos eh->has_got_reloc = 1; 1477 1.1 christos break; 1478 1.1 christos 1479 1.6 christos case R_SPARC_TLS_LE_HIX22: 1480 1.1 christos case R_SPARC_TLS_LE_LOX10: 1481 1.1 christos if (!bfd_link_executable (info)) 1482 1.1 christos goto r_sparc_plt32; 1483 1.1 christos break; 1484 1.1 christos 1485 1.6 christos case R_SPARC_TLS_IE_HI22: 1486 1.1 christos case R_SPARC_TLS_IE_LO10: 1487 1.1 christos if (!bfd_link_executable (info)) 1488 1.1 christos info->flags |= DF_STATIC_TLS; 1489 1.1 christos /* Fall through */ 1490 1.1 christos 1491 1.1 christos case R_SPARC_GOT10: 1492 1.1 christos case R_SPARC_GOT13: 1493 1.1 christos case R_SPARC_GOT22: 1494 1.1 christos case R_SPARC_GOTDATA_HIX22: 1495 1.1 christos case R_SPARC_GOTDATA_LOX10: 1496 1.1 christos case R_SPARC_GOTDATA_OP_HIX22: 1497 1.1 christos case R_SPARC_GOTDATA_OP_LOX10: 1498 1.1 christos case R_SPARC_TLS_GD_HI22: 1499 1.1 christos case R_SPARC_TLS_GD_LO10: 1500 1.1 christos /* This symbol requires a global offset table entry. */ 1501 1.1 christos { 1502 1.1 christos int tls_type, old_tls_type; 1503 1.1 christos 1504 1.1 christos switch (r_type) 1505 1.1 christos { 1506 1.1 christos case R_SPARC_TLS_GD_HI22: 1507 1.1 christos case R_SPARC_TLS_GD_LO10: 1508 1.1 christos tls_type = GOT_TLS_GD; 1509 1.1 christos break; 1510 1.1 christos case R_SPARC_TLS_IE_HI22: 1511 1.1 christos case R_SPARC_TLS_IE_LO10: 1512 1.6 christos tls_type = GOT_TLS_IE; 1513 1.6 christos break; 1514 1.6 christos default: 1515 1.1 christos tls_type = GOT_NORMAL; 1516 1.1 christos break; 1517 1.1 christos } 1518 1.1 christos 1519 1.1 christos if (h != NULL) 1520 1.1 christos { 1521 1.1 christos h->got.refcount += 1; 1522 1.1 christos old_tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type; 1523 1.1 christos } 1524 1.1 christos else 1525 1.1 christos { 1526 1.1 christos bfd_signed_vma *local_got_refcounts; 1527 1.1 christos 1528 1.1 christos /* This is a global offset table entry for a local symbol. */ 1529 1.1 christos local_got_refcounts = elf_local_got_refcounts (abfd); 1530 1.1 christos if (local_got_refcounts == NULL) 1531 1.1 christos { 1532 1.1 christos bfd_size_type size; 1533 1.1 christos 1534 1.1 christos size = symtab_hdr->sh_info; 1535 1.1 christos size *= (sizeof (bfd_signed_vma) + sizeof(char)); 1536 1.1 christos local_got_refcounts = ((bfd_signed_vma *) 1537 1.8 christos bfd_zalloc (abfd, size)); 1538 1.1 christos if (local_got_refcounts == NULL) 1539 1.1 christos return false; 1540 1.1 christos elf_local_got_refcounts (abfd) = local_got_refcounts; 1541 1.1 christos _bfd_sparc_elf_local_got_tls_type (abfd) 1542 1.1 christos = (char *) (local_got_refcounts + symtab_hdr->sh_info); 1543 1.6 christos } 1544 1.6 christos 1545 1.6 christos if (r_type != R_SPARC_GOTDATA_OP_HIX22 1546 1.6 christos && r_type != R_SPARC_GOTDATA_OP_LOX10) 1547 1.6 christos local_got_refcounts[r_symndx] += 1; 1548 1.6 christos 1549 1.1 christos old_tls_type 1550 1.1 christos = _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx]; 1551 1.6 christos } 1552 1.6 christos 1553 1.6 christos /* If a TLS symbol is accessed using IE at least once, there is no 1554 1.1 christos point in using the dynamic model for it. */ 1555 1.6 christos if (old_tls_type != tls_type) 1556 1.6 christos { 1557 1.6 christos if (old_tls_type == GOT_UNKNOWN) 1558 1.6 christos ; 1559 1.6 christos else if (old_tls_type == GOT_TLS_GD && tls_type == GOT_TLS_IE) 1560 1.1 christos ; 1561 1.1 christos else if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD) 1562 1.1 christos tls_type = old_tls_type; 1563 1.6 christos else 1564 1.6 christos { 1565 1.6 christos _bfd_error_handler 1566 1.1 christos /* xgettext:c-format */ 1567 1.8 christos (_("%pB: `%s' accessed both as normal and thread local symbol"), 1568 1.1 christos abfd, h ? h->root.root.string : "<local>"); 1569 1.1 christos return false; 1570 1.1 christos } 1571 1.1 christos 1572 1.1 christos if (h != NULL) 1573 1.1 christos _bfd_sparc_elf_hash_entry (h)->tls_type = tls_type; 1574 1.1 christos else 1575 1.1 christos _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx] = tls_type; 1576 1.1 christos } 1577 1.6 christos } 1578 1.6 christos 1579 1.8 christos if (!htab->elf.sgot 1580 1.6 christos && !_bfd_elf_create_got_section (htab->elf.dynobj, info)) 1581 1.6 christos return false; 1582 1.1 christos 1583 1.6 christos if (eh != NULL) 1584 1.6 christos { 1585 1.6 christos eh->has_got_reloc = 1; 1586 1.6 christos if (r_type == R_SPARC_GOT10 1587 1.6 christos || r_type == R_SPARC_GOT13 1588 1.1 christos || r_type == R_SPARC_GOT22) 1589 1.1 christos eh->has_old_style_got_reloc = 1; 1590 1.1 christos } 1591 1.1 christos break; 1592 1.1 christos 1593 1.6 christos case R_SPARC_TLS_GD_CALL: 1594 1.1 christos case R_SPARC_TLS_LDM_CALL: 1595 1.6 christos if (bfd_link_executable (info)) 1596 1.6 christos break; 1597 1.6 christos 1598 1.8 christos /* Essentially R_SPARC_WPLT30 relocs against __tls_get_addr. */ 1599 1.8 christos h = (struct elf_link_hash_entry *) 1600 1.6 christos bfd_link_hash_lookup (info->hash, "__tls_get_addr", false, 1601 1.1 christos false, true); 1602 1.1 christos BFD_ASSERT (h != NULL); 1603 1.6 christos /* Fall through */ 1604 1.1 christos 1605 1.6 christos case R_SPARC_WPLT30: 1606 1.1 christos case R_SPARC_PLT32: 1607 1.1 christos case R_SPARC_PLT64: 1608 1.1 christos case R_SPARC_HIPLT22: 1609 1.1 christos case R_SPARC_LOPLT10: 1610 1.1 christos case R_SPARC_PCPLT32: 1611 1.6 christos case R_SPARC_PCPLT22: 1612 1.6 christos case R_SPARC_PCPLT10: 1613 1.1 christos /* This symbol requires a procedure linkage table entry. 1614 1.1 christos We actually build the entry in adjust_dynamic_symbol, 1615 1.1 christos because this might be a case of linking PIC code without 1616 1.1 christos linking in any dynamic objects, in which case we don't 1617 1.1 christos need to generate a procedure linkage table after all. */ 1618 1.1 christos 1619 1.1 christos if (h == NULL) 1620 1.1 christos { 1621 1.1 christos if (! ABI_64_P (abfd)) 1622 1.1 christos { 1623 1.1 christos /* The Solaris native assembler will generate a WPLT30 1624 1.1 christos reloc for a local symbol if you assemble a call from 1625 1.6 christos one section to another when using -K pic. We treat 1626 1.1 christos it as WDISP30. */ 1627 1.1 christos if (r_type == R_SPARC_PLT32) 1628 1.1 christos goto r_sparc_plt32; 1629 1.1 christos break; 1630 1.1 christos } 1631 1.1 christos /* PR 7027: We need similar behaviour for 64-bit binaries. */ 1632 1.1 christos else if (r_type == R_SPARC_WPLT30) 1633 1.1 christos break; 1634 1.6 christos 1635 1.1 christos /* It does not make sense to have a procedure linkage 1636 1.8 christos table entry for a local symbol. */ 1637 1.1 christos bfd_set_error (bfd_error_bad_value); 1638 1.1 christos return false; 1639 1.1 christos } 1640 1.1 christos 1641 1.6 christos h->needs_plt = 1; 1642 1.6 christos 1643 1.1 christos if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64) 1644 1.1 christos goto r_sparc_plt32; 1645 1.6 christos 1646 1.6 christos h->plt.refcount += 1; 1647 1.6 christos 1648 1.1 christos eh = (struct _bfd_sparc_elf_link_hash_entry *) h; 1649 1.1 christos eh->has_got_reloc = 1; 1650 1.1 christos break; 1651 1.1 christos 1652 1.1 christos case R_SPARC_PC10: 1653 1.1 christos case R_SPARC_PC22: 1654 1.1 christos case R_SPARC_PC_HH22: 1655 1.1 christos case R_SPARC_PC_HM10: 1656 1.1 christos case R_SPARC_PC_LM22: 1657 1.1 christos if (h != NULL) 1658 1.10 christos h->non_got_ref = 1; 1659 1.1 christos 1660 1.1 christos if (h != NULL && h == htab->elf.hgot) 1661 1.1 christos break; 1662 1.1 christos /* Fall through. */ 1663 1.1 christos 1664 1.1 christos case R_SPARC_DISP8: 1665 1.1 christos case R_SPARC_DISP16: 1666 1.1 christos case R_SPARC_DISP32: 1667 1.1 christos case R_SPARC_DISP64: 1668 1.1 christos case R_SPARC_WDISP30: 1669 1.1 christos case R_SPARC_WDISP22: 1670 1.1 christos case R_SPARC_WDISP19: 1671 1.1 christos case R_SPARC_WDISP16: 1672 1.1 christos case R_SPARC_WDISP10: 1673 1.1 christos case R_SPARC_8: 1674 1.1 christos case R_SPARC_16: 1675 1.1 christos case R_SPARC_32: 1676 1.1 christos case R_SPARC_HI22: 1677 1.1 christos case R_SPARC_22: 1678 1.1 christos case R_SPARC_13: 1679 1.1 christos case R_SPARC_LO10: 1680 1.1 christos case R_SPARC_UA16: 1681 1.1 christos case R_SPARC_UA32: 1682 1.1 christos case R_SPARC_10: 1683 1.1 christos case R_SPARC_11: 1684 1.1 christos case R_SPARC_64: 1685 1.1 christos case R_SPARC_OLO10: 1686 1.1 christos case R_SPARC_HH22: 1687 1.1 christos case R_SPARC_HM10: 1688 1.1 christos case R_SPARC_LM22: 1689 1.1 christos case R_SPARC_7: 1690 1.1 christos case R_SPARC_5: 1691 1.1 christos case R_SPARC_6: 1692 1.1 christos case R_SPARC_HIX22: 1693 1.1 christos case R_SPARC_LOX10: 1694 1.1 christos case R_SPARC_H44: 1695 1.1 christos case R_SPARC_M44: 1696 1.1 christos case R_SPARC_L44: 1697 1.1 christos case R_SPARC_H34: 1698 1.1 christos case R_SPARC_UA64: 1699 1.1 christos if (h != NULL) 1700 1.6 christos h->non_got_ref = 1; 1701 1.6 christos 1702 1.6 christos if (eh != NULL && (sec->flags & SEC_CODE) != 0) 1703 1.1 christos eh->has_non_got_reloc = 1; 1704 1.3 christos 1705 1.1 christos r_sparc_plt32: 1706 1.1 christos if (h != NULL && !bfd_link_pic (info)) 1707 1.1 christos { 1708 1.1 christos /* We may need a .plt entry if the function this reloc 1709 1.1 christos refers to is in a shared lib. */ 1710 1.1 christos h->plt.refcount += 1; 1711 1.1 christos } 1712 1.1 christos 1713 1.1 christos /* If we are creating a shared library, and this is a reloc 1714 1.1 christos against a global symbol, or a non PC relative reloc 1715 1.1 christos against a local symbol, then we need to copy the reloc 1716 1.1 christos into the shared library. However, if we are linking with 1717 1.1 christos -Bsymbolic, we do not need to copy a reloc against a 1718 1.1 christos global symbol which is defined in an object we are 1719 1.1 christos including in the link (i.e., DEF_REGULAR is set). At 1720 1.1 christos this point we have not seen all the input files, so it is 1721 1.1 christos possible that DEF_REGULAR is not set now but will be set 1722 1.1 christos later (it is never cleared). In case of a weak definition, 1723 1.1 christos DEF_REGULAR may be cleared later by a strong definition in 1724 1.1 christos a shared library. We account for that possibility below by 1725 1.1 christos storing information in the relocs_copied field of the hash 1726 1.1 christos table entry. A similar situation occurs when creating 1727 1.1 christos shared libraries and symbol visibility changes render the 1728 1.1 christos symbol local. 1729 1.1 christos 1730 1.1 christos If on the other hand, we are creating an executable, we 1731 1.1 christos may need to keep relocations for symbols satisfied by a 1732 1.3 christos dynamic library if we manage to avoid copy relocs for the 1733 1.1 christos symbol. */ 1734 1.1 christos if ((bfd_link_pic (info) 1735 1.1 christos && (sec->flags & SEC_ALLOC) != 0 1736 1.1 christos && (! _bfd_sparc_elf_howto_table[r_type].pc_relative 1737 1.1 christos || (h != NULL 1738 1.1 christos && (! SYMBOLIC_BIND (info, h) 1739 1.3 christos || h->root.type == bfd_link_hash_defweak 1740 1.1 christos || !h->def_regular)))) 1741 1.1 christos || (!bfd_link_pic (info) 1742 1.1 christos && (sec->flags & SEC_ALLOC) != 0 1743 1.1 christos && h != NULL 1744 1.3 christos && (h->root.type == bfd_link_hash_defweak 1745 1.1 christos || !h->def_regular)) 1746 1.1 christos || (!bfd_link_pic (info) 1747 1.1 christos && h != NULL 1748 1.6 christos && h->type == STT_GNU_IFUNC)) 1749 1.6 christos { 1750 1.1 christos struct elf_dyn_relocs *p; 1751 1.1 christos struct elf_dyn_relocs **head; 1752 1.1 christos 1753 1.1 christos /* When creating a shared object, we must copy these 1754 1.1 christos relocs into the output file. We create a reloc 1755 1.1 christos section in dynobj and make room for the reloc. */ 1756 1.1 christos if (sreloc == NULL) 1757 1.1 christos { 1758 1.8 christos sreloc = _bfd_elf_make_dynamic_reloc_section 1759 1.1 christos (sec, htab->elf.dynobj, htab->word_align_power, 1760 1.1 christos abfd, /*rela?*/ true); 1761 1.8 christos 1762 1.1 christos if (sreloc == NULL) 1763 1.1 christos return false; 1764 1.1 christos } 1765 1.1 christos 1766 1.1 christos /* If this is a global symbol, we count the number of 1767 1.8 christos relocations we need for this symbol. */ 1768 1.1 christos if (h != NULL) 1769 1.1 christos head = &h->dyn_relocs; 1770 1.1 christos else 1771 1.1 christos { 1772 1.1 christos /* Track dynamic relocs needed for local syms too. 1773 1.1 christos We really need local syms available to do this 1774 1.1 christos easily. Oh well. */ 1775 1.1 christos asection *s; 1776 1.1 christos void *vpp; 1777 1.1 christos 1778 1.1 christos BFD_ASSERT (isym != NULL); 1779 1.1 christos s = bfd_section_from_elf_index (abfd, isym->st_shndx); 1780 1.1 christos if (s == NULL) 1781 1.1 christos s = sec; 1782 1.6 christos 1783 1.1 christos vpp = &elf_section_data (s)->local_dynrel; 1784 1.1 christos head = (struct elf_dyn_relocs **) vpp; 1785 1.1 christos } 1786 1.1 christos 1787 1.1 christos p = *head; 1788 1.8 christos if (p == NULL || p->sec != sec) 1789 1.6 christos { 1790 1.1 christos size_t amt = sizeof *p; 1791 1.1 christos p = ((struct elf_dyn_relocs *) 1792 1.8 christos bfd_alloc (htab->elf.dynobj, amt)); 1793 1.1 christos if (p == NULL) 1794 1.1 christos return false; 1795 1.1 christos p->next = *head; 1796 1.1 christos *head = p; 1797 1.1 christos p->sec = sec; 1798 1.1 christos p->count = 0; 1799 1.1 christos p->pc_count = 0; 1800 1.1 christos } 1801 1.1 christos 1802 1.1 christos p->count += 1; 1803 1.1 christos if (_bfd_sparc_elf_howto_table[r_type].pc_relative) 1804 1.1 christos p->pc_count += 1; 1805 1.1 christos } 1806 1.1 christos 1807 1.1 christos break; 1808 1.1 christos 1809 1.8 christos case R_SPARC_GNU_VTINHERIT: 1810 1.1 christos if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 1811 1.1 christos return false; 1812 1.1 christos break; 1813 1.7 christos 1814 1.8 christos case R_SPARC_GNU_VTENTRY: 1815 1.1 christos if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 1816 1.1 christos return false; 1817 1.1 christos break; 1818 1.1 christos 1819 1.1 christos case R_SPARC_REGISTER: 1820 1.1 christos /* Nothing to do. */ 1821 1.1 christos break; 1822 1.1 christos 1823 1.1 christos default: 1824 1.1 christos break; 1825 1.1 christos } 1826 1.8 christos } 1827 1.1 christos 1828 1.1 christos return true; 1829 1.1 christos } 1830 1.1 christos 1831 1.1 christos asection * 1833 1.1 christos _bfd_sparc_elf_gc_mark_hook (asection *sec, 1834 1.1 christos struct bfd_link_info *info, 1835 1.1 christos Elf_Internal_Rela *rel, 1836 1.1 christos struct elf_link_hash_entry *h, 1837 1.1 christos Elf_Internal_Sym *sym) 1838 1.1 christos { 1839 1.1 christos if (h != NULL) 1840 1.1 christos switch (SPARC_ELF_R_TYPE (rel->r_info)) 1841 1.1 christos { 1842 1.1 christos case R_SPARC_GNU_VTINHERIT: 1843 1.1 christos case R_SPARC_GNU_VTENTRY: 1844 1.6 christos return NULL; 1845 1.1 christos } 1846 1.1 christos 1847 1.1 christos if (!bfd_link_executable (info)) 1848 1.1 christos { 1849 1.1 christos switch (SPARC_ELF_R_TYPE (rel->r_info)) 1850 1.1 christos { 1851 1.1 christos case R_SPARC_TLS_GD_CALL: 1852 1.1 christos case R_SPARC_TLS_LDM_CALL: 1853 1.1 christos /* This reloc implicitly references __tls_get_addr. We know 1854 1.1 christos another reloc will reference the same symbol as the one 1855 1.1 christos on this reloc, so the real symbol and section will be 1856 1.8 christos gc marked when processing the other reloc. That lets 1857 1.1 christos us handle __tls_get_addr here. */ 1858 1.1 christos h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr", 1859 1.6 christos false, false, true); 1860 1.6 christos BFD_ASSERT (h != NULL); 1861 1.1 christos h->mark = 1; 1862 1.1 christos if (h->is_weakalias) 1863 1.1 christos weakdef (h)->mark = 1; 1864 1.1 christos sym = NULL; 1865 1.1 christos } 1866 1.1 christos } 1867 1.1 christos 1868 1.1 christos return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); 1869 1.1 christos } 1870 1.1 christos 1871 1.1 christos static Elf_Internal_Rela * 1872 1.1 christos sparc_elf_find_reloc_at_ofs (Elf_Internal_Rela *rel, 1873 1.1 christos Elf_Internal_Rela *relend, 1874 1.1 christos bfd_vma offset) 1875 1.1 christos { 1876 1.1 christos while (rel < relend) 1877 1.1 christos { 1878 1.1 christos if (rel->r_offset == offset) 1879 1.1 christos return rel; 1880 1.1 christos rel++; 1881 1.1 christos } 1882 1.6 christos return NULL; 1883 1.6 christos } 1884 1.6 christos 1885 1.8 christos /* Remove undefined weak symbol from the dynamic symbol table if it 1886 1.6 christos is resolved to 0. */ 1887 1.6 christos 1888 1.1 christos bool 1889 1.6 christos _bfd_sparc_elf_fixup_symbol (struct bfd_link_info *info, 1890 1.6 christos struct elf_link_hash_entry *h) 1891 1.6 christos { 1892 1.6 christos if (h->dynindx != -1 1893 1.6 christos && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, 1894 1.6 christos _bfd_sparc_elf_hash_entry (h))) 1895 1.6 christos { 1896 1.6 christos h->dynindx = -1; 1897 1.8 christos _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr, 1898 1.1 christos h->dynstr_index); 1899 1.1 christos } 1900 1.1 christos return true; 1901 1.1 christos } 1902 1.1 christos 1903 1.1 christos /* Adjust a symbol defined by a dynamic object and referenced by a 1904 1.1 christos regular object. The current definition is in some section of the 1905 1.1 christos dynamic object, but we're not including those sections. We have to 1906 1.8 christos change the definition to something the rest of the link can 1907 1.1 christos understand. */ 1908 1.1 christos 1909 1.1 christos bool 1910 1.1 christos _bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, 1911 1.6 christos struct elf_link_hash_entry *h) 1912 1.1 christos { 1913 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 1914 1.1 christos asection *s, *srel; 1915 1.1 christos 1916 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 1917 1.1 christos BFD_ASSERT (htab != NULL); 1918 1.1 christos 1919 1.1 christos /* Make sure we know what is going on here. */ 1920 1.6 christos BFD_ASSERT (htab->elf.dynobj != NULL 1921 1.1 christos && (h->needs_plt 1922 1.1 christos || h->type == STT_GNU_IFUNC 1923 1.1 christos || h->is_weakalias 1924 1.1 christos || (h->def_dynamic 1925 1.1 christos && h->ref_regular 1926 1.1 christos && !h->def_regular))); 1927 1.1 christos 1928 1.1 christos /* If this is a function, put it in the procedure linkage table. We 1929 1.1 christos will fill in the contents of the procedure linkage table later 1930 1.1 christos (although we could actually do it here). The STT_NOTYPE 1931 1.1 christos condition is a hack specifically for the Oracle libraries 1932 1.1 christos delivered for Solaris; for some inexplicable reason, they define 1933 1.1 christos some of their functions as STT_NOTYPE when they really should be 1934 1.1 christos STT_FUNC. */ 1935 1.1 christos if (h->type == STT_FUNC 1936 1.1 christos || h->type == STT_GNU_IFUNC 1937 1.1 christos || h->needs_plt 1938 1.1 christos || (h->type == STT_NOTYPE 1939 1.1 christos && (h->root.type == bfd_link_hash_defined 1940 1.1 christos || h->root.type == bfd_link_hash_defweak) 1941 1.1 christos && (h->root.u.def.section->flags & SEC_CODE) != 0)) 1942 1.1 christos { 1943 1.6 christos if (h->plt.refcount <= 0 1944 1.6 christos || (h->type != STT_GNU_IFUNC 1945 1.1 christos && (SYMBOL_CALLS_LOCAL (info, h) 1946 1.1 christos || (h->root.type == bfd_link_hash_undefweak 1947 1.1 christos && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)))) 1948 1.1 christos { 1949 1.1 christos /* This case can occur if we saw a WPLT30 reloc in an input 1950 1.1 christos file, but the symbol was never referred to by a dynamic 1951 1.1 christos object, or if all references were garbage collected. In 1952 1.1 christos such a case, we don't actually need to build a procedure 1953 1.1 christos linkage table, and we can just do a WDISP30 reloc instead. */ 1954 1.1 christos h->plt.offset = (bfd_vma) -1; 1955 1.8 christos h->needs_plt = 0; 1956 1.1 christos } 1957 1.1 christos 1958 1.1 christos return true; 1959 1.1 christos } 1960 1.1 christos else 1961 1.1 christos h->plt.offset = (bfd_vma) -1; 1962 1.1 christos 1963 1.6 christos /* If this is a weak symbol, and there is a real definition, the 1964 1.1 christos processor independent code will have arranged for us to see the 1965 1.6 christos real definition first, and we can just use the same value. */ 1966 1.6 christos if (h->is_weakalias) 1967 1.6 christos { 1968 1.6 christos struct elf_link_hash_entry *def = weakdef (h); 1969 1.8 christos BFD_ASSERT (def->root.type == bfd_link_hash_defined); 1970 1.1 christos h->root.u.def.section = def->root.u.def.section; 1971 1.1 christos h->root.u.def.value = def->root.u.def.value; 1972 1.1 christos return true; 1973 1.1 christos } 1974 1.1 christos 1975 1.1 christos /* This is a reference to a symbol defined by a dynamic object which 1976 1.1 christos is not a function. */ 1977 1.1 christos 1978 1.1 christos /* If we are creating a shared library, we must presume that the 1979 1.3 christos only references to the symbol are via the global offset table. 1980 1.8 christos For such cases we need not do anything here; the relocations will 1981 1.1 christos be handled correctly by relocate_section. */ 1982 1.1 christos if (bfd_link_pic (info)) 1983 1.1 christos return true; 1984 1.1 christos 1985 1.8 christos /* If there are no references to this symbol that do not use the 1986 1.1 christos GOT, we don't need to generate a copy reloc. */ 1987 1.1 christos if (!h->non_got_ref) 1988 1.1 christos return true; 1989 1.1 christos 1990 1.1 christos /* If -z nocopyreloc was given, we won't generate them either. */ 1991 1.8 christos if (info->nocopyreloc) 1992 1.1 christos { 1993 1.1 christos h->non_got_ref = 0; 1994 1.6 christos return true; 1995 1.1 christos } 1996 1.8 christos 1997 1.1 christos /* If we don't find any dynamic relocs in read-only sections, then 1998 1.1 christos we'll be keeping the dynamic relocs and avoiding the copy reloc. */ 1999 1.8 christos if (!_bfd_elf_readonly_dynrelocs (h)) 2000 1.1 christos { 2001 1.1 christos h->non_got_ref = 0; 2002 1.1 christos return true; 2003 1.1 christos } 2004 1.1 christos 2005 1.1 christos /* We must allocate the symbol in our .dynbss section, which will 2006 1.1 christos become part of the .bss section of the executable. There will be 2007 1.1 christos an entry for this symbol in the .dynsym section. The dynamic 2008 1.1 christos object will contain position independent code, so all references 2009 1.1 christos from the dynamic object to this symbol will go through the global 2010 1.1 christos offset table. The dynamic linker will use the .dynsym entry to 2011 1.1 christos determine the address it must put in the global offset table, so 2012 1.1 christos both the dynamic object and the regular object will refer to the 2013 1.1 christos same memory location for the variable. */ 2014 1.1 christos 2015 1.1 christos /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker 2016 1.6 christos to copy the initial value out of the dynamic object and into the 2017 1.6 christos runtime process image. We need to remember the offset into the 2018 1.6 christos .rel.bss section we are going to use. */ 2019 1.6 christos if ((h->root.u.def.section->flags & SEC_READONLY) != 0) 2020 1.6 christos { 2021 1.6 christos s = htab->elf.sdynrelro; 2022 1.6 christos srel = htab->elf.sreldynrelro; 2023 1.6 christos } 2024 1.6 christos else 2025 1.6 christos { 2026 1.1 christos s = htab->elf.sdynbss; 2027 1.1 christos srel = htab->elf.srelbss; 2028 1.6 christos } 2029 1.1 christos if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) 2030 1.1 christos { 2031 1.1 christos srel->size += SPARC_ELF_RELA_BYTES (htab); 2032 1.3 christos h->needs_copy = 1; 2033 1.1 christos } 2034 1.1 christos 2035 1.1 christos return _bfd_elf_adjust_dynamic_copy (info, h, s); 2036 1.1 christos } 2037 1.1 christos 2038 1.8 christos /* Allocate space in .plt, .got and associated reloc sections for 2039 1.1 christos dynamic relocs. */ 2040 1.1 christos 2041 1.1 christos static bool 2042 1.1 christos allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) 2043 1.1 christos { 2044 1.6 christos struct bfd_link_info *info; 2045 1.8 christos struct _bfd_sparc_elf_link_hash_table *htab; 2046 1.1 christos struct _bfd_sparc_elf_link_hash_entry *eh; 2047 1.1 christos struct elf_dyn_relocs *p; 2048 1.8 christos bool resolved_to_zero; 2049 1.1 christos 2050 1.1 christos if (h->root.type == bfd_link_hash_indirect) 2051 1.1 christos return true; 2052 1.1 christos 2053 1.1 christos info = (struct bfd_link_info *) inf; 2054 1.6 christos htab = _bfd_sparc_elf_hash_table (info); 2055 1.6 christos BFD_ASSERT (htab != NULL); 2056 1.6 christos 2057 1.1 christos eh = (struct _bfd_sparc_elf_link_hash_entry *) h; 2058 1.1 christos resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh); 2059 1.1 christos 2060 1.1 christos if ((htab->elf.dynamic_sections_created 2061 1.1 christos && h->plt.refcount > 0) 2062 1.1 christos || (h->type == STT_GNU_IFUNC 2063 1.6 christos && h->def_regular 2064 1.6 christos && h->ref_regular)) 2065 1.6 christos { 2066 1.6 christos /* Undefined weak syms won't yet be marked as dynamic. */ 2067 1.1 christos if (h->root.type == bfd_link_hash_undefweak 2068 1.1 christos && !resolved_to_zero 2069 1.1 christos && h->dynindx == -1 2070 1.8 christos && !h->forced_local) 2071 1.1 christos { 2072 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2073 1.3 christos return false; 2074 1.1 christos } 2075 1.1 christos 2076 1.1 christos if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h) 2077 1.1 christos || (h->type == STT_GNU_IFUNC 2078 1.1 christos && h->def_regular)) 2079 1.1 christos { 2080 1.1 christos asection *s = htab->elf.splt; 2081 1.1 christos 2082 1.1 christos if (s == NULL) 2083 1.1 christos s = htab->elf.iplt; 2084 1.1 christos 2085 1.1 christos /* Allocate room for the header. */ 2086 1.1 christos if (s->size == 0) 2087 1.1 christos { 2088 1.8 christos s->size = htab->plt_header_size; 2089 1.8 christos 2090 1.1 christos /* Allocate space for the .rela.plt.unloaded relocations. */ 2091 1.1 christos if (htab->elf.target_os == is_vxworks 2092 1.1 christos && !bfd_link_pic (info)) 2093 1.1 christos htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2; 2094 1.1 christos } 2095 1.1 christos 2096 1.1 christos /* The procedure linkage table size is bounded by the magnitude 2097 1.1 christos of the offset we can describe in the entry. */ 2098 1.1 christos if (s->size >= (SPARC_ELF_WORD_BYTES(htab) == 8 ? 2099 1.8 christos (((bfd_vma)1 << 31) << 1) : 0x400000)) 2100 1.1 christos { 2101 1.1 christos bfd_set_error (bfd_error_bad_value); 2102 1.1 christos return false; 2103 1.1 christos } 2104 1.1 christos 2105 1.1 christos if (SPARC_ELF_WORD_BYTES(htab) == 8 2106 1.1 christos && s->size >= PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE) 2107 1.1 christos { 2108 1.1 christos bfd_vma off = s->size - PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE; 2109 1.1 christos 2110 1.1 christos 2111 1.1 christos off = (off % (160 * PLT64_ENTRY_SIZE)) / PLT64_ENTRY_SIZE; 2112 1.1 christos 2113 1.1 christos h->plt.offset = (s->size - (off * 8)); 2114 1.1 christos } 2115 1.1 christos else 2116 1.1 christos h->plt.offset = s->size; 2117 1.1 christos 2118 1.1 christos /* If this symbol is not defined in a regular file, and we are 2119 1.1 christos not generating a shared library, then set the symbol to this 2120 1.3 christos location in the .plt. This is required to make function 2121 1.1 christos pointers compare as equal between the normal executable and 2122 1.1 christos the shared library. */ 2123 1.1 christos if (! bfd_link_pic (info) 2124 1.1 christos && !h->def_regular) 2125 1.1 christos { 2126 1.1 christos h->root.u.def.section = s; 2127 1.1 christos h->root.u.def.value = h->plt.offset; 2128 1.1 christos } 2129 1.1 christos 2130 1.6 christos /* Make room for this entry. */ 2131 1.6 christos s->size += htab->plt_entry_size; 2132 1.6 christos 2133 1.6 christos /* There should be no PLT relocations against resolved undefined 2134 1.6 christos weak symbols in the executable. */ 2135 1.6 christos if (!resolved_to_zero) 2136 1.6 christos { 2137 1.6 christos /* We also need to make an entry in the .rela.plt section. */ 2138 1.6 christos if (s == htab->elf.splt) 2139 1.6 christos htab->elf.srelplt->size += SPARC_ELF_RELA_BYTES (htab); 2140 1.1 christos else 2141 1.8 christos htab->elf.irelplt->size += SPARC_ELF_RELA_BYTES (htab); 2142 1.1 christos } 2143 1.1 christos 2144 1.1 christos if (htab->elf.target_os == is_vxworks) 2145 1.1 christos { 2146 1.1 christos /* Allocate space for the .got.plt entry. */ 2147 1.3 christos htab->elf.sgotplt->size += 4; 2148 1.1 christos 2149 1.1 christos /* ...and for the .rela.plt.unloaded relocations. */ 2150 1.1 christos if (!bfd_link_pic (info)) 2151 1.1 christos htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3; 2152 1.1 christos } 2153 1.1 christos } 2154 1.1 christos else 2155 1.1 christos { 2156 1.1 christos h->plt.offset = (bfd_vma) -1; 2157 1.1 christos h->needs_plt = 0; 2158 1.1 christos } 2159 1.1 christos } 2160 1.1 christos else 2161 1.1 christos { 2162 1.1 christos h->plt.offset = (bfd_vma) -1; 2163 1.1 christos h->needs_plt = 0; 2164 1.1 christos } 2165 1.1 christos 2166 1.6 christos /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary, 2167 1.1 christos make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry. */ 2168 1.1 christos if (h->got.refcount > 0 2169 1.1 christos && bfd_link_executable (info) 2170 1.1 christos && h->dynindx == -1 2171 1.1 christos && _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE) 2172 1.1 christos h->got.offset = (bfd_vma) -1; 2173 1.8 christos else if (h->got.refcount > 0) 2174 1.1 christos { 2175 1.1 christos asection *s; 2176 1.6 christos bool dyn; 2177 1.6 christos int tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type; 2178 1.6 christos 2179 1.6 christos /* Undefined weak syms won't yet be marked as dynamic. */ 2180 1.1 christos if (h->root.type == bfd_link_hash_undefweak 2181 1.1 christos && !resolved_to_zero 2182 1.1 christos && h->dynindx == -1 2183 1.8 christos && !h->forced_local) 2184 1.1 christos { 2185 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2186 1.1 christos return false; 2187 1.1 christos } 2188 1.1 christos 2189 1.1 christos s = htab->elf.sgot; 2190 1.1 christos h->got.offset = s->size; 2191 1.1 christos s->size += SPARC_ELF_WORD_BYTES (htab); 2192 1.1 christos /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots. */ 2193 1.1 christos if (tls_type == GOT_TLS_GD) 2194 1.6 christos s->size += SPARC_ELF_WORD_BYTES (htab); 2195 1.1 christos dyn = htab->elf.dynamic_sections_created; 2196 1.1 christos /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation, 2197 1.1 christos R_SPARC_TLS_GD_{HI22,LO10} needs one if local and two if global. */ 2198 1.1 christos if ((tls_type == GOT_TLS_GD && h->dynindx == -1) 2199 1.1 christos || tls_type == GOT_TLS_IE 2200 1.1 christos || h->type == STT_GNU_IFUNC) 2201 1.6 christos htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab); 2202 1.6 christos else if (tls_type == GOT_TLS_GD) 2203 1.6 christos htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab); 2204 1.6 christos else if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h) 2205 1.6 christos /* Even if the symbol isn't dynamic, we may generate a 2206 1.6 christos reloc for the dynamic linker in PIC mode. */ 2207 1.6 christos || (h->dynindx == -1 2208 1.6 christos && !h->forced_local 2209 1.6 christos && h->root.type != bfd_link_hash_undefweak 2210 1.6 christos && bfd_link_pic (info))) 2211 1.6 christos /* No dynamic relocations are needed against resolved 2212 1.6 christos undefined weak symbols in an executable. */ 2213 1.1 christos && !(h->root.type == bfd_link_hash_undefweak 2214 1.1 christos && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 2215 1.1 christos || resolved_to_zero))) 2216 1.1 christos htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab); 2217 1.1 christos } 2218 1.8 christos else 2219 1.8 christos h->got.offset = (bfd_vma) -1; 2220 1.1 christos 2221 1.1 christos if (h->dyn_relocs == NULL) 2222 1.1 christos return true; 2223 1.1 christos 2224 1.1 christos /* In the shared -Bsymbolic case, discard space allocated for 2225 1.1 christos dynamic pc-relative relocs against symbols which turn out to be 2226 1.1 christos defined in regular objects. For the normal shared case, discard 2227 1.3 christos space for pc-relative relocs that have become local due to symbol 2228 1.1 christos visibility changes. */ 2229 1.1 christos 2230 1.1 christos if (bfd_link_pic (info)) 2231 1.6 christos { 2232 1.1 christos if (SYMBOL_CALLS_LOCAL (info, h)) 2233 1.8 christos { 2234 1.1 christos struct elf_dyn_relocs **pp; 2235 1.1 christos 2236 1.1 christos for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) 2237 1.1 christos { 2238 1.1 christos p->count -= p->pc_count; 2239 1.1 christos p->pc_count = 0; 2240 1.1 christos if (p->count == 0) 2241 1.1 christos *pp = p->next; 2242 1.1 christos else 2243 1.1 christos pp = &p->next; 2244 1.8 christos } 2245 1.1 christos } 2246 1.6 christos 2247 1.1 christos if (htab->elf.target_os == is_vxworks) 2248 1.8 christos { 2249 1.1 christos struct elf_dyn_relocs **pp; 2250 1.1 christos 2251 1.1 christos for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) 2252 1.1 christos { 2253 1.1 christos if (strcmp (p->sec->output_section->name, ".tls_vars") == 0) 2254 1.1 christos *pp = p->next; 2255 1.1 christos else 2256 1.1 christos pp = &p->next; 2257 1.1 christos } 2258 1.6 christos } 2259 1.8 christos 2260 1.1 christos /* Also discard relocs on undefined weak syms with non-default 2261 1.1 christos visibility or in PIE. */ 2262 1.6 christos if (h->dyn_relocs != NULL 2263 1.6 christos && h->root.type == bfd_link_hash_undefweak) 2264 1.6 christos { 2265 1.6 christos /* An undefined weak symbol is never 2266 1.6 christos bound locally in a shared library. */ 2267 1.6 christos 2268 1.6 christos if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 2269 1.6 christos || resolved_to_zero) 2270 1.6 christos { 2271 1.6 christos if (h->non_got_ref) 2272 1.6 christos { 2273 1.6 christos /* Keep dynamic non-GOT/non-PLT relocation so that we 2274 1.8 christos can branch to 0 without PLT. */ 2275 1.6 christos struct elf_dyn_relocs **pp; 2276 1.6 christos 2277 1.6 christos for (pp = &h->dyn_relocs; (p = *pp) != NULL;) 2278 1.6 christos if (p->pc_count == 0) 2279 1.6 christos *pp = p->next; 2280 1.6 christos else 2281 1.6 christos { 2282 1.6 christos /* Remove other relocations. */ 2283 1.6 christos p->count = p->pc_count; 2284 1.8 christos pp = &p->next; 2285 1.6 christos } 2286 1.6 christos 2287 1.6 christos if (h->dyn_relocs != NULL) 2288 1.6 christos { 2289 1.6 christos /* Make sure undefined weak symbols are output 2290 1.8 christos as dynamic symbols in PIEs for dynamic non-GOT 2291 1.6 christos non-PLT reloations. */ 2292 1.6 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2293 1.6 christos return false; 2294 1.8 christos } 2295 1.6 christos } 2296 1.1 christos else 2297 1.1 christos h->dyn_relocs = NULL; 2298 1.1 christos } 2299 1.1 christos 2300 1.1 christos /* Make sure undefined weak symbols are output as a dynamic 2301 1.1 christos symbol in PIEs. */ 2302 1.1 christos else if (h->dynindx == -1 2303 1.8 christos && !h->forced_local) 2304 1.1 christos { 2305 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2306 1.1 christos return false; 2307 1.1 christos } 2308 1.1 christos } 2309 1.1 christos } 2310 1.1 christos else 2311 1.1 christos { 2312 1.1 christos /* For the non-shared case, discard space for relocs against 2313 1.6 christos symbols which turn out to need copy relocs or are not 2314 1.6 christos dynamic. */ 2315 1.6 christos 2316 1.1 christos if ((!h->non_got_ref 2317 1.1 christos || (h->root.type == bfd_link_hash_undefweak 2318 1.1 christos && !resolved_to_zero)) 2319 1.1 christos && ((h->def_dynamic 2320 1.1 christos && !h->def_regular) 2321 1.1 christos || (htab->elf.dynamic_sections_created 2322 1.6 christos && (h->root.type == bfd_link_hash_undefweak 2323 1.6 christos || h->root.type == bfd_link_hash_undefined)))) 2324 1.6 christos { 2325 1.6 christos /* Undefined weak syms won't yet be marked as dynamic. */ 2326 1.1 christos if (h->root.type == bfd_link_hash_undefweak 2327 1.1 christos && !resolved_to_zero 2328 1.1 christos && h->dynindx == -1 2329 1.8 christos && !h->forced_local) 2330 1.1 christos { 2331 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2332 1.1 christos return false; 2333 1.1 christos } 2334 1.1 christos 2335 1.1 christos /* If that succeeded, we know we'll be keeping all the 2336 1.1 christos relocs. */ 2337 1.1 christos if (h->dynindx != -1) 2338 1.8 christos goto keep; 2339 1.1 christos } 2340 1.1 christos 2341 1.1 christos h->dyn_relocs = NULL; 2342 1.1 christos 2343 1.1 christos keep: ; 2344 1.8 christos } 2345 1.1 christos 2346 1.1 christos /* Finally, allocate space. */ 2347 1.1 christos for (p = h->dyn_relocs; p != NULL; p = p->next) 2348 1.1 christos { 2349 1.1 christos asection *sreloc = elf_section_data (p->sec)->sreloc; 2350 1.8 christos sreloc->size += p->count * SPARC_ELF_RELA_BYTES (htab); 2351 1.1 christos } 2352 1.1 christos 2353 1.1 christos return true; 2354 1.1 christos } 2355 1.1 christos 2356 1.8 christos /* Allocate space in .plt, .got and associated reloc sections for 2357 1.1 christos local dynamic relocs. */ 2358 1.1 christos 2359 1.1 christos static int 2360 1.1 christos allocate_local_dynrelocs (void **slot, void *inf) 2361 1.1 christos { 2362 1.1 christos struct elf_link_hash_entry *h 2363 1.1 christos = (struct elf_link_hash_entry *) *slot; 2364 1.1 christos 2365 1.1 christos if (h->type != STT_GNU_IFUNC 2366 1.1 christos || !h->def_regular 2367 1.1 christos || !h->ref_regular 2368 1.1 christos || !h->forced_local 2369 1.1 christos || h->root.type != bfd_link_hash_defined) 2370 1.1 christos abort (); 2371 1.1 christos 2372 1.1 christos return allocate_dynrelocs (h, inf); 2373 1.1 christos } 2374 1.1 christos 2375 1.8 christos /* Return true if the dynamic symbol for a given section should be 2376 1.1 christos omitted when creating a shared library. */ 2377 1.1 christos 2378 1.1 christos bool 2379 1.1 christos _bfd_sparc_elf_omit_section_dynsym (bfd *output_bfd, 2380 1.1 christos struct bfd_link_info *info, 2381 1.1 christos asection *p) 2382 1.1 christos { 2383 1.1 christos /* We keep the .got section symbol so that explicit relocations 2384 1.8 christos against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode 2385 1.1 christos can be turned into relocations against the .got symbol. */ 2386 1.6 christos if (strcmp (p->name, ".got") == 0) 2387 1.1 christos return false; 2388 1.1 christos 2389 1.1 christos return _bfd_elf_omit_section_dynsym_default (output_bfd, info, p); 2390 1.1 christos } 2391 1.8 christos 2392 1.10 christos /* Set the sizes of the dynamic sections. */ 2393 1.10 christos 2394 1.1 christos bool 2395 1.1 christos _bfd_sparc_elf_late_size_sections (bfd *output_bfd, 2396 1.1 christos struct bfd_link_info *info) 2397 1.1 christos { 2398 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 2399 1.1 christos bfd *dynobj; 2400 1.1 christos asection *s; 2401 1.1 christos bfd *ibfd; 2402 1.1 christos 2403 1.10 christos htab = _bfd_sparc_elf_hash_table (info); 2404 1.10 christos BFD_ASSERT (htab != NULL); 2405 1.1 christos dynobj = htab->elf.dynobj; 2406 1.1 christos if (dynobj == NULL) 2407 1.1 christos return true; 2408 1.1 christos 2409 1.3 christos if (elf_hash_table (info)->dynamic_sections_created) 2410 1.1 christos { 2411 1.1 christos /* Set the contents of the .interp section to the interpreter. */ 2412 1.1 christos if (bfd_link_executable (info) && !info->nointerp) 2413 1.1 christos { 2414 1.1 christos s = bfd_get_linker_section (dynobj, ".interp"); 2415 1.10 christos BFD_ASSERT (s != NULL); 2416 1.6 christos s->size = htab->dynamic_interpreter_size; 2417 1.1 christos s->contents = (unsigned char *) htab->dynamic_interpreter; 2418 1.1 christos s->alloced = 1; 2419 1.1 christos htab->interp = s; 2420 1.1 christos } 2421 1.1 christos } 2422 1.3 christos 2423 1.1 christos /* Set up .got offsets for local syms, and space for local dynamic 2424 1.1 christos relocs. */ 2425 1.1 christos for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 2426 1.1 christos { 2427 1.1 christos bfd_signed_vma *local_got; 2428 1.1 christos bfd_signed_vma *end_local_got; 2429 1.1 christos char *local_tls_type; 2430 1.1 christos bfd_size_type locsymcount; 2431 1.1 christos Elf_Internal_Shdr *symtab_hdr; 2432 1.1 christos asection *srel; 2433 1.1 christos 2434 1.1 christos if (! is_sparc_elf (ibfd)) 2435 1.1 christos continue; 2436 1.6 christos 2437 1.1 christos for (s = ibfd->sections; s != NULL; s = s->next) 2438 1.1 christos { 2439 1.1 christos struct elf_dyn_relocs *p; 2440 1.1 christos 2441 1.1 christos for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) 2442 1.1 christos { 2443 1.1 christos if (!bfd_is_abs_section (p->sec) 2444 1.1 christos && bfd_is_abs_section (p->sec->output_section)) 2445 1.1 christos { 2446 1.1 christos /* Input section has been discarded, either because 2447 1.1 christos it is a copy of a linkonce section or due to 2448 1.8 christos linker script /DISCARD/, so we'll be discarding 2449 1.1 christos the relocs too. */ 2450 1.1 christos } 2451 1.1 christos else if (htab->elf.target_os == is_vxworks 2452 1.1 christos && strcmp (p->sec->output_section->name, 2453 1.1 christos ".tls_vars") == 0) 2454 1.1 christos { 2455 1.1 christos /* Relocations in vxworks .tls_vars sections are 2456 1.1 christos handled specially by the loader. */ 2457 1.1 christos } 2458 1.1 christos else if (p->count != 0) 2459 1.1 christos { 2460 1.1 christos srel = elf_section_data (p->sec)->sreloc; 2461 1.1 christos if (!htab->elf.dynamic_sections_created) 2462 1.3 christos srel = htab->elf.irelplt; 2463 1.3 christos srel->size += p->count * SPARC_ELF_RELA_BYTES (htab); 2464 1.6 christos if ((p->sec->output_section->flags & SEC_READONLY) != 0) 2465 1.6 christos { 2466 1.3 christos info->flags |= DF_TEXTREL; 2467 1.1 christos info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"), 2468 1.1 christos p->sec->owner, p->sec); 2469 1.1 christos } 2470 1.1 christos } 2471 1.1 christos } 2472 1.1 christos } 2473 1.1 christos 2474 1.1 christos local_got = elf_local_got_refcounts (ibfd); 2475 1.1 christos if (!local_got) 2476 1.1 christos continue; 2477 1.1 christos 2478 1.1 christos symtab_hdr = &elf_symtab_hdr (ibfd); 2479 1.1 christos locsymcount = symtab_hdr->sh_info; 2480 1.1 christos end_local_got = local_got + locsymcount; 2481 1.1 christos local_tls_type = _bfd_sparc_elf_local_got_tls_type (ibfd); 2482 1.1 christos s = htab->elf.sgot; 2483 1.1 christos srel = htab->elf.srelgot; 2484 1.1 christos for (; local_got < end_local_got; ++local_got, ++local_tls_type) 2485 1.1 christos { 2486 1.1 christos if (*local_got > 0) 2487 1.1 christos { 2488 1.1 christos *local_got = s->size; 2489 1.3 christos s->size += SPARC_ELF_WORD_BYTES (htab); 2490 1.1 christos if (*local_tls_type == GOT_TLS_GD) 2491 1.1 christos s->size += SPARC_ELF_WORD_BYTES (htab); 2492 1.1 christos if (bfd_link_pic (info) 2493 1.1 christos || *local_tls_type == GOT_TLS_GD 2494 1.1 christos || *local_tls_type == GOT_TLS_IE) 2495 1.1 christos srel->size += SPARC_ELF_RELA_BYTES (htab); 2496 1.1 christos } 2497 1.1 christos else 2498 1.1 christos *local_got = (bfd_vma) -1; 2499 1.1 christos } 2500 1.1 christos } 2501 1.1 christos 2502 1.1 christos if (htab->tls_ldm_got.refcount > 0) 2503 1.1 christos { 2504 1.1 christos /* Allocate 2 got entries and 1 dynamic reloc for 2505 1.1 christos R_SPARC_TLS_LDM_{HI22,LO10} relocs. */ 2506 1.1 christos htab->tls_ldm_got.offset = htab->elf.sgot->size; 2507 1.1 christos htab->elf.sgot->size += (2 * SPARC_ELF_WORD_BYTES (htab)); 2508 1.1 christos htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab); 2509 1.1 christos } 2510 1.1 christos else 2511 1.1 christos htab->tls_ldm_got.offset = -1; 2512 1.1 christos 2513 1.1 christos /* Allocate global sym .plt and .got entries, and space for global 2514 1.1 christos sym dynamic relocs. */ 2515 1.1 christos elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info); 2516 1.1 christos 2517 1.1 christos /* Allocate .plt and .got entries, and space for local symbols. */ 2518 1.8 christos htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info); 2519 1.1 christos 2520 1.1 christos if (! ABI_64_P (output_bfd) 2521 1.1 christos && htab->elf.target_os != is_vxworks 2522 1.1 christos && elf_hash_table (info)->dynamic_sections_created) 2523 1.1 christos { 2524 1.1 christos /* Make space for the trailing nop in .plt. */ 2525 1.1 christos if (htab->elf.splt->size > 0) 2526 1.1 christos htab->elf.splt->size += 1 * SPARC_INSN_BYTES; 2527 1.1 christos 2528 1.1 christos /* If the .got section is more than 0x1000 bytes, we add 2529 1.1 christos 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13 2530 1.1 christos bit relocations have a greater chance of working. 2531 1.1 christos 2532 1.1 christos FIXME: Make this optimization work for 64-bit too. */ 2533 1.1 christos if (htab->elf.sgot->size >= 0x1000 2534 1.1 christos && elf_hash_table (info)->hgot->root.u.def.value == 0) 2535 1.1 christos elf_hash_table (info)->hgot->root.u.def.value = 0x1000; 2536 1.1 christos } 2537 1.1 christos 2538 1.1 christos /* The check_relocs and adjust_dynamic_symbol entry points have 2539 1.1 christos determined the sizes of the various dynamic sections. Allocate 2540 1.1 christos memory for them. */ 2541 1.1 christos for (s = dynobj->sections; s != NULL; s = s->next) 2542 1.1 christos { 2543 1.1 christos if ((s->flags & SEC_LINKER_CREATED) == 0) 2544 1.1 christos continue; 2545 1.6 christos 2546 1.6 christos if (s == htab->elf.splt 2547 1.1 christos || s == htab->elf.sgot 2548 1.1 christos || s == htab->elf.sdynbss 2549 1.1 christos || s == htab->elf.sdynrelro 2550 1.1 christos || s == htab->elf.iplt 2551 1.1 christos || s == htab->elf.sgotplt) 2552 1.1 christos { 2553 1.8 christos /* Strip this section if we don't need it; see the 2554 1.1 christos comment below. */ 2555 1.1 christos } 2556 1.1 christos else if (startswith (s->name, ".rela")) 2557 1.1 christos { 2558 1.1 christos if (s->size != 0) 2559 1.1 christos { 2560 1.1 christos /* We use the reloc_count field as a counter if we need 2561 1.1 christos to copy relocs into the output file. */ 2562 1.1 christos s->reloc_count = 0; 2563 1.1 christos } 2564 1.1 christos } 2565 1.1 christos else 2566 1.1 christos { 2567 1.1 christos /* It's not one of our sections. */ 2568 1.1 christos continue; 2569 1.1 christos } 2570 1.1 christos 2571 1.1 christos if (s->size == 0) 2572 1.1 christos { 2573 1.1 christos /* If we don't need this section, strip it from the 2574 1.1 christos output file. This is mostly to handle .rela.bss and 2575 1.1 christos .rela.plt. We must create both sections in 2576 1.1 christos create_dynamic_sections, because they must be created 2577 1.1 christos before the linker maps input sections to output 2578 1.1 christos sections. The linker does that before 2579 1.1 christos adjust_dynamic_symbol is called, and it is that 2580 1.1 christos function which decides whether anything needs to go 2581 1.1 christos into these sections. */ 2582 1.1 christos s->flags |= SEC_EXCLUDE; 2583 1.1 christos continue; 2584 1.1 christos } 2585 1.1 christos 2586 1.1 christos if ((s->flags & SEC_HAS_CONTENTS) == 0) 2587 1.1 christos continue; 2588 1.1 christos 2589 1.1 christos /* Allocate memory for the section contents. Zero the memory 2590 1.1 christos for the benefit of .rela.plt, which has 4 unused entries 2591 1.8 christos at the beginning, and we don't want garbage. */ 2592 1.10 christos s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); 2593 1.1 christos if (s->contents == NULL) 2594 1.1 christos return false; 2595 1.1 christos s->alloced = 1; 2596 1.1 christos } 2597 1.1 christos 2598 1.1 christos if (elf_hash_table (info)->dynamic_sections_created) 2599 1.1 christos { 2600 1.1 christos /* Add some entries to the .dynamic section. We fill in the 2601 1.1 christos values later, in _bfd_sparc_elf_finish_dynamic_sections, but we 2602 1.1 christos must add the entries now so that we get the correct size for 2603 1.1 christos the .dynamic section. The DT_DEBUG entry is filled in by the 2604 1.1 christos dynamic linker and used by the debugger. */ 2605 1.8 christos #define add_dynamic_entry(TAG, VAL) \ 2606 1.8 christos _bfd_elf_add_dynamic_entry (info, TAG, VAL) 2607 1.8 christos 2608 1.1 christos if (!_bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info, 2609 1.1 christos true)) 2610 1.1 christos return false; 2611 1.1 christos 2612 1.1 christos if (ABI_64_P (output_bfd)) 2613 1.1 christos { 2614 1.1 christos int reg; 2615 1.1 christos struct _bfd_sparc_elf_app_reg * app_regs; 2616 1.1 christos struct elf_strtab_hash *dynstr; 2617 1.1 christos struct elf_link_hash_table *eht = elf_hash_table (info); 2618 1.1 christos 2619 1.1 christos /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER 2620 1.1 christos entries if needed. */ 2621 1.1 christos app_regs = _bfd_sparc_elf_hash_table (info)->app_regs; 2622 1.1 christos dynstr = eht->dynstr; 2623 1.1 christos 2624 1.1 christos for (reg = 0; reg < 4; reg++) 2625 1.1 christos if (app_regs [reg].name != NULL) 2626 1.1 christos { 2627 1.8 christos struct elf_link_local_dynamic_entry *entry, *e; 2628 1.1 christos 2629 1.1 christos if (!add_dynamic_entry (DT_SPARC_REGISTER, 0)) 2630 1.1 christos return false; 2631 1.1 christos 2632 1.8 christos entry = (struct elf_link_local_dynamic_entry *) 2633 1.1 christos bfd_hash_allocate (&info->hash->table, sizeof (*entry)); 2634 1.1 christos if (entry == NULL) 2635 1.1 christos return false; 2636 1.1 christos 2637 1.1 christos /* We cheat here a little bit: the symbol will not be local, so we 2638 1.1 christos put it at the end of the dynlocal linked list. We will fix it 2639 1.1 christos later on, as we have to fix other fields anyway. */ 2640 1.1 christos entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4; 2641 1.8 christos entry->isym.st_size = 0; 2642 1.1 christos if (*app_regs [reg].name != '\0') 2643 1.1 christos entry->isym.st_name 2644 1.1 christos = _bfd_elf_strtab_add (dynstr, app_regs[reg].name, false); 2645 1.1 christos else 2646 1.1 christos entry->isym.st_name = 0; 2647 1.1 christos entry->isym.st_other = 0; 2648 1.1 christos entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind, 2649 1.1 christos STT_REGISTER); 2650 1.1 christos entry->isym.st_shndx = app_regs [reg].shndx; 2651 1.1 christos entry->isym.st_target_internal = 0; 2652 1.1 christos entry->next = NULL; 2653 1.1 christos entry->input_bfd = output_bfd; 2654 1.1 christos entry->input_indx = -1; 2655 1.1 christos 2656 1.1 christos if (eht->dynlocal == NULL) 2657 1.1 christos eht->dynlocal = entry; 2658 1.1 christos else 2659 1.1 christos { 2660 1.1 christos for (e = eht->dynlocal; e->next; e = e->next) 2661 1.1 christos ; 2662 1.1 christos e->next = entry; 2663 1.1 christos } 2664 1.1 christos eht->dynsymcount++; 2665 1.1 christos } 2666 1.1 christos } 2667 1.8 christos } 2668 1.1 christos #undef add_dynamic_entry 2669 1.1 christos 2670 1.8 christos return true; 2671 1.1 christos } 2672 1.1 christos 2673 1.10 christos bool 2675 1.10 christos _bfd_sparc_elf_new_section_hook (bfd *abfd, asection *sec) 2676 1.10 christos { 2677 1.10 christos struct _bfd_sparc_elf_section_data *sdata; 2678 1.10 christos 2679 1.1 christos sdata = bfd_zalloc (abfd, sizeof (*sdata)); 2680 1.1 christos if (sdata == NULL) 2681 1.1 christos return false; 2682 1.1 christos sec->used_by_bfd = sdata; 2683 1.8 christos 2684 1.1 christos return _bfd_elf_new_section_hook (abfd, sec); 2685 1.1 christos } 2686 1.1 christos 2687 1.8 christos bool 2688 1.1 christos _bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED, 2689 1.3 christos struct bfd_section *section, 2690 1.10 christos struct bfd_link_info *link_info ATTRIBUTE_UNUSED, 2691 1.10 christos bool *again) 2692 1.1 christos { 2693 1.8 christos if (bfd_link_relocatable (link_info)) 2694 1.1 christos link_info->callbacks->fatal 2695 1.8 christos (_("%P: --relax and -r may not be used together\n")); 2696 1.1 christos 2697 1.1 christos *again = false; 2698 1.1 christos sec_do_relax (section) = 1; 2699 1.1 christos return true; 2700 1.1 christos } 2701 1.1 christos 2702 1.1 christos /* Return the base VMA address which should be subtracted from real addresses 2704 1.1 christos when resolving @dtpoff relocation. 2705 1.1 christos This is PT_TLS segment p_vaddr. */ 2706 1.1 christos 2707 1.1 christos static bfd_vma 2708 1.1 christos dtpoff_base (struct bfd_link_info *info) 2709 1.1 christos { 2710 1.1 christos /* If tls_sec is NULL, we should have signalled an error already. */ 2711 1.1 christos if (elf_hash_table (info)->tls_sec == NULL) 2712 1.1 christos return 0; 2713 1.1 christos return elf_hash_table (info)->tls_sec->vma; 2714 1.1 christos } 2715 1.1 christos 2716 1.1 christos /* Return the relocation value for @tpoff relocation 2717 1.1 christos if STT_TLS virtual address is ADDRESS. */ 2718 1.1 christos 2719 1.1 christos static bfd_vma 2720 1.1 christos tpoff (struct bfd_link_info *info, bfd_vma address) 2721 1.1 christos { 2722 1.1 christos struct elf_link_hash_table *htab = elf_hash_table (info); 2723 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd); 2724 1.1 christos bfd_vma static_tls_size; 2725 1.1 christos 2726 1.1 christos /* If tls_sec is NULL, we should have signalled an error already. */ 2727 1.1 christos if (htab->tls_sec == NULL) 2728 1.1 christos return 0; 2729 1.1 christos 2730 1.1 christos /* Consider special static TLS alignment requirements. */ 2731 1.1 christos static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment); 2732 1.1 christos return address - static_tls_size - htab->tls_sec->vma; 2733 1.1 christos } 2734 1.1 christos 2735 1.1 christos /* Return the relocation value for a %gdop relocation. */ 2736 1.1 christos 2737 1.1 christos static bfd_vma 2738 1.1 christos gdopoff (struct bfd_link_info *info, bfd_vma address) 2739 1.1 christos { 2740 1.1 christos struct elf_link_hash_table *htab = elf_hash_table (info); 2741 1.1 christos bfd_vma got_base; 2742 1.1 christos 2743 1.1 christos got_base = (htab->hgot->root.u.def.value 2744 1.1 christos + htab->hgot->root.u.def.section->output_offset 2745 1.6 christos + htab->hgot->root.u.def.section->output_section->vma); 2746 1.6 christos 2747 1.6 christos return address - got_base; 2748 1.6 christos } 2749 1.8 christos 2750 1.6 christos /* Return whether H is local and its ADDRESS is within 4G of 2751 1.6 christos _GLOBAL_OFFSET_TABLE_ and thus the offset may be calculated by a 2752 1.6 christos sethi, xor sequence. */ 2753 1.6 christos 2754 1.6 christos static bool 2755 1.8 christos gdop_relative_offset_ok (struct bfd_link_info *info, 2756 1.6 christos struct elf_link_hash_entry *h, 2757 1.6 christos bfd_vma address ATTRIBUTE_UNUSED) 2758 1.6 christos { 2759 1.6 christos if (!SYMBOL_REFERENCES_LOCAL (info, h)) 2760 1.6 christos return false; 2761 1.6 christos /* If H is undefined, ADDRESS will be zero. We can't allow a 2762 1.6 christos relative offset to "zero" when producing PIEs or shared libs. 2763 1.6 christos Note that to get here with an undefined symbol it must also be 2764 1.8 christos hidden or internal visibility. */ 2765 1.6 christos if (bfd_link_pic (info) 2766 1.6 christos && h != NULL 2767 1.6 christos && (h->root.type == bfd_link_hash_undefweak 2768 1.8 christos || h->root.type == bfd_link_hash_undefined)) 2769 1.6 christos return false; 2770 1.6 christos #ifdef BFD64 2771 1.6 christos return gdopoff (info, address) + ((bfd_vma) 1 << 32) < (bfd_vma) 2 << 32; 2772 1.1 christos #else 2773 1.1 christos return true; 2774 1.8 christos #endif 2775 1.1 christos } 2776 1.1 christos 2777 1.1 christos /* Relocate a SPARC ELF section. */ 2778 1.1 christos 2779 1.1 christos int 2780 1.1 christos _bfd_sparc_elf_relocate_section (bfd *output_bfd, 2781 1.1 christos struct bfd_link_info *info, 2782 1.1 christos bfd *input_bfd, 2783 1.1 christos asection *input_section, 2784 1.1 christos bfd_byte *contents, 2785 1.1 christos Elf_Internal_Rela *relocs, 2786 1.1 christos Elf_Internal_Sym *local_syms, 2787 1.1 christos asection **local_sections) 2788 1.1 christos { 2789 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 2790 1.1 christos Elf_Internal_Shdr *symtab_hdr; 2791 1.1 christos struct elf_link_hash_entry **sym_hashes; 2792 1.1 christos bfd_vma *local_got_offsets; 2793 1.8 christos bfd_vma got_base; 2794 1.1 christos asection *sreloc; 2795 1.1 christos Elf_Internal_Rela *rel; 2796 1.1 christos Elf_Internal_Rela *relend; 2797 1.1 christos int num_relocs; 2798 1.1 christos bool is_vxworks_tls; 2799 1.1 christos 2800 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 2801 1.1 christos BFD_ASSERT (htab != NULL); 2802 1.1 christos symtab_hdr = &elf_symtab_hdr (input_bfd); 2803 1.1 christos sym_hashes = elf_sym_hashes (input_bfd); 2804 1.1 christos local_got_offsets = elf_local_got_offsets (input_bfd); 2805 1.1 christos 2806 1.1 christos if (elf_hash_table (info)->hgot == NULL) 2807 1.1 christos got_base = 0; 2808 1.1 christos else 2809 1.8 christos got_base = elf_hash_table (info)->hgot->root.u.def.value; 2810 1.8 christos 2811 1.1 christos sreloc = elf_section_data (input_section)->sreloc; 2812 1.1 christos /* We have to handle relocations in vxworks .tls_vars sections 2813 1.1 christos specially, because the dynamic loader is 'weird'. */ 2814 1.1 christos is_vxworks_tls = (htab->elf.target_os == is_vxworks 2815 1.1 christos && bfd_link_pic (info) 2816 1.1 christos && !strcmp (input_section->output_section->name, 2817 1.1 christos ".tls_vars")); 2818 1.1 christos 2819 1.1 christos rel = relocs; 2820 1.1 christos if (ABI_64_P (output_bfd)) 2821 1.1 christos num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (input_section)); 2822 1.1 christos else 2823 1.1 christos num_relocs = input_section->reloc_count; 2824 1.1 christos relend = relocs + num_relocs; 2825 1.1 christos for (; rel < relend; rel++) 2826 1.6 christos { 2827 1.1 christos int r_type, tls_type; 2828 1.1 christos reloc_howto_type *howto; 2829 1.1 christos unsigned long r_symndx; 2830 1.1 christos struct elf_link_hash_entry *h; 2831 1.8 christos struct _bfd_sparc_elf_link_hash_entry *eh; 2832 1.8 christos Elf_Internal_Sym *sym; 2833 1.8 christos asection *sec; 2834 1.8 christos bfd_vma relocation, off; 2835 1.1 christos bfd_reloc_status_type r; 2836 1.1 christos bool is_plt = false; 2837 1.1 christos bool unresolved_reloc; 2838 1.1 christos bool resolved_to_zero; 2839 1.1 christos bool relative_reloc; 2840 1.1 christos 2841 1.1 christos r_type = SPARC_ELF_R_TYPE (rel->r_info); 2842 1.1 christos if (r_type == R_SPARC_GNU_VTINHERIT 2843 1.1 christos || r_type == R_SPARC_GNU_VTENTRY) 2844 1.8 christos continue; 2845 1.1 christos 2846 1.6 christos if (r_type < 0 || r_type >= (int) R_SPARC_max_std) 2847 1.1 christos { 2848 1.1 christos bfd_set_error (bfd_error_bad_value); 2849 1.1 christos return false; 2850 1.1 christos } 2851 1.1 christos 2852 1.8 christos howto = _bfd_sparc_elf_howto_table + r_type; 2853 1.1 christos r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info); 2854 1.1 christos h = NULL; 2855 1.1 christos sym = NULL; 2856 1.1 christos sec = NULL; 2857 1.1 christos unresolved_reloc = false; 2858 1.1 christos if (r_symndx < symtab_hdr->sh_info) 2859 1.3 christos { 2860 1.1 christos sym = local_syms + r_symndx; 2861 1.1 christos sec = local_sections[r_symndx]; 2862 1.1 christos relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 2863 1.1 christos 2864 1.8 christos if (!bfd_link_relocatable (info) 2865 1.1 christos && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) 2866 1.1 christos { 2867 1.1 christos /* Relocate against local STT_GNU_IFUNC symbol. */ 2868 1.3 christos h = elf_sparc_get_local_sym_hash (htab, input_bfd, 2869 1.1 christos rel, false); 2870 1.1 christos if (h == NULL) 2871 1.1 christos abort (); 2872 1.1 christos 2873 1.1 christos /* Set STT_GNU_IFUNC symbol value. */ 2874 1.1 christos h->root.u.def.value = sym->st_value; 2875 1.8 christos h->root.u.def.section = sec; 2876 1.1 christos } 2877 1.1 christos } 2878 1.1 christos else 2879 1.1 christos { 2880 1.3 christos bool warned, ignored; 2881 1.1 christos 2882 1.1 christos RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 2883 1.1 christos r_symndx, symtab_hdr, sym_hashes, 2884 1.1 christos h, sec, relocation, 2885 1.1 christos unresolved_reloc, warned, ignored); 2886 1.1 christos if (warned) 2887 1.1 christos { 2888 1.1 christos /* To avoid generating warning messages about truncated 2889 1.1 christos relocations, set the relocation's address to be the same as 2890 1.1 christos the start of this section. */ 2891 1.1 christos if (input_section->output_section != NULL) 2892 1.1 christos relocation = input_section->output_section->vma; 2893 1.1 christos else 2894 1.1 christos relocation = 0; 2895 1.1 christos } 2896 1.1 christos } 2897 1.3 christos 2898 1.1 christos if (sec != NULL && discarded_section (sec)) 2899 1.1 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 2900 1.1 christos rel, 1, relend, howto, 0, contents); 2901 1.1 christos 2902 1.1 christos if (bfd_link_relocatable (info)) 2903 1.1 christos continue; 2904 1.1 christos 2905 1.1 christos if (h != NULL 2906 1.1 christos && h->type == STT_GNU_IFUNC 2907 1.1 christos && h->def_regular) 2908 1.1 christos { 2909 1.6 christos asection *plt_sec; 2910 1.6 christos const char *name; 2911 1.6 christos 2912 1.6 christos if ((input_section->flags & SEC_ALLOC) == 0 2913 1.6 christos || h->plt.offset == (bfd_vma) -1) 2914 1.8 christos { 2915 1.8 christos /* If this is a SHT_NOTE section without SHF_ALLOC, treat 2916 1.8 christos STT_GNU_IFUNC symbol as STT_FUNC. */ 2917 1.8 christos if (elf_section_type (input_section) == SHT_NOTE) 2918 1.8 christos goto skip_ifunc; 2919 1.8 christos 2920 1.8 christos /* Dynamic relocs are not propagated for SEC_DEBUGGING 2921 1.8 christos sections because such sections are not SEC_ALLOC and 2922 1.8 christos thus ld.so will not process them. */ 2923 1.8 christos if ((input_section->flags & SEC_ALLOC) == 0 2924 1.8 christos && (input_section->flags & SEC_DEBUGGING) != 0) 2925 1.8 christos continue; 2926 1.8 christos 2927 1.8 christos _bfd_error_handler 2928 1.8 christos /* xgettext:c-format */ 2929 1.8 christos (_("%pB(%pA+%#" PRIx64 "): " 2930 1.8 christos "unresolvable %s relocation against symbol `%s'"), 2931 1.8 christos input_bfd, 2932 1.8 christos input_section, 2933 1.6 christos (uint64_t) rel->r_offset, 2934 1.1 christos howto->name, 2935 1.1 christos h->root.root.string); 2936 1.1 christos bfd_set_error (bfd_error_bad_value); 2937 1.1 christos return false; 2938 1.1 christos } 2939 1.1 christos 2940 1.1 christos plt_sec = htab->elf.splt; 2941 1.1 christos if (! plt_sec) 2942 1.1 christos plt_sec =htab->elf.iplt; 2943 1.1 christos 2944 1.1 christos switch (r_type) 2945 1.1 christos { 2946 1.1 christos case R_SPARC_GOTDATA_OP: 2947 1.1 christos continue; 2948 1.1 christos 2949 1.1 christos case R_SPARC_GOTDATA_OP_HIX22: 2950 1.1 christos case R_SPARC_GOTDATA_OP_LOX10: 2951 1.1 christos r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22 2952 1.1 christos ? R_SPARC_GOT22 2953 1.1 christos : R_SPARC_GOT10); 2954 1.1 christos howto = _bfd_sparc_elf_howto_table + r_type; 2955 1.1 christos /* Fall through. */ 2956 1.1 christos 2957 1.1 christos case R_SPARC_GOT10: 2958 1.1 christos case R_SPARC_GOT13: 2959 1.1 christos case R_SPARC_GOT22: 2960 1.1 christos if (htab->elf.sgot == NULL) 2961 1.1 christos abort (); 2962 1.1 christos off = h->got.offset; 2963 1.1 christos if (off == (bfd_vma) -1) 2964 1.1 christos abort(); 2965 1.1 christos relocation = htab->elf.sgot->output_offset + off - got_base; 2966 1.1 christos goto do_relocation; 2967 1.1 christos 2968 1.1 christos case R_SPARC_WPLT30: 2969 1.1 christos case R_SPARC_WDISP30: 2970 1.1 christos relocation = (plt_sec->output_section->vma 2971 1.3 christos + plt_sec->output_offset + h->plt.offset); 2972 1.1 christos goto do_relocation; 2973 1.1 christos 2974 1.1 christos case R_SPARC_32: 2975 1.1 christos case R_SPARC_64: 2976 1.1 christos if (bfd_link_pic (info) && h->non_got_ref) 2977 1.1 christos { 2978 1.1 christos Elf_Internal_Rela outrel; 2979 1.1 christos bfd_vma offset; 2980 1.1 christos 2981 1.1 christos offset = _bfd_elf_section_offset (output_bfd, info, 2982 1.1 christos input_section, 2983 1.1 christos rel->r_offset); 2984 1.1 christos if (offset == (bfd_vma) -1 2985 1.1 christos || offset == (bfd_vma) -2) 2986 1.1 christos abort(); 2987 1.1 christos 2988 1.1 christos outrel.r_offset = (input_section->output_section->vma 2989 1.3 christos + input_section->output_offset 2990 1.1 christos + offset); 2991 1.1 christos 2992 1.1 christos if (h->dynindx == -1 2993 1.1 christos || h->forced_local 2994 1.1 christos || bfd_link_executable (info)) 2995 1.1 christos { 2996 1.1 christos outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 2997 1.1 christos 0, R_SPARC_IRELATIVE); 2998 1.1 christos outrel.r_addend = relocation + rel->r_addend; 2999 1.1 christos } 3000 1.1 christos else 3001 1.1 christos { 3002 1.1 christos if (h->dynindx == -1) 3003 1.1 christos abort(); 3004 1.1 christos outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type); 3005 1.1 christos outrel.r_addend = rel->r_addend; 3006 1.1 christos } 3007 1.1 christos 3008 1.1 christos sparc_elf_append_rela (output_bfd, sreloc, &outrel); 3009 1.1 christos continue; 3010 1.1 christos } 3011 1.1 christos 3012 1.1 christos relocation = (plt_sec->output_section->vma 3013 1.1 christos + plt_sec->output_offset + h->plt.offset); 3014 1.3 christos goto do_relocation; 3015 1.1 christos 3016 1.1 christos case R_SPARC_HI22: 3017 1.1 christos case R_SPARC_LO10: 3018 1.1 christos /* We should only see such relocs in static links. */ 3019 1.1 christos if (bfd_link_pic (info)) 3020 1.1 christos abort(); 3021 1.1 christos relocation = (plt_sec->output_section->vma 3022 1.1 christos + plt_sec->output_offset + h->plt.offset); 3023 1.1 christos goto do_relocation; 3024 1.1 christos 3025 1.1 christos default: 3026 1.6 christos if (h->root.root.string) 3027 1.6 christos name = h->root.root.string; 3028 1.6 christos else 3029 1.1 christos name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, 3030 1.1 christos NULL); 3031 1.9 christos _bfd_error_handler 3032 1.1 christos /* xgettext:c-format */ 3033 1.8 christos (_("%pB: relocation %s against STT_GNU_IFUNC " 3034 1.1 christos "symbol `%s' isn't handled by %s"), input_bfd, 3035 1.1 christos _bfd_sparc_elf_howto_table[r_type].name, 3036 1.1 christos name, __func__); 3037 1.6 christos bfd_set_error (bfd_error_bad_value); 3038 1.6 christos return false; 3039 1.6 christos } 3040 1.6 christos } 3041 1.1 christos 3042 1.1 christos skip_ifunc: 3043 1.1 christos eh = (struct _bfd_sparc_elf_link_hash_entry *) h; 3044 1.1 christos resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh); 3045 1.6 christos 3046 1.6 christos switch (r_type) 3047 1.6 christos { 3048 1.6 christos case R_SPARC_GOTDATA_OP_HIX22: 3049 1.6 christos case R_SPARC_GOTDATA_OP_LOX10: 3050 1.6 christos if (gdop_relative_offset_ok (info, h, relocation)) 3051 1.6 christos { 3052 1.1 christos r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22 3053 1.1 christos ? R_SPARC_GOTDATA_HIX22 3054 1.1 christos : R_SPARC_GOTDATA_LOX10); 3055 1.6 christos howto = _bfd_sparc_elf_howto_table + r_type; 3056 1.1 christos } 3057 1.1 christos break; 3058 1.1 christos 3059 1.1 christos case R_SPARC_GOTDATA_OP: 3060 1.1 christos if (gdop_relative_offset_ok (info, h, relocation)) 3061 1.1 christos { 3062 1.6 christos bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset); 3063 1.6 christos 3064 1.6 christos /* {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd */ 3065 1.6 christos relocation = 0x80000000 | (insn & 0x3e07c01f); 3066 1.6 christos bfd_put_32 (output_bfd, relocation, contents + rel->r_offset); 3067 1.6 christos 3068 1.6 christos /* If the symbol is global but not dynamic, an .rela.* slot has 3069 1.6 christos been allocated for it in the GOT so output R_SPARC_NONE here, 3070 1.6 christos if it isn't also subject to another, old-style GOT relocation. 3071 1.6 christos See also the handling of these GOT relocations just below. */ 3072 1.6 christos if (h != NULL 3073 1.6 christos && h->dynindx == -1 3074 1.6 christos && !h->forced_local 3075 1.6 christos && h->root.type != bfd_link_hash_undefweak 3076 1.6 christos && !eh->has_old_style_got_reloc 3077 1.6 christos && (h->got.offset & 1) == 0 3078 1.6 christos && bfd_link_pic (info)) 3079 1.6 christos { 3080 1.6 christos asection *s = htab->elf.srelgot; 3081 1.6 christos Elf_Internal_Rela outrel; 3082 1.6 christos 3083 1.6 christos BFD_ASSERT (s != NULL); 3084 1.1 christos 3085 1.1 christos memset (&outrel, 0, sizeof outrel); 3086 1.1 christos sparc_elf_append_rela (output_bfd, s, &outrel); 3087 1.1 christos h->got.offset |= 1; 3088 1.1 christos } 3089 1.1 christos } 3090 1.1 christos continue; 3091 1.1 christos } 3092 1.1 christos 3093 1.1 christos switch (r_type) 3094 1.1 christos { 3095 1.6 christos case R_SPARC_GOTDATA_HIX22: 3096 1.6 christos case R_SPARC_GOTDATA_LOX10: 3097 1.1 christos relocation = gdopoff (info, relocation); 3098 1.1 christos break; 3099 1.1 christos 3100 1.1 christos case R_SPARC_GOTDATA_OP_HIX22: 3101 1.1 christos case R_SPARC_GOTDATA_OP_LOX10: 3102 1.1 christos case R_SPARC_GOT10: 3103 1.1 christos case R_SPARC_GOT13: 3104 1.1 christos case R_SPARC_GOT22: 3105 1.8 christos /* Relocation is to the entry for this symbol in the global 3106 1.1 christos offset table. */ 3107 1.1 christos if (htab->elf.sgot == NULL) 3108 1.8 christos abort (); 3109 1.1 christos 3110 1.1 christos relative_reloc = false; 3111 1.1 christos if (h != NULL) 3112 1.1 christos { 3113 1.1 christos bool dyn; 3114 1.3 christos 3115 1.3 christos off = h->got.offset; 3116 1.3 christos BFD_ASSERT (off != (bfd_vma) -1); 3117 1.3 christos dyn = elf_hash_table (info)->dynamic_sections_created; 3118 1.1 christos 3119 1.1 christos if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 3120 1.1 christos bfd_link_pic (info), 3121 1.1 christos h) 3122 1.1 christos || (bfd_link_pic (info) 3123 1.1 christos && SYMBOL_REFERENCES_LOCAL (info, h))) 3124 1.1 christos { 3125 1.1 christos /* This is actually a static link, or it is a 3126 1.1 christos -Bsymbolic link and the symbol is defined 3127 1.1 christos locally, or the symbol was forced to be local 3128 1.1 christos because of a version file. We must initialize 3129 1.1 christos this entry in the global offset table. Since the 3130 1.1 christos offset must always be a multiple of 8 for 64-bit 3131 1.1 christos and 4 for 32-bit, we use the least significant bit 3132 1.1 christos to record whether we have initialized it already. 3133 1.1 christos 3134 1.1 christos When doing a dynamic link, we create a .rela.got 3135 1.1 christos relocation entry to initialize the value. This 3136 1.6 christos is done in the finish_dynamic_symbol routine. */ 3137 1.6 christos if ((off & 1) != 0) 3138 1.6 christos off &= ~1; 3139 1.6 christos else 3140 1.6 christos { 3141 1.6 christos /* If this symbol isn't dynamic in PIC mode, treat it 3142 1.8 christos like a local symbol in PIC mode below. */ 3143 1.6 christos if (h->dynindx == -1 3144 1.6 christos && !h->forced_local 3145 1.6 christos && h->root.type != bfd_link_hash_undefweak 3146 1.1 christos && bfd_link_pic (info)) 3147 1.1 christos relative_reloc = true; 3148 1.1 christos else 3149 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, relocation, 3150 1.8 christos htab->elf.sgot->contents + off); 3151 1.1 christos h->got.offset |= 1; 3152 1.1 christos } 3153 1.1 christos } 3154 1.1 christos else 3155 1.1 christos unresolved_reloc = false; 3156 1.1 christos } 3157 1.1 christos else 3158 1.1 christos { 3159 1.1 christos BFD_ASSERT (local_got_offsets != NULL 3160 1.1 christos && local_got_offsets[r_symndx] != (bfd_vma) -1); 3161 1.1 christos 3162 1.1 christos off = local_got_offsets[r_symndx]; 3163 1.1 christos 3164 1.1 christos /* The offset must always be a multiple of 8 on 64-bit and 3165 1.1 christos 4 on 32-bit. We use the least significant bit to record 3166 1.6 christos whether we have already processed this entry. */ 3167 1.6 christos if ((off & 1) != 0) 3168 1.6 christos off &= ~1; 3169 1.8 christos else 3170 1.6 christos { 3171 1.6 christos /* For a local symbol in PIC mode, we need to generate a 3172 1.6 christos R_SPARC_RELATIVE reloc for the dynamic linker. */ 3173 1.6 christos if (bfd_link_pic (info)) 3174 1.6 christos relative_reloc = true; 3175 1.6 christos else 3176 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, relocation, 3177 1.6 christos htab->elf.sgot->contents + off); 3178 1.6 christos local_got_offsets[r_symndx] |= 1; 3179 1.6 christos } 3180 1.6 christos } 3181 1.1 christos 3182 1.6 christos if (relative_reloc) 3183 1.1 christos { 3184 1.6 christos asection *s = htab->elf.srelgot; 3185 1.6 christos Elf_Internal_Rela outrel; 3186 1.6 christos 3187 1.6 christos BFD_ASSERT (s != NULL); 3188 1.6 christos 3189 1.6 christos outrel.r_offset = (htab->elf.sgot->output_section->vma 3190 1.6 christos + htab->elf.sgot->output_offset 3191 1.6 christos + off); 3192 1.6 christos outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 3193 1.6 christos 0, R_SPARC_RELATIVE); 3194 1.6 christos outrel.r_addend = relocation; 3195 1.6 christos sparc_elf_append_rela (output_bfd, s, &outrel); 3196 1.6 christos /* Versions of glibc ld.so at least up to 2.26 wrongly 3197 1.6 christos add the section contents to the value calculated for 3198 1.1 christos a RELATIVE reloc. Zero the contents to work around 3199 1.6 christos this bug. */ 3200 1.1 christos relocation = 0; 3201 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, relocation, 3202 1.1 christos htab->elf.sgot->contents + off); 3203 1.1 christos } 3204 1.1 christos 3205 1.1 christos relocation = htab->elf.sgot->output_offset + off - got_base; 3206 1.1 christos break; 3207 1.1 christos 3208 1.1 christos case R_SPARC_PLT32: 3209 1.1 christos case R_SPARC_PLT64: 3210 1.1 christos if (h == NULL || h->plt.offset == (bfd_vma) -1) 3211 1.1 christos { 3212 1.1 christos r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64; 3213 1.1 christos goto r_sparc_plt32; 3214 1.1 christos } 3215 1.1 christos /* Fall through. */ 3216 1.1 christos 3217 1.1 christos case R_SPARC_WPLT30: 3218 1.1 christos case R_SPARC_HIPLT22: 3219 1.1 christos case R_SPARC_LOPLT10: 3220 1.1 christos case R_SPARC_PCPLT32: 3221 1.1 christos case R_SPARC_PCPLT22: 3222 1.1 christos case R_SPARC_PCPLT10: 3223 1.1 christos r_sparc_wplt30: 3224 1.1 christos /* Relocation is to the entry for this symbol in the 3225 1.1 christos procedure linkage table. */ 3226 1.1 christos 3227 1.1 christos if (! ABI_64_P (output_bfd)) 3228 1.1 christos { 3229 1.1 christos /* The Solaris native assembler will generate a WPLT30 reloc 3230 1.1 christos for a local symbol if you assemble a call from one 3231 1.3 christos section to another when using -K pic. We treat it as 3232 1.1 christos WDISP30. */ 3233 1.1 christos if (h == NULL) 3234 1.1 christos break; 3235 1.1 christos } 3236 1.1 christos /* PR 7027: We need similar behaviour for 64-bit binaries. */ 3237 1.1 christos else if (r_type == R_SPARC_WPLT30 && h == NULL) 3238 1.1 christos break; 3239 1.1 christos else 3240 1.1 christos { 3241 1.1 christos BFD_ASSERT (h != NULL); 3242 1.1 christos } 3243 1.1 christos 3244 1.1 christos if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL) 3245 1.1 christos { 3246 1.1 christos /* We didn't make a PLT entry for this symbol. This 3247 1.1 christos happens when statically linking PIC code, or when 3248 1.1 christos using -Bsymbolic. */ 3249 1.1 christos break; 3250 1.8 christos } 3251 1.1 christos 3252 1.1 christos relocation = (htab->elf.splt->output_section->vma 3253 1.1 christos + htab->elf.splt->output_offset 3254 1.8 christos + h->plt.offset); 3255 1.1 christos unresolved_reloc = false; 3256 1.1 christos if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64) 3257 1.1 christos { 3258 1.1 christos r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64; 3259 1.1 christos is_plt = true; 3260 1.1 christos goto r_sparc_plt32; 3261 1.1 christos } 3262 1.1 christos break; 3263 1.1 christos 3264 1.10 christos case R_SPARC_PC10: 3265 1.1 christos case R_SPARC_PC22: 3266 1.1 christos case R_SPARC_PC_HH22: 3267 1.1 christos case R_SPARC_PC_HM10: 3268 1.1 christos case R_SPARC_PC_LM22: 3269 1.1 christos if (h != NULL && h == htab->elf.hgot) 3270 1.1 christos break; 3271 1.1 christos /* Fall through. */ 3272 1.1 christos case R_SPARC_DISP8: 3273 1.1 christos case R_SPARC_DISP16: 3274 1.1 christos case R_SPARC_DISP32: 3275 1.1 christos case R_SPARC_DISP64: 3276 1.1 christos case R_SPARC_WDISP30: 3277 1.1 christos case R_SPARC_WDISP22: 3278 1.1 christos case R_SPARC_WDISP19: 3279 1.1 christos case R_SPARC_WDISP16: 3280 1.1 christos case R_SPARC_WDISP10: 3281 1.1 christos case R_SPARC_8: 3282 1.1 christos case R_SPARC_16: 3283 1.1 christos case R_SPARC_32: 3284 1.1 christos case R_SPARC_HI22: 3285 1.1 christos case R_SPARC_22: 3286 1.1 christos case R_SPARC_13: 3287 1.1 christos case R_SPARC_LO10: 3288 1.1 christos case R_SPARC_UA16: 3289 1.1 christos case R_SPARC_UA32: 3290 1.1 christos case R_SPARC_10: 3291 1.1 christos case R_SPARC_11: 3292 1.1 christos case R_SPARC_64: 3293 1.1 christos case R_SPARC_OLO10: 3294 1.1 christos case R_SPARC_HH22: 3295 1.1 christos case R_SPARC_HM10: 3296 1.1 christos case R_SPARC_LM22: 3297 1.1 christos case R_SPARC_7: 3298 1.1 christos case R_SPARC_5: 3299 1.1 christos case R_SPARC_6: 3300 1.1 christos case R_SPARC_HIX22: 3301 1.1 christos case R_SPARC_LOX10: 3302 1.1 christos case R_SPARC_H44: 3303 1.6 christos case R_SPARC_M44: 3304 1.1 christos case R_SPARC_L44: 3305 1.1 christos case R_SPARC_H34: 3306 1.6 christos case R_SPARC_UA64: 3307 1.6 christos r_sparc_plt32: 3308 1.6 christos if ((input_section->flags & SEC_ALLOC) == 0 || is_vxworks_tls) 3309 1.3 christos break; 3310 1.1 christos 3311 1.6 christos /* Copy dynamic function pointer relocations. Don't generate 3312 1.6 christos dynamic relocations against resolved undefined weak symbols 3313 1.6 christos in PIE. */ 3314 1.1 christos if ((bfd_link_pic (info) 3315 1.1 christos && (h == NULL 3316 1.3 christos || !(h->root.type == bfd_link_hash_undefweak 3317 1.1 christos && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 3318 1.1 christos || resolved_to_zero))) 3319 1.1 christos && (! howto->pc_relative 3320 1.1 christos || !SYMBOL_CALLS_LOCAL (info, h))) 3321 1.1 christos || (!bfd_link_pic (info) 3322 1.6 christos && h != NULL 3323 1.6 christos && h->dynindx != -1 3324 1.1 christos && !h->non_got_ref 3325 1.1 christos && ((h->def_dynamic 3326 1.1 christos && !h->def_regular) 3327 1.8 christos || (h->root.type == bfd_link_hash_undefweak 3328 1.1 christos && !resolved_to_zero) 3329 1.1 christos || h->root.type == bfd_link_hash_undefined))) 3330 1.1 christos { 3331 1.1 christos Elf_Internal_Rela outrel; 3332 1.1 christos bool skip, relocate = false; 3333 1.1 christos 3334 1.1 christos /* When generating a shared object, these relocations 3335 1.8 christos are copied into the output file to be resolved at run 3336 1.1 christos time. */ 3337 1.1 christos 3338 1.1 christos BFD_ASSERT (sreloc != NULL); 3339 1.1 christos 3340 1.1 christos skip = false; 3341 1.8 christos 3342 1.1 christos outrel.r_offset = 3343 1.8 christos _bfd_elf_section_offset (output_bfd, info, input_section, 3344 1.1 christos rel->r_offset); 3345 1.1 christos if (outrel.r_offset == (bfd_vma) -1) 3346 1.1 christos skip = true; 3347 1.1 christos else if (outrel.r_offset == (bfd_vma) -2) 3348 1.1 christos skip = true, relocate = true; 3349 1.1 christos outrel.r_offset += (input_section->output_section->vma 3350 1.1 christos + input_section->output_offset); 3351 1.1 christos 3352 1.1 christos /* Optimize unaligned reloc usage now that we know where 3353 1.1 christos it finally resides. */ 3354 1.1 christos switch (r_type) 3355 1.1 christos { 3356 1.1 christos case R_SPARC_16: 3357 1.1 christos if (outrel.r_offset & 1) 3358 1.1 christos r_type = R_SPARC_UA16; 3359 1.1 christos break; 3360 1.1 christos case R_SPARC_UA16: 3361 1.1 christos if (!(outrel.r_offset & 1)) 3362 1.1 christos r_type = R_SPARC_16; 3363 1.1 christos break; 3364 1.1 christos case R_SPARC_32: 3365 1.1 christos if (outrel.r_offset & 3) 3366 1.1 christos r_type = R_SPARC_UA32; 3367 1.1 christos break; 3368 1.1 christos case R_SPARC_UA32: 3369 1.1 christos if (!(outrel.r_offset & 3)) 3370 1.1 christos r_type = R_SPARC_32; 3371 1.1 christos break; 3372 1.1 christos case R_SPARC_64: 3373 1.1 christos if (outrel.r_offset & 7) 3374 1.1 christos r_type = R_SPARC_UA64; 3375 1.6 christos break; 3376 1.1 christos case R_SPARC_UA64: 3377 1.6 christos if (!(outrel.r_offset & 7)) 3378 1.6 christos r_type = R_SPARC_64; 3379 1.1 christos break; 3380 1.1 christos case R_SPARC_DISP8: 3381 1.1 christos case R_SPARC_DISP16: 3382 1.1 christos case R_SPARC_DISP32: 3383 1.1 christos case R_SPARC_DISP64: 3384 1.1 christos /* If the symbol is not dynamic, we should not keep 3385 1.8 christos a dynamic relocation. But an .rela.* slot has been 3386 1.1 christos allocated for it, output R_SPARC_NONE. 3387 1.1 christos FIXME: Add code tracking needed dynamic relocs as 3388 1.1 christos e.g. i386 has. */ 3389 1.1 christos if (h->dynindx == -1) 3390 1.1 christos skip = true, relocate = true; 3391 1.1 christos break; 3392 1.1 christos } 3393 1.3 christos 3394 1.3 christos if (skip) 3395 1.3 christos memset (&outrel, 0, sizeof outrel); 3396 1.3 christos /* h->dynindx may be -1 if the symbol was marked to 3397 1.1 christos become local. */ 3398 1.1 christos else if (h != NULL 3399 1.1 christos && h->dynindx != -1 3400 1.1 christos && (_bfd_sparc_elf_howto_table[r_type].pc_relative 3401 1.1 christos || !bfd_link_pic (info) 3402 1.1 christos || !SYMBOLIC_BIND (info, h) 3403 1.1 christos || !h->def_regular)) 3404 1.1 christos { 3405 1.5 christos outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type); 3406 1.5 christos outrel.r_addend = rel->r_addend; 3407 1.1 christos } 3408 1.1 christos else 3409 1.1 christos { 3410 1.1 christos if ( (!ABI_64_P (output_bfd) && r_type == R_SPARC_32) 3411 1.1 christos || (ABI_64_P (output_bfd) && r_type == R_SPARC_64)) 3412 1.1 christos { 3413 1.1 christos outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 3414 1.1 christos 0, R_SPARC_RELATIVE); 3415 1.1 christos outrel.r_addend = relocation + rel->r_addend; 3416 1.1 christos } 3417 1.1 christos else 3418 1.1 christos { 3419 1.1 christos long indx; 3420 1.1 christos 3421 1.1 christos outrel.r_addend = relocation + rel->r_addend; 3422 1.1 christos 3423 1.1 christos if (is_plt) 3424 1.1 christos sec = htab->elf.splt; 3425 1.1 christos 3426 1.8 christos if (bfd_is_abs_section (sec)) 3427 1.1 christos indx = 0; 3428 1.1 christos else if (sec == NULL || sec->owner == NULL) 3429 1.1 christos { 3430 1.1 christos bfd_set_error (bfd_error_bad_value); 3431 1.1 christos return false; 3432 1.1 christos } 3433 1.1 christos else 3434 1.1 christos { 3435 1.1 christos asection *osec; 3436 1.1 christos 3437 1.1 christos /* We are turning this relocation into one 3438 1.1 christos against a section symbol. It would be 3439 1.1 christos proper to subtract the symbol's value, 3440 1.1 christos osec->vma, from the emitted reloc addend, 3441 1.1 christos but ld.so expects buggy relocs. */ 3442 1.1 christos osec = sec->output_section; 3443 1.1 christos indx = elf_section_data (osec)->dynindx; 3444 1.1 christos 3445 1.1 christos if (indx == 0) 3446 1.1 christos { 3447 1.1 christos osec = htab->elf.text_index_section; 3448 1.1 christos indx = elf_section_data (osec)->dynindx; 3449 1.1 christos } 3450 1.1 christos 3451 1.6 christos /* FIXME: we really should be able to link non-pic 3452 1.6 christos shared libraries. */ 3453 1.1 christos if (indx == 0) 3454 1.1 christos { 3455 1.8 christos BFD_FAIL (); 3456 1.1 christos _bfd_error_handler 3457 1.1 christos (_("%pB: probably compiled without -fPIC?"), 3458 1.1 christos input_bfd); 3459 1.1 christos bfd_set_error (bfd_error_bad_value); 3460 1.1 christos return false; 3461 1.1 christos } 3462 1.1 christos } 3463 1.1 christos 3464 1.1 christos outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx, 3465 1.1 christos r_type); 3466 1.1 christos } 3467 1.1 christos } 3468 1.1 christos 3469 1.1 christos sparc_elf_append_rela (output_bfd, sreloc, &outrel); 3470 1.1 christos 3471 1.1 christos /* This reloc will be computed at runtime, so there's no 3472 1.1 christos need to do anything now. */ 3473 1.1 christos if (! relocate) 3474 1.1 christos continue; 3475 1.1 christos } 3476 1.1 christos break; 3477 1.6 christos 3478 1.6 christos case R_SPARC_TLS_GD_HI22: 3479 1.6 christos case R_SPARC_TLS_GD_LO10: 3480 1.6 christos case R_SPARC_TLS_IE_HI22: 3481 1.6 christos case R_SPARC_TLS_IE_LO10: 3482 1.6 christos r_type = sparc_elf_tls_transition (info, input_bfd, r_type, 3483 1.6 christos h == NULL || h->dynindx == -1); 3484 1.1 christos if (r_type == R_SPARC_REV32) 3485 1.1 christos break; 3486 1.1 christos if (h != NULL) 3487 1.1 christos tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type; 3488 1.5 christos else if (local_got_offsets) 3489 1.3 christos tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx]; 3490 1.3 christos else if (h != NULL) 3491 1.1 christos { 3492 1.1 christos tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type; 3493 1.1 christos if (!bfd_link_dll (info) 3494 1.1 christos && h->dynindx == -1 3495 1.1 christos && tls_type == GOT_TLS_IE) 3496 1.1 christos switch (SPARC_ELF_R_TYPE (rel->r_info)) 3497 1.1 christos { 3498 1.1 christos case R_SPARC_TLS_GD_HI22: 3499 1.1 christos case R_SPARC_TLS_IE_HI22: 3500 1.1 christos r_type = R_SPARC_TLS_LE_HIX22; 3501 1.1 christos break; 3502 1.6 christos default: 3503 1.6 christos r_type = R_SPARC_TLS_LE_LOX10; 3504 1.1 christos break; 3505 1.1 christos } 3506 1.1 christos } 3507 1.1 christos else 3508 1.1 christos tls_type = GOT_UNKNOWN; 3509 1.1 christos if (tls_type == GOT_TLS_IE) 3510 1.1 christos switch (r_type) 3511 1.1 christos { 3512 1.1 christos case R_SPARC_TLS_GD_HI22: 3513 1.1 christos r_type = R_SPARC_TLS_IE_HI22; 3514 1.1 christos break; 3515 1.1 christos case R_SPARC_TLS_GD_LO10: 3516 1.1 christos r_type = R_SPARC_TLS_IE_LO10; 3517 1.1 christos break; 3518 1.1 christos } 3519 1.1 christos 3520 1.1 christos if (r_type == R_SPARC_TLS_LE_HIX22) 3521 1.1 christos { 3522 1.1 christos relocation = tpoff (info, relocation); 3523 1.1 christos break; 3524 1.1 christos } 3525 1.1 christos if (r_type == R_SPARC_TLS_LE_LOX10) 3526 1.1 christos { 3527 1.1 christos /* Change add into xor. */ 3528 1.1 christos relocation = tpoff (info, relocation); 3529 1.1 christos bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd, 3530 1.1 christos contents + rel->r_offset) 3531 1.1 christos | 0x80182000), contents + rel->r_offset); 3532 1.1 christos break; 3533 1.1 christos } 3534 1.1 christos 3535 1.1 christos if (h != NULL) 3536 1.1 christos { 3537 1.1 christos off = h->got.offset; 3538 1.1 christos h->got.offset |= 1; 3539 1.1 christos } 3540 1.1 christos else 3541 1.1 christos { 3542 1.1 christos BFD_ASSERT (local_got_offsets != NULL); 3543 1.1 christos off = local_got_offsets[r_symndx]; 3544 1.1 christos local_got_offsets[r_symndx] |= 1; 3545 1.1 christos } 3546 1.1 christos 3547 1.1 christos r_sparc_tlsldm: 3548 1.1 christos if (htab->elf.sgot == NULL) 3549 1.1 christos abort (); 3550 1.1 christos 3551 1.1 christos if ((off & 1) != 0) 3552 1.1 christos off &= ~1; 3553 1.1 christos else 3554 1.1 christos { 3555 1.1 christos Elf_Internal_Rela outrel; 3556 1.1 christos int dr_type, indx; 3557 1.1 christos 3558 1.1 christos if (htab->elf.srelgot == NULL) 3559 1.1 christos abort (); 3560 1.1 christos 3561 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, 0, 3562 1.1 christos htab->elf.sgot->contents + off); 3563 1.1 christos outrel.r_offset = (htab->elf.sgot->output_section->vma 3564 1.1 christos + htab->elf.sgot->output_offset + off); 3565 1.1 christos indx = h && h->dynindx != -1 ? h->dynindx : 0; 3566 1.1 christos if (r_type == R_SPARC_TLS_IE_HI22 3567 1.1 christos || r_type == R_SPARC_TLS_IE_LO10) 3568 1.1 christos dr_type = SPARC_ELF_TPOFF_RELOC (htab); 3569 1.1 christos else 3570 1.1 christos dr_type = SPARC_ELF_DTPMOD_RELOC (htab); 3571 1.1 christos if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0) 3572 1.1 christos outrel.r_addend = relocation - dtpoff_base (info); 3573 1.1 christos else 3574 1.1 christos outrel.r_addend = 0; 3575 1.1 christos outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type); 3576 1.1 christos sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel); 3577 1.1 christos 3578 1.6 christos if (r_type == R_SPARC_TLS_GD_HI22 3579 1.1 christos || r_type == R_SPARC_TLS_GD_LO10) 3580 1.1 christos { 3581 1.1 christos if (indx == 0) 3582 1.1 christos { 3583 1.1 christos BFD_ASSERT (! unresolved_reloc); 3584 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, 3585 1.1 christos relocation - dtpoff_base (info), 3586 1.1 christos (htab->elf.sgot->contents + off 3587 1.1 christos + SPARC_ELF_WORD_BYTES (htab))); 3588 1.1 christos } 3589 1.1 christos else 3590 1.1 christos { 3591 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, 0, 3592 1.1 christos (htab->elf.sgot->contents + off 3593 1.1 christos + SPARC_ELF_WORD_BYTES (htab))); 3594 1.1 christos outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, 3595 1.1 christos SPARC_ELF_DTPOFF_RELOC (htab)); 3596 1.1 christos outrel.r_offset += SPARC_ELF_WORD_BYTES (htab); 3597 1.1 christos sparc_elf_append_rela (output_bfd, htab->elf.srelgot, 3598 1.1 christos &outrel); 3599 1.1 christos } 3600 1.1 christos } 3601 1.1 christos else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab)) 3602 1.1 christos { 3603 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, 0, 3604 1.1 christos (htab->elf.sgot->contents + off 3605 1.1 christos + SPARC_ELF_WORD_BYTES (htab))); 3606 1.1 christos } 3607 1.1 christos } 3608 1.8 christos 3609 1.1 christos if (off >= (bfd_vma) -2) 3610 1.1 christos abort (); 3611 1.1 christos 3612 1.1 christos relocation = htab->elf.sgot->output_offset + off - got_base; 3613 1.1 christos unresolved_reloc = false; 3614 1.6 christos howto = _bfd_sparc_elf_howto_table + r_type; 3615 1.6 christos break; 3616 1.1 christos 3617 1.1 christos case R_SPARC_TLS_LDM_HI22: 3618 1.1 christos case R_SPARC_TLS_LDM_LO10: 3619 1.1 christos /* LD -> LE */ 3620 1.1 christos if (bfd_link_executable (info)) 3621 1.1 christos { 3622 1.1 christos bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset); 3623 1.1 christos continue; 3624 1.1 christos } 3625 1.1 christos off = htab->tls_ldm_got.offset; 3626 1.6 christos htab->tls_ldm_got.offset |= 1; 3627 1.6 christos goto r_sparc_tlsldm; 3628 1.6 christos 3629 1.6 christos case R_SPARC_TLS_LDO_HIX22: 3630 1.6 christos case R_SPARC_TLS_LDO_LOX10: 3631 1.6 christos /* LD -> LE */ 3632 1.6 christos if (bfd_link_executable (info)) 3633 1.6 christos { 3634 1.6 christos if (r_type == R_SPARC_TLS_LDO_HIX22) 3635 1.1 christos r_type = R_SPARC_TLS_LE_HIX22; 3636 1.1 christos else 3637 1.1 christos r_type = R_SPARC_TLS_LE_LOX10; 3638 1.1 christos } 3639 1.1 christos else 3640 1.1 christos { 3641 1.1 christos relocation -= dtpoff_base (info); 3642 1.1 christos break; 3643 1.6 christos } 3644 1.1 christos /* Fall through. */ 3645 1.1 christos 3646 1.6 christos case R_SPARC_TLS_LE_HIX22: 3647 1.6 christos case R_SPARC_TLS_LE_LOX10: 3648 1.6 christos if (!bfd_link_executable (info)) 3649 1.6 christos { 3650 1.1 christos Elf_Internal_Rela outrel; 3651 1.1 christos bfd_vma offset 3652 1.1 christos = _bfd_elf_section_offset (output_bfd, info, input_section, 3653 1.6 christos rel->r_offset); 3654 1.6 christos if (offset == (bfd_vma) -1 || offset == (bfd_vma) -2) 3655 1.6 christos memset (&outrel, 0, sizeof outrel); 3656 1.1 christos else 3657 1.6 christos { 3658 1.6 christos outrel.r_offset = offset 3659 1.1 christos + input_section->output_section->vma 3660 1.1 christos + input_section->output_offset; 3661 1.6 christos outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type); 3662 1.1 christos outrel.r_addend 3663 1.1 christos = relocation - dtpoff_base (info) + rel->r_addend; 3664 1.1 christos } 3665 1.1 christos 3666 1.1 christos BFD_ASSERT (sreloc != NULL); 3667 1.1 christos sparc_elf_append_rela (output_bfd, sreloc, &outrel); 3668 1.1 christos continue; 3669 1.6 christos } 3670 1.6 christos relocation = tpoff (info, relocation); 3671 1.1 christos break; 3672 1.1 christos 3673 1.1 christos case R_SPARC_TLS_LDM_CALL: 3674 1.1 christos /* LD -> LE */ 3675 1.1 christos if (bfd_link_executable (info)) 3676 1.1 christos { 3677 1.1 christos /* mov %g0, %o0 */ 3678 1.1 christos bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset); 3679 1.6 christos continue; 3680 1.6 christos } 3681 1.6 christos /* Fall through */ 3682 1.1 christos 3683 1.1 christos case R_SPARC_TLS_GD_CALL: 3684 1.1 christos if (h != NULL) 3685 1.6 christos tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type; 3686 1.6 christos else if (local_got_offsets) 3687 1.6 christos tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx]; 3688 1.6 christos else if (h != NULL) 3689 1.1 christos tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type; 3690 1.1 christos else 3691 1.1 christos tls_type = GOT_UNKNOWN; 3692 1.1 christos /* GD -> IE or LE */ 3693 1.1 christos if (bfd_link_executable (info) 3694 1.6 christos || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE)) 3695 1.6 christos { 3696 1.1 christos Elf_Internal_Rela *rel2; 3697 1.1 christos bfd_vma insn; 3698 1.1 christos 3699 1.1 christos /* GD -> LE */ 3700 1.1 christos if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1)) 3701 1.1 christos { 3702 1.1 christos bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset); 3703 1.1 christos continue; 3704 1.1 christos } 3705 1.1 christos 3706 1.1 christos /* GD -> IE */ 3707 1.1 christos if (rel + 1 < relend 3708 1.1 christos && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD 3709 1.1 christos && rel[1].r_offset == rel->r_offset + 4 3710 1.1 christos && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx 3711 1.1 christos && (((insn = bfd_get_32 (input_bfd, 3712 1.1 christos contents + rel[1].r_offset)) 3713 1.1 christos >> 25) & 0x1f) == 8) 3714 1.1 christos { 3715 1.1 christos /* We have 3716 1.1 christos call __tls_get_addr, %tgd_call(foo) 3717 1.1 christos add %reg1, %reg2, %o0, %tgd_add(foo) 3718 1.1 christos and change it into IE: 3719 1.1 christos {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo) 3720 1.1 christos add %g7, %o0, %o0, %tie_add(foo). 3721 1.1 christos add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2, 3722 1.1 christos ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2, 3723 1.1 christos ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2. */ 3724 1.1 christos bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000), 3725 1.1 christos contents + rel->r_offset); 3726 1.1 christos bfd_put_32 (output_bfd, 0x9001c008, 3727 1.1 christos contents + rel->r_offset + 4); 3728 1.1 christos rel++; 3729 1.1 christos continue; 3730 1.1 christos } 3731 1.1 christos 3732 1.1 christos /* We cannot just overwrite the delay slot instruction, 3733 1.1 christos as it might be what puts the %o0 argument to 3734 1.1 christos __tls_get_addr into place. So we have to transpose 3735 1.1 christos the delay slot with the add we patch in. */ 3736 1.1 christos insn = bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 3737 1.1 christos bfd_put_32 (output_bfd, insn, 3738 1.1 christos contents + rel->r_offset); 3739 1.1 christos bfd_put_32 (output_bfd, 0x9001c008, 3740 1.1 christos contents + rel->r_offset + 4); 3741 1.1 christos 3742 1.1 christos rel2 = rel; 3743 1.1 christos while ((rel2 = sparc_elf_find_reloc_at_ofs (rel2 + 1, relend, 3744 1.1 christos rel->r_offset + 4)) 3745 1.1 christos != NULL) 3746 1.1 christos { 3747 1.1 christos /* If the instruction we moved has a relocation attached to 3748 1.1 christos it, adjust the offset so that it will apply to the correct 3749 1.1 christos instruction. */ 3750 1.1 christos rel2->r_offset -= 4; 3751 1.8 christos } 3752 1.8 christos continue; 3753 1.1 christos } 3754 1.1 christos 3755 1.1 christos h = (struct elf_link_hash_entry *) 3756 1.1 christos bfd_link_hash_lookup (info->hash, "__tls_get_addr", false, 3757 1.1 christos false, true); 3758 1.1 christos BFD_ASSERT (h != NULL); 3759 1.6 christos r_type = R_SPARC_WPLT30; 3760 1.6 christos howto = _bfd_sparc_elf_howto_table + r_type; 3761 1.6 christos goto r_sparc_wplt30; 3762 1.1 christos 3763 1.6 christos case R_SPARC_TLS_GD_ADD: 3764 1.6 christos if (h != NULL) 3765 1.6 christos tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type; 3766 1.6 christos else if (local_got_offsets) 3767 1.1 christos tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx]; 3768 1.1 christos else 3769 1.1 christos tls_type = GOT_UNKNOWN; 3770 1.1 christos /* GD -> IE or LE */ 3771 1.1 christos if (bfd_link_executable (info) || tls_type == GOT_TLS_IE) 3772 1.1 christos { 3773 1.1 christos /* add %reg1, %reg2, %reg3, %tgd_add(foo) 3774 1.6 christos changed into IE: 3775 1.6 christos {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo) 3776 1.6 christos or LE: 3777 1.1 christos add %g7, %reg2, %reg3. */ 3778 1.1 christos bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset); 3779 1.1 christos if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1)) 3780 1.1 christos relocation = (insn & ~0x7c000) | 0x1c000; 3781 1.1 christos else 3782 1.1 christos relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000); 3783 1.6 christos bfd_put_32 (output_bfd, relocation, contents + rel->r_offset); 3784 1.6 christos } 3785 1.1 christos continue; 3786 1.1 christos 3787 1.1 christos case R_SPARC_TLS_LDM_ADD: 3788 1.1 christos /* LD -> LE */ 3789 1.6 christos if (bfd_link_executable (info)) 3790 1.6 christos bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset); 3791 1.1 christos continue; 3792 1.1 christos 3793 1.1 christos case R_SPARC_TLS_LDO_ADD: 3794 1.1 christos /* LD -> LE */ 3795 1.1 christos if (bfd_link_executable (info)) 3796 1.1 christos { 3797 1.1 christos /* Change rs1 into %g7. */ 3798 1.1 christos bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset); 3799 1.1 christos insn = (insn & ~0x7c000) | 0x1c000; 3800 1.1 christos bfd_put_32 (output_bfd, insn, contents + rel->r_offset); 3801 1.6 christos } 3802 1.6 christos continue; 3803 1.1 christos 3804 1.1 christos case R_SPARC_TLS_IE_LD: 3805 1.1 christos case R_SPARC_TLS_IE_LDX: 3806 1.1 christos /* IE -> LE */ 3807 1.1 christos if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1)) 3808 1.1 christos { 3809 1.1 christos bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset); 3810 1.1 christos int rs2 = insn & 0x1f; 3811 1.1 christos int rd = (insn >> 25) & 0x1f; 3812 1.1 christos 3813 1.1 christos if (rs2 == rd) 3814 1.1 christos relocation = SPARC_NOP; 3815 1.1 christos else 3816 1.1 christos relocation = 0x80100000 | (insn & 0x3e00001f); 3817 1.1 christos bfd_put_32 (output_bfd, relocation, contents + rel->r_offset); 3818 1.1 christos } 3819 1.1 christos continue; 3820 1.1 christos 3821 1.1 christos case R_SPARC_TLS_IE_ADD: 3822 1.1 christos /* Totally useless relocation. */ 3823 1.1 christos continue; 3824 1.1 christos 3825 1.1 christos case R_SPARC_TLS_DTPOFF32: 3826 1.1 christos case R_SPARC_TLS_DTPOFF64: 3827 1.1 christos relocation -= dtpoff_base (info); 3828 1.1 christos break; 3829 1.1 christos 3830 1.1 christos default: 3831 1.1 christos break; 3832 1.1 christos } 3833 1.1 christos 3834 1.1 christos /* Dynamic relocs are not propagated for SEC_DEBUGGING sections 3835 1.1 christos because such sections are not SEC_ALLOC and thus ld.so will 3836 1.1 christos not process them. */ 3837 1.6 christos if (unresolved_reloc 3838 1.6 christos && !((input_section->flags & SEC_DEBUGGING) != 0 3839 1.6 christos && h->def_dynamic) 3840 1.6 christos && _bfd_elf_section_offset (output_bfd, info, input_section, 3841 1.1 christos rel->r_offset) != (bfd_vma) -1) 3842 1.1 christos _bfd_error_handler 3843 1.6 christos /* xgettext:c-format */ 3844 1.1 christos (_("%pB(%pA+%#" PRIx64 "): " 3845 1.1 christos "unresolvable %s relocation against symbol `%s'"), 3846 1.1 christos input_bfd, 3847 1.1 christos input_section, 3848 1.1 christos (uint64_t) rel->r_offset, 3849 1.1 christos howto->name, 3850 1.1 christos h->root.root.string); 3851 1.1 christos 3852 1.1 christos r = bfd_reloc_continue; 3853 1.1 christos if (r_type == R_SPARC_OLO10) 3854 1.1 christos { 3855 1.1 christos bfd_vma x; 3856 1.1 christos 3857 1.1 christos if (! ABI_64_P (output_bfd)) 3858 1.1 christos abort (); 3859 1.1 christos 3860 1.1 christos relocation += rel->r_addend; 3861 1.1 christos relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info); 3862 1.1 christos 3863 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3864 1.1 christos x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff); 3865 1.1 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 3866 1.1 christos 3867 1.1 christos r = bfd_check_overflow (howto->complain_on_overflow, 3868 1.1 christos howto->bitsize, howto->rightshift, 3869 1.1 christos bfd_arch_bits_per_address (input_bfd), 3870 1.1 christos relocation); 3871 1.1 christos } 3872 1.1 christos else if (r_type == R_SPARC_WDISP16) 3873 1.1 christos { 3874 1.1 christos bfd_vma x; 3875 1.1 christos 3876 1.1 christos relocation += rel->r_addend; 3877 1.1 christos relocation -= (input_section->output_section->vma 3878 1.1 christos + input_section->output_offset); 3879 1.1 christos relocation -= rel->r_offset; 3880 1.1 christos 3881 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3882 1.1 christos x |= ((((relocation >> 2) & 0xc000) << 6) 3883 1.1 christos | ((relocation >> 2) & 0x3fff)); 3884 1.1 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 3885 1.1 christos 3886 1.1 christos r = bfd_check_overflow (howto->complain_on_overflow, 3887 1.1 christos howto->bitsize, howto->rightshift, 3888 1.1 christos bfd_arch_bits_per_address (input_bfd), 3889 1.1 christos relocation); 3890 1.1 christos } 3891 1.1 christos else if (r_type == R_SPARC_WDISP10) 3892 1.1 christos { 3893 1.1 christos bfd_vma x; 3894 1.1 christos 3895 1.1 christos relocation += rel->r_addend; 3896 1.1 christos relocation -= (input_section->output_section->vma 3897 1.1 christos + input_section->output_offset); 3898 1.1 christos relocation -= rel->r_offset; 3899 1.1 christos 3900 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3901 1.1 christos x |= ((((relocation >> 2) & 0x300) << 11) 3902 1.1 christos | (((relocation >> 2) & 0xff) << 5)); 3903 1.1 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 3904 1.1 christos 3905 1.1 christos r = bfd_check_overflow (howto->complain_on_overflow, 3906 1.1 christos howto->bitsize, howto->rightshift, 3907 1.1 christos bfd_arch_bits_per_address (input_bfd), 3908 1.1 christos relocation); 3909 1.1 christos } 3910 1.1 christos else if (r_type == R_SPARC_REV32) 3911 1.1 christos { 3912 1.1 christos bfd_vma x; 3913 1.1 christos 3914 1.1 christos relocation = relocation + rel->r_addend; 3915 1.1 christos 3916 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3917 1.1 christos x = x + relocation; 3918 1.1 christos bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset); 3919 1.1 christos r = bfd_reloc_ok; 3920 1.1 christos } 3921 1.1 christos else if (r_type == R_SPARC_TLS_LDO_HIX22 3922 1.1 christos || r_type == R_SPARC_TLS_LE_HIX22) 3923 1.1 christos { 3924 1.1 christos bfd_vma x; 3925 1.1 christos 3926 1.1 christos relocation += rel->r_addend; 3927 1.1 christos if (r_type == R_SPARC_TLS_LE_HIX22) 3928 1.1 christos relocation ^= MINUS_ONE; 3929 1.1 christos 3930 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3931 1.1 christos x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff); 3932 1.1 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 3933 1.1 christos r = bfd_reloc_ok; 3934 1.1 christos } 3935 1.1 christos else if (r_type == R_SPARC_TLS_LDO_LOX10 3936 1.1 christos || r_type == R_SPARC_TLS_LE_LOX10) 3937 1.1 christos { 3938 1.1 christos bfd_vma x; 3939 1.1 christos 3940 1.1 christos relocation += rel->r_addend; 3941 1.1 christos relocation &= 0x3ff; 3942 1.1 christos if (r_type == R_SPARC_TLS_LE_LOX10) 3943 1.1 christos relocation |= 0x1c00; 3944 1.1 christos 3945 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3946 1.1 christos x = (x & ~(bfd_vma) 0x1fff) | relocation; 3947 1.6 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 3948 1.6 christos 3949 1.1 christos r = bfd_reloc_ok; 3950 1.1 christos } 3951 1.1 christos else if (r_type == R_SPARC_HIX22 3952 1.1 christos || r_type == R_SPARC_GOTDATA_HIX22 3953 1.1 christos || r_type == R_SPARC_GOTDATA_OP_HIX22) 3954 1.1 christos { 3955 1.1 christos bfd_vma x; 3956 1.1 christos 3957 1.1 christos relocation += rel->r_addend; 3958 1.1 christos if (r_type == R_SPARC_HIX22 3959 1.1 christos || (bfd_signed_vma) relocation < 0) 3960 1.1 christos relocation = relocation ^ MINUS_ONE; 3961 1.1 christos 3962 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3963 1.1 christos x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff); 3964 1.1 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 3965 1.1 christos 3966 1.1 christos r = bfd_check_overflow (howto->complain_on_overflow, 3967 1.6 christos howto->bitsize, howto->rightshift, 3968 1.6 christos bfd_arch_bits_per_address (input_bfd), 3969 1.1 christos relocation); 3970 1.1 christos } 3971 1.1 christos else if (r_type == R_SPARC_LOX10 3972 1.1 christos || r_type == R_SPARC_GOTDATA_LOX10 3973 1.1 christos || r_type == R_SPARC_GOTDATA_OP_LOX10) 3974 1.1 christos { 3975 1.1 christos bfd_vma x; 3976 1.1 christos 3977 1.1 christos relocation += rel->r_addend; 3978 1.1 christos if (r_type == R_SPARC_LOX10 3979 1.1 christos || (bfd_signed_vma) relocation < 0) 3980 1.1 christos relocation = (relocation & 0x3ff) | 0x1c00; 3981 1.1 christos else 3982 1.1 christos relocation = (relocation & 0x3ff); 3983 1.1 christos 3984 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 3985 1.1 christos x = (x & ~(bfd_vma) 0x1fff) | relocation; 3986 1.1 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 3987 1.1 christos 3988 1.1 christos r = bfd_reloc_ok; 3989 1.1 christos } 3990 1.1 christos else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30) 3991 1.1 christos && sec_do_relax (input_section) 3992 1.1 christos && rel->r_offset + 4 < input_section->size) 3993 1.1 christos { 3994 1.1 christos #define G0 0 3995 1.1 christos #define O7 15 3996 1.1 christos #define XCC (2 << 20) 3997 1.1 christos #define COND(x) (((x)&0xf)<<25) 3998 1.1 christos #define CONDA COND(0x8) 3999 1.1 christos #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC) 4000 1.1 christos #define INSN_BA (F2(0,2) | CONDA) 4001 1.1 christos #define INSN_OR F3(2, 0x2, 0) 4002 1.1 christos #define INSN_NOP F2(0,4) 4003 1.1 christos 4004 1.1 christos bfd_vma x, y; 4005 1.1 christos 4006 1.1 christos /* If the instruction is a call with either: 4007 1.1 christos restore 4008 1.1 christos arithmetic instruction with rd == %o7 4009 1.1 christos where rs1 != %o7 and rs2 if it is register != %o7 4010 1.1 christos then we can optimize if the call destination is near 4011 1.1 christos by changing the call into a branch always. */ 4012 1.1 christos x = bfd_get_32 (input_bfd, contents + rel->r_offset); 4013 1.1 christos y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4); 4014 1.1 christos if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2)) 4015 1.1 christos { 4016 1.1 christos if (((y & OP3(~0)) == OP3(0x3d) /* restore */ 4017 1.1 christos || ((y & OP3(0x28)) == 0 /* arithmetic */ 4018 1.1 christos && (y & RD(~0)) == RD(O7))) 4019 1.1 christos && (y & RS1(~0)) != RS1(O7) 4020 1.1 christos && ((y & F3I(~0)) 4021 1.1 christos || (y & RS2(~0)) != RS2(O7))) 4022 1.1 christos { 4023 1.1 christos bfd_vma reloc; 4024 1.1 christos 4025 1.1 christos reloc = relocation + rel->r_addend - rel->r_offset; 4026 1.1 christos reloc -= (input_section->output_section->vma 4027 1.1 christos + input_section->output_offset); 4028 1.1 christos 4029 1.1 christos /* Ensure the branch fits into simm22. */ 4030 1.1 christos if ((reloc & 3) == 0 4031 1.1 christos && ((reloc & ~(bfd_vma)0x7fffff) == 0 4032 1.1 christos || ((reloc | 0x7fffff) == ~(bfd_vma)0))) 4033 1.1 christos { 4034 1.1 christos reloc >>= 2; 4035 1.1 christos 4036 1.1 christos /* Check whether it fits into simm19. */ 4037 1.1 christos if (((reloc & 0x3c0000) == 0 4038 1.1 christos || (reloc & 0x3c0000) == 0x3c0000) 4039 1.1 christos && (ABI_64_P (output_bfd) 4040 1.1 christos || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS)) 4041 1.1 christos x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */ 4042 1.1 christos else 4043 1.1 christos x = INSN_BA | (reloc & 0x3fffff); /* ba */ 4044 1.1 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset); 4045 1.1 christos r = bfd_reloc_ok; 4046 1.1 christos if (rel->r_offset >= 4 4047 1.1 christos && (y & (0xffffffff ^ RS1(~0))) 4048 1.1 christos == (INSN_OR | RD(O7) | RS2(G0))) 4049 1.1 christos { 4050 1.1 christos bfd_vma z; 4051 1.1 christos unsigned int reg; 4052 1.6 christos 4053 1.1 christos z = bfd_get_32 (input_bfd, 4054 1.1 christos contents + rel->r_offset - 4); 4055 1.1 christos if ((z & (0xffffffff ^ RD(~0))) 4056 1.1 christos != (INSN_OR | RS1(O7) | RS2(G0))) 4057 1.1 christos continue; 4058 1.1 christos 4059 1.1 christos /* The sequence was 4060 1.1 christos or %o7, %g0, %rN 4061 1.1 christos call foo 4062 1.1 christos or %rN, %g0, %o7 4063 1.1 christos 4064 1.1 christos If call foo was replaced with ba, replace 4065 1.6 christos or %rN, %g0, %o7 with nop. */ 4066 1.1 christos 4067 1.1 christos reg = (y & RS1(~0)) >> 14; 4068 1.1 christos if (reg != ((z & RD(~0)) >> 25) 4069 1.1 christos || reg == G0 || reg == O7) 4070 1.1 christos continue; 4071 1.1 christos 4072 1.1 christos bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP, 4073 1.1 christos contents + rel->r_offset + 4); 4074 1.1 christos } 4075 1.1 christos 4076 1.1 christos } 4077 1.1 christos } 4078 1.8 christos } 4079 1.1 christos } 4080 1.1 christos 4081 1.1 christos if (r == bfd_reloc_continue) 4082 1.1 christos { 4083 1.1 christos do_relocation: 4084 1.1 christos r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4085 1.1 christos contents, rel->r_offset, 4086 1.1 christos relocation, rel->r_addend); 4087 1.1 christos } 4088 1.1 christos if (r != bfd_reloc_ok) 4089 1.1 christos { 4090 1.1 christos switch (r) 4091 1.1 christos { 4092 1.1 christos default: 4093 1.1 christos case bfd_reloc_outofrange: 4094 1.3 christos abort (); 4095 1.1 christos case bfd_reloc_overflow: 4096 1.1 christos { 4097 1.1 christos const char *name; 4098 1.1 christos 4099 1.1 christos /* The Solaris native linker silently disregards overflows. 4100 1.1 christos We don't, but this breaks stabs debugging info, whose 4101 1.1 christos relocations are only 32-bits wide. Ignore overflows in 4102 1.7 christos this case and also for discarded entries. */ 4103 1.1 christos if ((r_type == R_SPARC_32 4104 1.1 christos || r_type == R_SPARC_UA32 4105 1.1 christos || r_type == R_SPARC_DISP32) 4106 1.1 christos && (((input_section->flags & SEC_DEBUGGING) != 0 4107 1.1 christos && strcmp (bfd_section_name (input_section), 4108 1.1 christos ".stab") == 0) 4109 1.1 christos || _bfd_elf_section_offset (output_bfd, info, 4110 1.1 christos input_section, 4111 1.1 christos rel->r_offset) 4112 1.1 christos == (bfd_vma)-1)) 4113 1.1 christos break; 4114 1.1 christos 4115 1.1 christos if (h != NULL) 4116 1.1 christos { 4117 1.1 christos /* Assume this is a call protected by other code that 4118 1.1 christos detect the symbol is undefined. If this is the case, 4119 1.1 christos we can safely ignore the overflow. If not, the 4120 1.1 christos program is hosed anyway, and a little warning isn't 4121 1.6 christos going to help. */ 4122 1.1 christos if (h->root.type == bfd_link_hash_undefweak 4123 1.1 christos && howto->pc_relative) 4124 1.1 christos break; 4125 1.1 christos 4126 1.1 christos name = NULL; 4127 1.1 christos } 4128 1.1 christos else 4129 1.8 christos { 4130 1.1 christos name = bfd_elf_string_from_elf_section (input_bfd, 4131 1.7 christos symtab_hdr->sh_link, 4132 1.1 christos sym->st_name); 4133 1.5 christos if (name == NULL) 4134 1.5 christos return false; 4135 1.5 christos if (*name == '\0') 4136 1.1 christos name = bfd_section_name (sec); 4137 1.1 christos } 4138 1.1 christos (*info->callbacks->reloc_overflow) 4139 1.1 christos (info, (h ? &h->root : NULL), name, howto->name, 4140 1.1 christos (bfd_vma) 0, input_bfd, input_section, rel->r_offset); 4141 1.1 christos } 4142 1.8 christos break; 4143 1.1 christos } 4144 1.1 christos } 4145 1.1 christos } 4146 1.1 christos 4147 1.1 christos return true; 4148 1.1 christos } 4149 1.1 christos 4150 1.1 christos /* Build a VxWorks PLT entry. PLT_INDEX is the index of the PLT entry 4151 1.1 christos and PLT_OFFSET is the byte offset from the start of .plt. GOT_OFFSET 4152 1.1 christos is the offset of the associated .got.plt entry from 4153 1.1 christos _GLOBAL_OFFSET_TABLE_. */ 4154 1.1 christos 4155 1.1 christos static void 4156 1.1 christos sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info, 4157 1.1 christos bfd_vma plt_offset, bfd_vma plt_index, 4158 1.1 christos bfd_vma got_offset) 4159 1.1 christos { 4160 1.1 christos bfd_vma got_base; 4161 1.1 christos const bfd_vma *plt_entry; 4162 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 4163 1.1 christos bfd_byte *loc; 4164 1.3 christos Elf_Internal_Rela rela; 4165 1.1 christos 4166 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 4167 1.1 christos BFD_ASSERT (htab != NULL); 4168 1.1 christos 4169 1.1 christos if (bfd_link_pic (info)) 4170 1.1 christos { 4171 1.1 christos plt_entry = sparc_vxworks_shared_plt_entry; 4172 1.1 christos got_base = 0; 4173 1.1 christos } 4174 1.1 christos else 4175 1.1 christos { 4176 1.1 christos plt_entry = sparc_vxworks_exec_plt_entry; 4177 1.1 christos got_base = (htab->elf.hgot->root.u.def.value 4178 1.1 christos + htab->elf.hgot->root.u.def.section->output_offset 4179 1.1 christos + htab->elf.hgot->root.u.def.section->output_section->vma); 4180 1.1 christos } 4181 1.1 christos 4182 1.1 christos /* Fill in the entry in the procedure linkage table. */ 4183 1.1 christos bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10), 4184 1.1 christos htab->elf.splt->contents + plt_offset); 4185 1.1 christos bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff), 4186 1.1 christos htab->elf.splt->contents + plt_offset + 4); 4187 1.1 christos bfd_put_32 (output_bfd, plt_entry[2], 4188 1.1 christos htab->elf.splt->contents + plt_offset + 8); 4189 1.1 christos bfd_put_32 (output_bfd, plt_entry[3], 4190 1.1 christos htab->elf.splt->contents + plt_offset + 12); 4191 1.1 christos bfd_put_32 (output_bfd, plt_entry[4], 4192 1.1 christos htab->elf.splt->contents + plt_offset + 16); 4193 1.1 christos bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10), 4194 1.1 christos htab->elf.splt->contents + plt_offset + 20); 4195 1.1 christos /* PC-relative displacement for a branch to the start of 4196 1.1 christos the PLT section. */ 4197 1.1 christos bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2) 4198 1.1 christos & 0x003fffff), 4199 1.1 christos htab->elf.splt->contents + plt_offset + 24); 4200 1.1 christos bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff), 4201 1.1 christos htab->elf.splt->contents + plt_offset + 28); 4202 1.1 christos 4203 1.1 christos /* Fill in the .got.plt entry, pointing initially at the 4204 1.1 christos second half of the PLT entry. */ 4205 1.1 christos BFD_ASSERT (htab->elf.sgotplt != NULL); 4206 1.1 christos bfd_put_32 (output_bfd, 4207 1.1 christos htab->elf.splt->output_section->vma 4208 1.3 christos + htab->elf.splt->output_offset 4209 1.1 christos + plt_offset + 20, 4210 1.1 christos htab->elf.sgotplt->contents + got_offset); 4211 1.1 christos 4212 1.1 christos /* Add relocations to .rela.plt.unloaded. */ 4213 1.1 christos if (!bfd_link_pic (info)) 4214 1.1 christos { 4215 1.1 christos loc = (htab->srelplt2->contents 4216 1.1 christos + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela)); 4217 1.1 christos 4218 1.1 christos /* Relocate the initial sethi. */ 4219 1.1 christos rela.r_offset = (htab->elf.splt->output_section->vma 4220 1.1 christos + htab->elf.splt->output_offset 4221 1.1 christos + plt_offset); 4222 1.1 christos rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22); 4223 1.1 christos rela.r_addend = got_offset; 4224 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 4225 1.1 christos loc += sizeof (Elf32_External_Rela); 4226 1.1 christos 4227 1.1 christos /* Likewise the following or. */ 4228 1.1 christos rela.r_offset += 4; 4229 1.1 christos rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10); 4230 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 4231 1.1 christos loc += sizeof (Elf32_External_Rela); 4232 1.1 christos 4233 1.1 christos /* Relocate the .got.plt entry. */ 4234 1.1 christos rela.r_offset = (htab->elf.sgotplt->output_section->vma 4235 1.1 christos + htab->elf.sgotplt->output_offset 4236 1.1 christos + got_offset); 4237 1.1 christos rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32); 4238 1.1 christos rela.r_addend = plt_offset + 20; 4239 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 4240 1.1 christos } 4241 1.8 christos } 4242 1.1 christos 4243 1.1 christos /* Finish up dynamic symbol handling. We set the contents of various 4244 1.1 christos dynamic sections here. */ 4245 1.1 christos 4246 1.1 christos bool 4247 1.1 christos _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd, 4248 1.1 christos struct bfd_link_info *info, 4249 1.6 christos struct elf_link_hash_entry *h, 4250 1.8 christos Elf_Internal_Sym *sym) 4251 1.1 christos { 4252 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 4253 1.1 christos const struct elf_backend_data *bed; 4254 1.1 christos struct _bfd_sparc_elf_link_hash_entry *eh; 4255 1.1 christos bool resolved_to_zero; 4256 1.6 christos 4257 1.6 christos htab = _bfd_sparc_elf_hash_table (info); 4258 1.6 christos BFD_ASSERT (htab != NULL); 4259 1.6 christos bed = get_elf_backend_data (output_bfd); 4260 1.6 christos 4261 1.6 christos eh = (struct _bfd_sparc_elf_link_hash_entry *) h; 4262 1.6 christos 4263 1.1 christos /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for 4264 1.1 christos resolved undefined weak symbols in executable so that their 4265 1.1 christos references have value 0 at run-time. */ 4266 1.1 christos resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh); 4267 1.1 christos 4268 1.1 christos if (h->plt.offset != (bfd_vma) -1) 4269 1.1 christos { 4270 1.1 christos asection *splt; 4271 1.1 christos asection *srela; 4272 1.1 christos Elf_Internal_Rela rela; 4273 1.1 christos bfd_byte *loc; 4274 1.1 christos bfd_vma r_offset, got_offset; 4275 1.1 christos int rela_index; 4276 1.1 christos 4277 1.1 christos /* When building a static executable, use .iplt and 4278 1.1 christos .rela.iplt sections for STT_GNU_IFUNC symbols. */ 4279 1.1 christos if (htab->elf.splt != NULL) 4280 1.1 christos { 4281 1.1 christos splt = htab->elf.splt; 4282 1.1 christos srela = htab->elf.srelplt; 4283 1.1 christos } 4284 1.1 christos else 4285 1.1 christos { 4286 1.1 christos splt = htab->elf.iplt; 4287 1.1 christos srela = htab->elf.irelplt; 4288 1.1 christos } 4289 1.8 christos 4290 1.1 christos if (splt == NULL || srela == NULL) 4291 1.1 christos abort (); 4292 1.1 christos 4293 1.1 christos /* Fill in the entry in the .rela.plt section. */ 4294 1.1 christos if (htab->elf.target_os == is_vxworks) 4295 1.1 christos { 4296 1.1 christos /* Work out the index of this PLT entry. */ 4297 1.1 christos rela_index = ((h->plt.offset - htab->plt_header_size) 4298 1.1 christos / htab->plt_entry_size); 4299 1.1 christos 4300 1.1 christos /* Calculate the offset of the associated .got.plt entry. 4301 1.1 christos The first three entries are reserved. */ 4302 1.1 christos got_offset = (rela_index + 3) * 4; 4303 1.1 christos 4304 1.1 christos sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset, 4305 1.1 christos rela_index, got_offset); 4306 1.1 christos 4307 1.1 christos 4308 1.1 christos /* On VxWorks, the relocation points to the .got.plt entry, 4309 1.1 christos not the .plt entry. */ 4310 1.1 christos rela.r_offset = (htab->elf.sgotplt->output_section->vma 4311 1.1 christos + htab->elf.sgotplt->output_offset 4312 1.1 christos + got_offset); 4313 1.1 christos rela.r_addend = 0; 4314 1.8 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, 4315 1.1 christos R_SPARC_JMP_SLOT); 4316 1.1 christos } 4317 1.1 christos else 4318 1.1 christos { 4319 1.1 christos bool ifunc = false; 4320 1.1 christos 4321 1.1 christos /* Fill in the entry in the procedure linkage table. */ 4322 1.1 christos rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt, 4323 1.3 christos h->plt.offset, splt->size, 4324 1.1 christos &r_offset); 4325 1.1 christos 4326 1.1 christos if (h == NULL 4327 1.1 christos || h->dynindx == -1 4328 1.8 christos || ((bfd_link_executable (info) 4329 1.1 christos || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 4330 1.1 christos && h->def_regular 4331 1.1 christos && h->type == STT_GNU_IFUNC)) 4332 1.1 christos { 4333 1.1 christos ifunc = true; 4334 1.1 christos BFD_ASSERT (h == NULL 4335 1.1 christos || (h->type == STT_GNU_IFUNC 4336 1.1 christos && h->def_regular 4337 1.1 christos && (h->root.type == bfd_link_hash_defined 4338 1.1 christos || h->root.type == bfd_link_hash_defweak))); 4339 1.1 christos } 4340 1.1 christos 4341 1.1 christos rela.r_offset = r_offset 4342 1.1 christos + (splt->output_section->vma + splt->output_offset); 4343 1.1 christos if (ABI_64_P (output_bfd) 4344 1.1 christos && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)) 4345 1.1 christos { 4346 1.1 christos if (ifunc) 4347 1.1 christos { 4348 1.1 christos rela.r_addend = (h->root.u.def.section->output_section->vma 4349 1.1 christos + h->root.u.def.section->output_offset 4350 1.1 christos + h->root.u.def.value); 4351 1.1 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, 4352 1.1 christos R_SPARC_IRELATIVE); 4353 1.1 christos } 4354 1.1 christos else 4355 1.1 christos { 4356 1.1 christos rela.r_addend = (-(h->plt.offset + 4) 4357 1.1 christos - splt->output_section->vma 4358 1.1 christos - splt->output_offset); 4359 1.1 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, 4360 1.1 christos R_SPARC_JMP_SLOT); 4361 1.1 christos } 4362 1.1 christos } 4363 1.1 christos else 4364 1.1 christos { 4365 1.1 christos if (ifunc) 4366 1.1 christos { 4367 1.1 christos rela.r_addend = (h->root.u.def.section->output_section->vma 4368 1.1 christos + h->root.u.def.section->output_offset 4369 1.1 christos + h->root.u.def.value); 4370 1.1 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, 4371 1.1 christos R_SPARC_JMP_IREL); 4372 1.1 christos } 4373 1.1 christos else 4374 1.1 christos { 4375 1.1 christos rela.r_addend = 0; 4376 1.1 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, 4377 1.1 christos R_SPARC_JMP_SLOT); 4378 1.1 christos } 4379 1.1 christos } 4380 1.1 christos } 4381 1.1 christos 4382 1.1 christos /* Adjust for the first 4 reserved elements in the .plt section 4383 1.1 christos when setting the offset in the .rela.plt section. 4384 1.1 christos Sun forgot to read their own ABI and copied elf32-sparc behaviour, 4385 1.1 christos thus .plt[4] has corresponding .rela.plt[0] and so on. */ 4386 1.6 christos 4387 1.1 christos loc = srela->contents; 4388 1.1 christos loc += rela_index * bed->s->sizeof_rela; 4389 1.1 christos bed->s->swap_reloca_out (output_bfd, &rela, loc); 4390 1.1 christos 4391 1.1 christos if (!resolved_to_zero && !h->def_regular) 4392 1.1 christos { 4393 1.1 christos /* Mark the symbol as undefined, rather than as defined in 4394 1.1 christos the .plt section. Leave the value alone. */ 4395 1.1 christos sym->st_shndx = SHN_UNDEF; 4396 1.1 christos /* If the symbol is weak, we do need to clear the value. 4397 1.1 christos Otherwise, the PLT entry would provide a definition for 4398 1.1 christos the symbol even if the symbol wasn't defined anywhere, 4399 1.1 christos and so the symbol would never be NULL. */ 4400 1.6 christos if (!h->ref_regular_nonweak) 4401 1.6 christos sym->st_value = 0; 4402 1.1 christos } 4403 1.1 christos } 4404 1.6 christos 4405 1.6 christos /* Don't generate dynamic GOT relocation against resolved undefined weak 4406 1.6 christos symbols in an executable. */ 4407 1.6 christos if (h->got.offset != (bfd_vma) -1 4408 1.1 christos && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD 4409 1.1 christos && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE 4410 1.1 christos && !(h->root.type == bfd_link_hash_undefweak 4411 1.1 christos && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 4412 1.1 christos || resolved_to_zero))) 4413 1.1 christos { 4414 1.1 christos asection *sgot; 4415 1.1 christos asection *srela; 4416 1.1 christos Elf_Internal_Rela rela; 4417 1.1 christos 4418 1.1 christos /* This symbol has an entry in the GOT. Set it up. */ 4419 1.1 christos 4420 1.1 christos sgot = htab->elf.sgot; 4421 1.1 christos srela = htab->elf.srelgot; 4422 1.1 christos BFD_ASSERT (sgot != NULL && srela != NULL); 4423 1.1 christos 4424 1.1 christos rela.r_offset = (sgot->output_section->vma 4425 1.1 christos + sgot->output_offset 4426 1.1 christos + (h->got.offset &~ (bfd_vma) 1)); 4427 1.1 christos 4428 1.3 christos /* If this is a -Bsymbolic link, and the symbol is defined 4429 1.1 christos locally, we just want to emit a RELATIVE reloc. Likewise if 4430 1.1 christos the symbol was forced to be local because of a version file. 4431 1.1 christos The entry in the global offset table will already have been 4432 1.1 christos initialized in the relocate_section function. */ 4433 1.1 christos if (! bfd_link_pic (info) 4434 1.1 christos && h->type == STT_GNU_IFUNC 4435 1.1 christos && h->def_regular) 4436 1.1 christos { 4437 1.1 christos asection *plt; 4438 1.1 christos 4439 1.1 christos /* We load the GOT entry with the PLT entry. */ 4440 1.1 christos plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt; 4441 1.8 christos SPARC_ELF_PUT_WORD (htab, output_bfd, 4442 1.1 christos (plt->output_section->vma 4443 1.6 christos + plt->output_offset + h->plt.offset), 4444 1.8 christos htab->elf.sgot->contents 4445 1.8 christos + (h->got.offset & ~(bfd_vma) 1)); 4446 1.8 christos return true; 4447 1.8 christos } 4448 1.1 christos 4449 1.1 christos if (bfd_link_pic (info) 4450 1.1 christos && (h->root.type == bfd_link_hash_defined 4451 1.1 christos || h->root.type == bfd_link_hash_defweak) 4452 1.1 christos && SYMBOL_REFERENCES_LOCAL (info, h)) 4453 1.1 christos { 4454 1.1 christos asection *sec = h->root.u.def.section; 4455 1.1 christos if (h->type == STT_GNU_IFUNC) 4456 1.1 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE); 4457 1.1 christos else 4458 1.1 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE); 4459 1.1 christos rela.r_addend = (h->root.u.def.value 4460 1.1 christos + sec->output_section->vma 4461 1.1 christos + sec->output_offset); 4462 1.1 christos } 4463 1.1 christos else 4464 1.1 christos { 4465 1.1 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT); 4466 1.1 christos rela.r_addend = 0; 4467 1.1 christos } 4468 1.1 christos 4469 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, 0, 4470 1.1 christos sgot->contents + (h->got.offset & ~(bfd_vma) 1)); 4471 1.1 christos sparc_elf_append_rela (output_bfd, srela, &rela); 4472 1.1 christos } 4473 1.1 christos 4474 1.1 christos if (h->needs_copy) 4475 1.1 christos { 4476 1.1 christos asection *s; 4477 1.1 christos Elf_Internal_Rela rela; 4478 1.1 christos 4479 1.1 christos /* This symbols needs a copy reloc. Set it up. */ 4480 1.1 christos BFD_ASSERT (h->dynindx != -1); 4481 1.1 christos 4482 1.6 christos rela.r_offset = (h->root.u.def.value 4483 1.6 christos + h->root.u.def.section->output_section->vma 4484 1.6 christos + h->root.u.def.section->output_offset); 4485 1.6 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY); 4486 1.1 christos rela.r_addend = 0; 4487 1.1 christos if (h->root.u.def.section == htab->elf.sdynrelro) 4488 1.1 christos s = htab->elf.sreldynrelro; 4489 1.1 christos else 4490 1.1 christos s = htab->elf.srelbss; 4491 1.1 christos sparc_elf_append_rela (output_bfd, s, &rela); 4492 1.1 christos } 4493 1.3 christos 4494 1.8 christos /* Mark some specially defined symbols as absolute. On VxWorks, 4495 1.1 christos _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the 4496 1.1 christos ".got" section. Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt". */ 4497 1.1 christos if (sym != NULL 4498 1.8 christos && (h == htab->elf.hdynamic 4499 1.1 christos || (htab->elf.target_os != is_vxworks 4500 1.1 christos && (h == htab->elf.hgot || h == htab->elf.hplt)))) 4501 1.1 christos sym->st_shndx = SHN_ABS; 4502 1.1 christos 4503 1.8 christos return true; 4504 1.1 christos } 4505 1.1 christos 4506 1.1 christos /* Finish up the dynamic sections. */ 4507 1.1 christos 4508 1.1 christos static bool 4509 1.1 christos sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info, 4510 1.1 christos bfd *dynobj, asection *sdyn, 4511 1.1 christos asection *splt ATTRIBUTE_UNUSED) 4512 1.1 christos { 4513 1.8 christos struct _bfd_sparc_elf_link_hash_table *htab; 4514 1.1 christos const struct elf_backend_data *bed; 4515 1.1 christos bfd_byte *dyncon, *dynconend; 4516 1.1 christos size_t dynsize; 4517 1.1 christos int stt_regidx = -1; 4518 1.1 christos bool abi_64_p; 4519 1.1 christos 4520 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 4521 1.1 christos BFD_ASSERT (htab != NULL); 4522 1.1 christos bed = get_elf_backend_data (output_bfd); 4523 1.1 christos dynsize = bed->s->sizeof_dyn; 4524 1.8 christos dynconend = sdyn->contents + sdyn->size; 4525 1.1 christos abi_64_p = ABI_64_P (output_bfd); 4526 1.1 christos for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize) 4527 1.1 christos { 4528 1.8 christos Elf_Internal_Dyn dyn; 4529 1.1 christos bool size; 4530 1.1 christos 4531 1.1 christos bed->s->swap_dyn_in (dynobj, dyncon, &dyn); 4532 1.1 christos 4533 1.1 christos if (htab->elf.target_os == is_vxworks && dyn.d_tag == DT_PLTGOT) 4534 1.1 christos { 4535 1.1 christos /* On VxWorks, DT_PLTGOT should point to the start of the GOT, 4536 1.1 christos not to the start of the PLT. */ 4537 1.1 christos if (htab->elf.sgotplt) 4538 1.1 christos { 4539 1.8 christos dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma 4540 1.1 christos + htab->elf.sgotplt->output_offset); 4541 1.1 christos bed->s->swap_dyn_out (output_bfd, &dyn, dyncon); 4542 1.1 christos } 4543 1.1 christos } 4544 1.1 christos else if (htab->elf.target_os == is_vxworks 4545 1.1 christos && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn)) 4546 1.1 christos bed->s->swap_dyn_out (output_bfd, &dyn, dyncon); 4547 1.1 christos else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER) 4548 1.1 christos { 4549 1.8 christos if (stt_regidx == -1) 4550 1.1 christos { 4551 1.1 christos stt_regidx = 4552 1.1 christos _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1); 4553 1.1 christos if (stt_regidx == -1) 4554 1.1 christos return false; 4555 1.1 christos } 4556 1.6 christos dyn.d_un.d_val = stt_regidx++; 4557 1.6 christos bed->s->swap_dyn_out (output_bfd, &dyn, dyncon); 4558 1.1 christos } 4559 1.1 christos else 4560 1.6 christos { 4561 1.6 christos asection *s; 4562 1.8 christos 4563 1.6 christos switch (dyn.d_tag) 4564 1.6 christos { 4565 1.6 christos case DT_PLTGOT: 4566 1.8 christos s = htab->elf.splt; 4567 1.6 christos size = false; 4568 1.6 christos break; 4569 1.6 christos case DT_PLTRELSZ: 4570 1.8 christos s = htab->elf.srelplt; 4571 1.6 christos size = true; 4572 1.6 christos break; 4573 1.6 christos case DT_JMPREL: 4574 1.1 christos s = htab->elf.srelplt; 4575 1.1 christos size = false; 4576 1.6 christos break; 4577 1.6 christos default: 4578 1.6 christos continue; 4579 1.1 christos } 4580 1.6 christos 4581 1.6 christos if (s == NULL) 4582 1.1 christos dyn.d_un.d_val = 0; 4583 1.6 christos else 4584 1.1 christos { 4585 1.6 christos if (!size) 4586 1.1 christos dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 4587 1.1 christos else 4588 1.8 christos dyn.d_un.d_val = s->size; 4589 1.1 christos } 4590 1.1 christos bed->s->swap_dyn_out (output_bfd, &dyn, dyncon); 4591 1.1 christos } 4592 1.1 christos } 4593 1.1 christos return true; 4594 1.1 christos } 4595 1.1 christos 4596 1.1 christos /* Install the first PLT entry in a VxWorks executable and make sure that 4597 1.1 christos .rela.plt.unloaded relocations have the correct symbol indexes. */ 4598 1.1 christos 4599 1.1 christos static void 4600 1.1 christos sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info) 4601 1.1 christos { 4602 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 4603 1.1 christos Elf_Internal_Rela rela; 4604 1.1 christos bfd_vma got_base; 4605 1.1 christos bfd_byte *loc; 4606 1.1 christos 4607 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 4608 1.1 christos BFD_ASSERT (htab != NULL); 4609 1.1 christos 4610 1.1 christos /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_. */ 4611 1.1 christos got_base = (htab->elf.hgot->root.u.def.section->output_section->vma 4612 1.1 christos + htab->elf.hgot->root.u.def.section->output_offset 4613 1.1 christos + htab->elf.hgot->root.u.def.value); 4614 1.1 christos 4615 1.1 christos /* Install the initial PLT entry. */ 4616 1.1 christos bfd_put_32 (output_bfd, 4617 1.1 christos sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10), 4618 1.1 christos htab->elf.splt->contents); 4619 1.1 christos bfd_put_32 (output_bfd, 4620 1.1 christos sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff), 4621 1.1 christos htab->elf.splt->contents + 4); 4622 1.1 christos bfd_put_32 (output_bfd, 4623 1.1 christos sparc_vxworks_exec_plt0_entry[2], 4624 1.1 christos htab->elf.splt->contents + 8); 4625 1.1 christos bfd_put_32 (output_bfd, 4626 1.1 christos sparc_vxworks_exec_plt0_entry[3], 4627 1.1 christos htab->elf.splt->contents + 12); 4628 1.1 christos bfd_put_32 (output_bfd, 4629 1.1 christos sparc_vxworks_exec_plt0_entry[4], 4630 1.1 christos htab->elf.splt->contents + 16); 4631 1.1 christos 4632 1.1 christos loc = htab->srelplt2->contents; 4633 1.1 christos 4634 1.1 christos /* Add an unloaded relocation for the initial entry's "sethi". */ 4635 1.1 christos rela.r_offset = (htab->elf.splt->output_section->vma 4636 1.1 christos + htab->elf.splt->output_offset); 4637 1.1 christos rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22); 4638 1.1 christos rela.r_addend = 8; 4639 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 4640 1.1 christos loc += sizeof (Elf32_External_Rela); 4641 1.1 christos 4642 1.1 christos /* Likewise the following "or". */ 4643 1.1 christos rela.r_offset += 4; 4644 1.1 christos rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10); 4645 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 4646 1.1 christos loc += sizeof (Elf32_External_Rela); 4647 1.1 christos 4648 1.1 christos /* Fix up the remaining .rela.plt.unloaded relocations. They may have 4649 1.1 christos the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order 4650 1.1 christos in which symbols were output. */ 4651 1.1 christos while (loc < htab->srelplt2->contents + htab->srelplt2->size) 4652 1.1 christos { 4653 1.1 christos Elf_Internal_Rela rel; 4654 1.1 christos 4655 1.1 christos /* The entry's initial "sethi" (against _G_O_T_). */ 4656 1.1 christos bfd_elf32_swap_reloc_in (output_bfd, loc, &rel); 4657 1.1 christos rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22); 4658 1.1 christos bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 4659 1.1 christos loc += sizeof (Elf32_External_Rela); 4660 1.1 christos 4661 1.1 christos /* The following "or" (also against _G_O_T_). */ 4662 1.1 christos bfd_elf32_swap_reloc_in (output_bfd, loc, &rel); 4663 1.1 christos rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10); 4664 1.1 christos bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 4665 1.1 christos loc += sizeof (Elf32_External_Rela); 4666 1.1 christos 4667 1.1 christos /* The .got.plt entry (against _P_L_T_). */ 4668 1.1 christos bfd_elf32_swap_reloc_in (output_bfd, loc, &rel); 4669 1.1 christos rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32); 4670 1.1 christos bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 4671 1.1 christos loc += sizeof (Elf32_External_Rela); 4672 1.1 christos } 4673 1.1 christos } 4674 1.1 christos 4675 1.1 christos /* Install the first PLT entry in a VxWorks shared object. */ 4676 1.1 christos 4677 1.1 christos static void 4678 1.1 christos sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info) 4679 1.1 christos { 4680 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 4681 1.1 christos unsigned int i; 4682 1.1 christos 4683 1.1 christos htab = _bfd_sparc_elf_hash_table (info); 4684 1.1 christos BFD_ASSERT (htab != NULL); 4685 1.1 christos 4686 1.1 christos for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++) 4687 1.1 christos bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i], 4688 1.1 christos htab->elf.splt->contents + i * 4); 4689 1.8 christos } 4690 1.1 christos 4691 1.1 christos /* Finish up local dynamic symbol handling. We set the contents of 4692 1.1 christos various dynamic sections here. */ 4693 1.1 christos 4694 1.1 christos static int 4695 1.3 christos finish_local_dynamic_symbol (void **slot, void *inf) 4696 1.1 christos { 4697 1.1 christos struct elf_link_hash_entry *h 4698 1.1 christos = (struct elf_link_hash_entry *) *slot; 4699 1.1 christos struct bfd_link_info *info 4700 1.1 christos = (struct bfd_link_info *) inf; 4701 1.6 christos 4702 1.6 christos return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info, 4703 1.6 christos h, NULL); 4704 1.6 christos } 4705 1.8 christos 4706 1.6 christos /* Finish up undefined weak symbol handling in PIE. Fill its PLT entry 4707 1.6 christos here since undefined weak symbol may not be dynamic and may not be 4708 1.6 christos called for _bfd_sparc_elf_finish_dynamic_symbol. */ 4709 1.6 christos 4710 1.6 christos static bool 4711 1.6 christos pie_finish_undefweak_symbol (struct bfd_hash_entry *bh, 4712 1.6 christos void *inf) 4713 1.6 christos { 4714 1.8 christos struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh; 4715 1.6 christos struct bfd_link_info *info = (struct bfd_link_info *) inf; 4716 1.6 christos 4717 1.6 christos if (h->root.type != bfd_link_hash_undefweak 4718 1.6 christos || h->dynindx != -1) 4719 1.6 christos return true; 4720 1.8 christos 4721 1.1 christos return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info, 4722 1.1 christos h, NULL); 4723 1.1 christos } 4724 1.1 christos 4725 1.1 christos bool 4726 1.1 christos _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) 4727 1.1 christos { 4728 1.1 christos bfd *dynobj; 4729 1.1 christos asection *sdyn; 4730 1.1 christos struct _bfd_sparc_elf_link_hash_table *htab; 4731 1.7 christos 4732 1.7 christos htab = _bfd_sparc_elf_hash_table (info); 4733 1.7 christos BFD_ASSERT (htab != NULL); 4734 1.7 christos dynobj = htab->elf.dynobj; 4735 1.7 christos 4736 1.7 christos /* We arranged in size_dynamic_sections to put the STT_REGISTER 4737 1.7 christos entries at the end of the dynlocal list, so they came at the end 4738 1.7 christos of the local symbols in the symtab. Except that they aren't 4739 1.7 christos STB_LOCAL, so we need to back up symtab->sh_info. */ 4740 1.7 christos if (ABI_64_P (output_bfd) 4741 1.7 christos && elf_hash_table (info)->dynlocal) 4742 1.7 christos { 4743 1.7 christos asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym"); 4744 1.7 christos struct elf_link_local_dynamic_entry *e; 4745 1.7 christos 4746 1.7 christos for (e = elf_hash_table (info)->dynlocal; e ; e = e->next) 4747 1.7 christos if (e->input_indx == -1) 4748 1.7 christos break; 4749 1.1 christos if (e) 4750 1.1 christos elf_section_data (dynsymsec->output_section)->this_hdr.sh_info 4751 1.1 christos = e->dynindx; 4752 1.1 christos } 4753 1.1 christos 4754 1.1 christos sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 4755 1.1 christos 4756 1.1 christos if (elf_hash_table (info)->dynamic_sections_created) 4757 1.1 christos { 4758 1.1 christos asection *splt; 4759 1.8 christos 4760 1.1 christos splt = htab->elf.splt; 4761 1.1 christos BFD_ASSERT (splt != NULL && sdyn != NULL); 4762 1.1 christos 4763 1.1 christos if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt)) 4764 1.8 christos return false; 4765 1.1 christos 4766 1.3 christos /* Initialize the contents of the .plt section. */ 4767 1.1 christos if (splt->size > 0) 4768 1.1 christos { 4769 1.1 christos if (htab->elf.target_os == is_vxworks) 4770 1.1 christos { 4771 1.1 christos if (bfd_link_pic (info)) 4772 1.1 christos sparc_vxworks_finish_shared_plt (output_bfd, info); 4773 1.1 christos else 4774 1.1 christos sparc_vxworks_finish_exec_plt (output_bfd, info); 4775 1.1 christos } 4776 1.1 christos else 4777 1.1 christos { 4778 1.1 christos memset (splt->contents, 0, htab->plt_header_size); 4779 1.1 christos if (!ABI_64_P (output_bfd)) 4780 1.3 christos bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP, 4781 1.6 christos splt->contents + splt->size - 4); 4782 1.8 christos } 4783 1.8 christos } 4784 1.6 christos 4785 1.1 christos if (elf_section_data (splt->output_section) != NULL) 4786 1.1 christos elf_section_data (splt->output_section)->this_hdr.sh_entsize 4787 1.1 christos = ((htab->elf.target_os == is_vxworks 4788 1.1 christos || !ABI_64_P (output_bfd)) 4789 1.1 christos ? 0 : htab->plt_entry_size); 4790 1.1 christos } 4791 1.1 christos 4792 1.1 christos /* Set the first entry in the global offset table to the address of 4793 1.1 christos the dynamic section. */ 4794 1.1 christos if (htab->elf.sgot && htab->elf.sgot->size > 0) 4795 1.1 christos { 4796 1.1 christos bfd_vma val = (sdyn ? 4797 1.1 christos sdyn->output_section->vma + sdyn->output_offset : 4798 1.1 christos 0); 4799 1.1 christos 4800 1.1 christos SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents); 4801 1.1 christos } 4802 1.1 christos 4803 1.1 christos if (htab->elf.sgot) 4804 1.1 christos elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4805 1.6 christos SPARC_ELF_WORD_BYTES (htab); 4806 1.6 christos 4807 1.6 christos /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */ 4808 1.6 christos htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info); 4809 1.6 christos 4810 1.8 christos /* Fill PLT entries for undefined weak symbols in PIE. */ 4811 1.1 christos if (bfd_link_pie (info)) 4812 1.1 christos bfd_hash_traverse (&info->hash->table, 4813 1.1 christos pie_finish_undefweak_symbol, 4814 1.1 christos info); 4815 1.1 christos return true; 4816 1.8 christos } 4817 1.1 christos 4818 1.1 christos 4819 1.5 christos /* Set the right machine number for a SPARC ELF file. */ 4821 1.5 christos 4822 1.5 christos bool 4823 1.5 christos _bfd_sparc_elf_object_p (bfd *abfd) 4824 1.5 christos { 4825 1.6 christos obj_attribute *attrs = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU]; 4826 1.6 christos obj_attribute *hwcaps = &attrs[Tag_GNU_Sparc_HWCAPS]; 4827 1.5 christos obj_attribute *hwcaps2 = &attrs[Tag_GNU_Sparc_HWCAPS2]; 4828 1.6 christos 4829 1.6 christos unsigned int v9c_hwcaps_mask = ELF_SPARC_HWCAP_ASI_BLK_INIT; 4830 1.6 christos unsigned int v9d_hwcaps_mask = (ELF_SPARC_HWCAP_FMAF 4831 1.6 christos | ELF_SPARC_HWCAP_VIS3 4832 1.6 christos | ELF_SPARC_HWCAP_HPC); 4833 1.6 christos unsigned int v9e_hwcaps_mask = (ELF_SPARC_HWCAP_AES 4834 1.6 christos | ELF_SPARC_HWCAP_DES 4835 1.6 christos | ELF_SPARC_HWCAP_KASUMI 4836 1.6 christos | ELF_SPARC_HWCAP_CAMELLIA 4837 1.6 christos | ELF_SPARC_HWCAP_MD5 4838 1.6 christos | ELF_SPARC_HWCAP_SHA1 4839 1.6 christos | ELF_SPARC_HWCAP_SHA256 4840 1.5 christos | ELF_SPARC_HWCAP_SHA512 4841 1.6 christos | ELF_SPARC_HWCAP_MPMUL 4842 1.5 christos | ELF_SPARC_HWCAP_MONT 4843 1.6 christos | ELF_SPARC_HWCAP_CRC32C 4844 1.6 christos | ELF_SPARC_HWCAP_CBCOND 4845 1.6 christos | ELF_SPARC_HWCAP_PAUSE); 4846 1.6 christos unsigned int v9v_hwcaps_mask = (ELF_SPARC_HWCAP_FJFMAU 4847 1.6 christos | ELF_SPARC_HWCAP_IMA); 4848 1.6 christos unsigned int v9m_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC5 4849 1.6 christos | ELF_SPARC_HWCAP2_MWAIT 4850 1.6 christos | ELF_SPARC_HWCAP2_XMPMUL 4851 1.6 christos | ELF_SPARC_HWCAP2_XMONT); 4852 1.6 christos unsigned int m8_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC6 4853 1.6 christos | ELF_SPARC_HWCAP2_ONADDSUB 4854 1.5 christos | ELF_SPARC_HWCAP2_ONMUL 4855 1.1 christos | ELF_SPARC_HWCAP2_ONDIV 4856 1.1 christos | ELF_SPARC_HWCAP2_DICTUNP 4857 1.1 christos | ELF_SPARC_HWCAP2_FPCMPSHL 4858 1.1 christos | ELF_SPARC_HWCAP2_RLE 4859 1.6 christos | ELF_SPARC_HWCAP2_SHA3); 4860 1.6 christos 4861 1.6 christos if (ABI_64_P (abfd)) 4862 1.6 christos { 4863 1.5 christos unsigned long mach = bfd_mach_sparc_v9; 4864 1.6 christos 4865 1.5 christos if (hwcaps2->i & m8_hwcaps2_mask) 4866 1.6 christos mach = bfd_mach_sparc_v9m8; 4867 1.5 christos else if (hwcaps2->i & v9m_hwcaps2_mask) 4868 1.6 christos mach = bfd_mach_sparc_v9m; 4869 1.5 christos else if (hwcaps->i & v9v_hwcaps_mask) 4870 1.6 christos mach = bfd_mach_sparc_v9v; 4871 1.5 christos else if (hwcaps->i & v9e_hwcaps_mask) 4872 1.1 christos mach = bfd_mach_sparc_v9e; 4873 1.1 christos else if (hwcaps->i & v9d_hwcaps_mask) 4874 1.1 christos mach = bfd_mach_sparc_v9d; 4875 1.1 christos else if (hwcaps->i & v9c_hwcaps_mask) 4876 1.1 christos mach = bfd_mach_sparc_v9c; 4877 1.1 christos else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3) 4878 1.1 christos mach = bfd_mach_sparc_v9b; 4879 1.1 christos else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1) 4880 1.1 christos mach = bfd_mach_sparc_v9a; 4881 1.6 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach); 4882 1.6 christos } 4883 1.6 christos else 4884 1.6 christos { 4885 1.5 christos if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS) 4886 1.5 christos { 4887 1.6 christos if (hwcaps2->i & m8_hwcaps2_mask) 4888 1.6 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4889 1.5 christos bfd_mach_sparc_v8plusm8); 4890 1.6 christos else if (hwcaps2->i & v9m_hwcaps2_mask) 4891 1.6 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4892 1.5 christos bfd_mach_sparc_v8plusm); 4893 1.6 christos else if (hwcaps->i & v9v_hwcaps_mask) 4894 1.6 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4895 1.5 christos bfd_mach_sparc_v8plusv); 4896 1.6 christos else if (hwcaps->i & v9e_hwcaps_mask) 4897 1.6 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4898 1.5 christos bfd_mach_sparc_v8pluse); 4899 1.5 christos else if (hwcaps->i & v9d_hwcaps_mask) 4900 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4901 1.1 christos bfd_mach_sparc_v8plusd); 4902 1.1 christos else if (hwcaps->i & v9c_hwcaps_mask) 4903 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4904 1.1 christos bfd_mach_sparc_v8plusc); 4905 1.1 christos else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3) 4906 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4907 1.1 christos bfd_mach_sparc_v8plusb); 4908 1.1 christos else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1) 4909 1.8 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4910 1.1 christos bfd_mach_sparc_v8plusa); 4911 1.1 christos else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS) 4912 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4913 1.1 christos bfd_mach_sparc_v8plus); 4914 1.1 christos else 4915 1.1 christos return false; 4916 1.1 christos } 4917 1.1 christos else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA) 4918 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, 4919 1.1 christos bfd_mach_sparc_sparclite_le); 4920 1.1 christos else 4921 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc); 4922 1.1 christos } 4923 1.1 christos } 4924 1.1 christos 4925 1.1 christos /* Return address for Ith PLT stub in section PLT, for relocation REL 4926 1.1 christos or (bfd_vma) -1 if it should not be included. */ 4927 1.1 christos 4928 1.1 christos bfd_vma 4929 1.1 christos _bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel) 4930 1.1 christos { 4931 1.1 christos if (ABI_64_P (plt->owner)) 4932 1.1 christos { 4933 1.1 christos bfd_vma j; 4934 1.1 christos 4935 1.1 christos i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE; 4936 1.1 christos if (i < PLT64_LARGE_THRESHOLD) 4937 1.1 christos return plt->vma + i * PLT64_ENTRY_SIZE; 4938 1.1 christos 4939 1.1 christos j = (i - PLT64_LARGE_THRESHOLD) % 160; 4940 1.1 christos i -= j; 4941 1.1 christos return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6; 4942 1.1 christos } 4943 1.1 christos else 4944 1.8 christos return rel->address; 4945 1.6 christos } 4946 1.1 christos 4947 1.6 christos /* Merge backend specific data from an object file to the output 4948 1.1 christos object file when linking. */ 4949 1.1 christos 4950 1.1 christos bool 4951 1.1 christos _bfd_sparc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) 4952 1.1 christos { 4953 1.1 christos bfd *obfd = info->output_bfd; 4954 1.1 christos obj_attribute *in_attr, *in_attrs; 4955 1.1 christos obj_attribute *out_attr, *out_attrs; 4956 1.1 christos 4957 1.1 christos if (!elf_known_obj_attributes_proc (obfd)[0].i) 4958 1.1 christos { 4959 1.1 christos /* This is the first object. Copy the attributes. */ 4960 1.8 christos _bfd_elf_copy_obj_attributes (ibfd, obfd); 4961 1.1 christos 4962 1.1 christos /* Use the Tag_null value to indicate the attributes have been 4963 1.1 christos initialized. */ 4964 1.1 christos elf_known_obj_attributes_proc (obfd)[0].i = 1; 4965 1.1 christos 4966 1.1 christos return true; 4967 1.1 christos } 4968 1.1 christos 4969 1.1 christos in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU]; 4970 1.3 christos out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU]; 4971 1.3 christos 4972 1.3 christos in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS]; 4973 1.3 christos out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS]; 4974 1.3 christos 4975 1.3 christos out_attr->i |= in_attr->i; 4976 1.3 christos out_attr->type = 1; 4977 1.3 christos 4978 1.1 christos in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS2]; 4979 1.6 christos out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS2]; 4980 1.1 christos 4981 1.8 christos out_attr->i |= in_attr->i; 4982 1.1 christos out_attr->type = 1; 4983 4984 /* Merge Tag_compatibility attributes and any common GNU ones. */ 4985 _bfd_elf_merge_object_attributes (ibfd, info); 4986 4987 return true; 4988 } 4989