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