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