1 // sparc.cc -- sparc target support for gold. 2 3 // Copyright (C) 2008-2016 Free Software Foundation, Inc. 4 // Written by David S. Miller <davem (at) davemloft.net>. 5 6 // This file is part of gold. 7 8 // This program is free software; you can redistribute it and/or modify 9 // it under the terms of the GNU General Public License as published by 10 // the Free Software Foundation; either version 3 of the License, or 11 // (at your option) any later version. 12 13 // This program is distributed in the hope that it will be useful, 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU General Public License for more details. 17 18 // You should have received a copy of the GNU General Public License 19 // along with this program; if not, write to the Free Software 20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 // MA 02110-1301, USA. 22 23 #include "gold.h" 24 25 #include <cstdlib> 26 #include <cstdio> 27 #include <cstring> 28 29 #include "elfcpp.h" 30 #include "parameters.h" 31 #include "reloc.h" 32 #include "sparc.h" 33 #include "object.h" 34 #include "symtab.h" 35 #include "layout.h" 36 #include "output.h" 37 #include "copy-relocs.h" 38 #include "target.h" 39 #include "target-reloc.h" 40 #include "target-select.h" 41 #include "tls.h" 42 #include "errors.h" 43 #include "gc.h" 44 45 namespace 46 { 47 48 using namespace gold; 49 50 template<int size, bool big_endian> 51 class Output_data_plt_sparc; 52 53 template<int size, bool big_endian> 54 class Target_sparc : public Sized_target<size, big_endian> 55 { 56 public: 57 typedef Output_data_reloc<elfcpp::SHT_RELA, true, size, big_endian> Reloc_section; 58 59 Target_sparc() 60 : Sized_target<size, big_endian>(&sparc_info), 61 got_(NULL), plt_(NULL), rela_dyn_(NULL), rela_ifunc_(NULL), 62 copy_relocs_(elfcpp::R_SPARC_COPY), 63 got_mod_index_offset_(-1U), tls_get_addr_sym_(NULL), 64 elf_machine_(sparc_info.machine_code), elf_flags_(0), 65 elf_flags_set_(false), register_syms_() 66 { 67 } 68 69 // Make a new symbol table entry. 70 Sized_symbol<size>* 71 make_symbol(const char*, elfcpp::STT, Object*, unsigned int, uint64_t); 72 73 // Process the relocations to determine unreferenced sections for 74 // garbage collection. 75 void 76 gc_process_relocs(Symbol_table* symtab, 77 Layout* layout, 78 Sized_relobj_file<size, big_endian>* object, 79 unsigned int data_shndx, 80 unsigned int sh_type, 81 const unsigned char* prelocs, 82 size_t reloc_count, 83 Output_section* output_section, 84 bool needs_special_offset_handling, 85 size_t local_symbol_count, 86 const unsigned char* plocal_symbols); 87 88 // Scan the relocations to look for symbol adjustments. 89 void 90 scan_relocs(Symbol_table* symtab, 91 Layout* layout, 92 Sized_relobj_file<size, big_endian>* object, 93 unsigned int data_shndx, 94 unsigned int sh_type, 95 const unsigned char* prelocs, 96 size_t reloc_count, 97 Output_section* output_section, 98 bool needs_special_offset_handling, 99 size_t local_symbol_count, 100 const unsigned char* plocal_symbols); 101 // Finalize the sections. 102 void 103 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*); 104 105 // Return the value to use for a dynamic which requires special 106 // treatment. 107 uint64_t 108 do_dynsym_value(const Symbol*) const; 109 110 // Relocate a section. 111 void 112 relocate_section(const Relocate_info<size, big_endian>*, 113 unsigned int sh_type, 114 const unsigned char* prelocs, 115 size_t reloc_count, 116 Output_section* output_section, 117 bool needs_special_offset_handling, 118 unsigned char* view, 119 typename elfcpp::Elf_types<size>::Elf_Addr view_address, 120 section_size_type view_size, 121 const Reloc_symbol_changes*); 122 123 // Scan the relocs during a relocatable link. 124 void 125 scan_relocatable_relocs(Symbol_table* symtab, 126 Layout* layout, 127 Sized_relobj_file<size, big_endian>* object, 128 unsigned int data_shndx, 129 unsigned int sh_type, 130 const unsigned char* prelocs, 131 size_t reloc_count, 132 Output_section* output_section, 133 bool needs_special_offset_handling, 134 size_t local_symbol_count, 135 const unsigned char* plocal_symbols, 136 Relocatable_relocs*); 137 138 // Scan the relocs for --emit-relocs. 139 void 140 emit_relocs_scan(Symbol_table* symtab, 141 Layout* layout, 142 Sized_relobj_file<size, big_endian>* object, 143 unsigned int data_shndx, 144 unsigned int sh_type, 145 const unsigned char* prelocs, 146 size_t reloc_count, 147 Output_section* output_section, 148 bool needs_special_offset_handling, 149 size_t local_symbol_count, 150 const unsigned char* plocal_syms, 151 Relocatable_relocs* rr); 152 153 // Emit relocations for a section. 154 void 155 relocate_relocs(const Relocate_info<size, big_endian>*, 156 unsigned int sh_type, 157 const unsigned char* prelocs, 158 size_t reloc_count, 159 Output_section* output_section, 160 typename elfcpp::Elf_types<size>::Elf_Off 161 offset_in_output_section, 162 unsigned char* view, 163 typename elfcpp::Elf_types<size>::Elf_Addr view_address, 164 section_size_type view_size, 165 unsigned char* reloc_view, 166 section_size_type reloc_view_size); 167 168 // Return whether SYM is defined by the ABI. 169 bool 170 do_is_defined_by_abi(const Symbol* sym) const 171 { return strcmp(sym->name(), "___tls_get_addr") == 0; } 172 173 // Return the PLT address to use for a global symbol. 174 uint64_t 175 do_plt_address_for_global(const Symbol* gsym) const 176 { return this->plt_section()->address_for_global(gsym); } 177 178 uint64_t 179 do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const 180 { return this->plt_section()->address_for_local(relobj, symndx); } 181 182 // Return whether there is a GOT section. 183 bool 184 has_got_section() const 185 { return this->got_ != NULL; } 186 187 // Return the size of the GOT section. 188 section_size_type 189 got_size() const 190 { 191 gold_assert(this->got_ != NULL); 192 return this->got_->data_size(); 193 } 194 195 // Return the number of entries in the GOT. 196 unsigned int 197 got_entry_count() const 198 { 199 if (this->got_ == NULL) 200 return 0; 201 return this->got_size() / (size / 8); 202 } 203 204 // Return the address of the GOT. 205 uint64_t 206 got_address() const 207 { 208 if (this->got_ == NULL) 209 return 0; 210 return this->got_->address(); 211 } 212 213 // Return the number of entries in the PLT. 214 unsigned int 215 plt_entry_count() const; 216 217 // Return the offset of the first non-reserved PLT entry. 218 unsigned int 219 first_plt_entry_offset() const; 220 221 // Return the size of each PLT entry. 222 unsigned int 223 plt_entry_size() const; 224 225 protected: 226 // Make an ELF object. 227 Object* 228 do_make_elf_object(const std::string&, Input_file*, off_t, 229 const elfcpp::Ehdr<size, big_endian>& ehdr); 230 231 void 232 do_adjust_elf_header(unsigned char* view, int len); 233 234 private: 235 236 // The class which scans relocations. 237 class Scan 238 { 239 public: 240 Scan() 241 : issued_non_pic_error_(false) 242 { } 243 244 static inline int 245 get_reference_flags(unsigned int r_type); 246 247 inline void 248 local(Symbol_table* symtab, Layout* layout, Target_sparc* target, 249 Sized_relobj_file<size, big_endian>* object, 250 unsigned int data_shndx, 251 Output_section* output_section, 252 const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type, 253 const elfcpp::Sym<size, big_endian>& lsym, 254 bool is_discarded); 255 256 inline void 257 global(Symbol_table* symtab, Layout* layout, Target_sparc* target, 258 Sized_relobj_file<size, big_endian>* object, 259 unsigned int data_shndx, 260 Output_section* output_section, 261 const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type, 262 Symbol* gsym); 263 264 inline bool 265 local_reloc_may_be_function_pointer(Symbol_table* , Layout* , 266 Target_sparc* , 267 Sized_relobj_file<size, big_endian>* , 268 unsigned int , 269 Output_section* , 270 const elfcpp::Rela<size, big_endian>& , 271 unsigned int , 272 const elfcpp::Sym<size, big_endian>&) 273 { return false; } 274 275 inline bool 276 global_reloc_may_be_function_pointer(Symbol_table* , Layout* , 277 Target_sparc* , 278 Sized_relobj_file<size, big_endian>* , 279 unsigned int , 280 Output_section* , 281 const elfcpp::Rela<size, 282 big_endian>& , 283 unsigned int , Symbol*) 284 { return false; } 285 286 287 private: 288 static void 289 unsupported_reloc_local(Sized_relobj_file<size, big_endian>*, 290 unsigned int r_type); 291 292 static void 293 unsupported_reloc_global(Sized_relobj_file<size, big_endian>*, 294 unsigned int r_type, Symbol*); 295 296 static void 297 generate_tls_call(Symbol_table* symtab, Layout* layout, 298 Target_sparc* target); 299 300 void 301 check_non_pic(Relobj*, unsigned int r_type); 302 303 bool 304 reloc_needs_plt_for_ifunc(Sized_relobj_file<size, big_endian>*, 305 unsigned int r_type); 306 307 // Whether we have issued an error about a non-PIC compilation. 308 bool issued_non_pic_error_; 309 }; 310 311 // The class which implements relocation. 312 class Relocate 313 { 314 public: 315 Relocate() 316 : ignore_gd_add_(false), reloc_adjust_addr_(NULL) 317 { } 318 319 ~Relocate() 320 { 321 if (this->ignore_gd_add_) 322 { 323 // FIXME: This needs to specify the location somehow. 324 gold_error(_("missing expected TLS relocation")); 325 } 326 } 327 328 // Do a relocation. Return false if the caller should not issue 329 // any warnings about this relocation. 330 inline bool 331 relocate(const Relocate_info<size, big_endian>*, unsigned int, 332 Target_sparc*, Output_section*, size_t, const unsigned char*, 333 const Sized_symbol<size>*, const Symbol_value<size>*, 334 unsigned char*, typename elfcpp::Elf_types<size>::Elf_Addr, 335 section_size_type); 336 337 private: 338 // Do a TLS relocation. 339 inline void 340 relocate_tls(const Relocate_info<size, big_endian>*, Target_sparc* target, 341 size_t relnum, const elfcpp::Rela<size, big_endian>&, 342 unsigned int r_type, const Sized_symbol<size>*, 343 const Symbol_value<size>*, 344 unsigned char*, 345 typename elfcpp::Elf_types<size>::Elf_Addr, 346 section_size_type); 347 348 inline void 349 relax_call(Target_sparc<size, big_endian>* target, 350 unsigned char* view, 351 const elfcpp::Rela<size, big_endian>& rela, 352 section_size_type view_size); 353 354 // Ignore the next relocation which should be R_SPARC_TLS_GD_ADD 355 bool ignore_gd_add_; 356 357 // If we hit a reloc at this view address, adjust it back by 4 bytes. 358 unsigned char *reloc_adjust_addr_; 359 }; 360 361 // Get the GOT section, creating it if necessary. 362 Output_data_got<size, big_endian>* 363 got_section(Symbol_table*, Layout*); 364 365 // Create the PLT section. 366 void 367 make_plt_section(Symbol_table* symtab, Layout* layout); 368 369 // Create a PLT entry for a global symbol. 370 void 371 make_plt_entry(Symbol_table*, Layout*, Symbol*); 372 373 // Create a PLT entry for a local STT_GNU_IFUNC symbol. 374 void 375 make_local_ifunc_plt_entry(Symbol_table*, Layout*, 376 Sized_relobj_file<size, big_endian>* relobj, 377 unsigned int local_sym_index); 378 379 // Create a GOT entry for the TLS module index. 380 unsigned int 381 got_mod_index_entry(Symbol_table* symtab, Layout* layout, 382 Sized_relobj_file<size, big_endian>* object); 383 384 // Return the gsym for "__tls_get_addr". Cache if not already 385 // cached. 386 Symbol* 387 tls_get_addr_sym(Symbol_table* symtab) 388 { 389 if (!this->tls_get_addr_sym_) 390 this->tls_get_addr_sym_ = symtab->lookup("__tls_get_addr", NULL); 391 gold_assert(this->tls_get_addr_sym_); 392 return this->tls_get_addr_sym_; 393 } 394 395 // Get the PLT section. 396 Output_data_plt_sparc<size, big_endian>* 397 plt_section() const 398 { 399 gold_assert(this->plt_ != NULL); 400 return this->plt_; 401 } 402 403 // Get the dynamic reloc section, creating it if necessary. 404 Reloc_section* 405 rela_dyn_section(Layout*); 406 407 // Get the section to use for IFUNC relocations. 408 Reloc_section* 409 rela_ifunc_section(Layout*); 410 411 // Copy a relocation against a global symbol. 412 void 413 copy_reloc(Symbol_table* symtab, Layout* layout, 414 Sized_relobj_file<size, big_endian>* object, 415 unsigned int shndx, Output_section* output_section, 416 Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc) 417 { 418 unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info()); 419 this->copy_relocs_.copy_reloc(symtab, layout, 420 symtab->get_sized_symbol<size>(sym), 421 object, shndx, output_section, 422 r_type, reloc.get_r_offset(), 423 reloc.get_r_addend(), 424 this->rela_dyn_section(layout)); 425 } 426 427 // Information about this specific target which we pass to the 428 // general Target structure. 429 static Target::Target_info sparc_info; 430 431 // The types of GOT entries needed for this platform. 432 // These values are exposed to the ABI in an incremental link. 433 // Do not renumber existing values without changing the version 434 // number of the .gnu_incremental_inputs section. 435 enum Got_type 436 { 437 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol 438 GOT_TYPE_TLS_OFFSET = 1, // GOT entry for TLS offset 439 GOT_TYPE_TLS_PAIR = 2, // GOT entry for TLS module/offset pair 440 }; 441 442 struct Register_symbol 443 { 444 Register_symbol() 445 : name(NULL), shndx(0), obj(NULL) 446 { } 447 const char* name; 448 unsigned int shndx; 449 Object* obj; 450 }; 451 452 // The GOT section. 453 Output_data_got<size, big_endian>* got_; 454 // The PLT section. 455 Output_data_plt_sparc<size, big_endian>* plt_; 456 // The dynamic reloc section. 457 Reloc_section* rela_dyn_; 458 // The section to use for IFUNC relocs. 459 Reloc_section* rela_ifunc_; 460 // Relocs saved to avoid a COPY reloc. 461 Copy_relocs<elfcpp::SHT_RELA, size, big_endian> copy_relocs_; 462 // Offset of the GOT entry for the TLS module index; 463 unsigned int got_mod_index_offset_; 464 // Cached pointer to __tls_get_addr symbol 465 Symbol* tls_get_addr_sym_; 466 // Accumulated elf machine type 467 elfcpp::Elf_Half elf_machine_; 468 // Accumulated elf header flags 469 elfcpp::Elf_Word elf_flags_; 470 // Whether elf_flags_ has been set for the first time yet 471 bool elf_flags_set_; 472 // STT_SPARC_REGISTER symbols (%g2, %g3, %g6, %g7). 473 Register_symbol register_syms_[4]; 474 }; 475 476 template<> 477 Target::Target_info Target_sparc<32, true>::sparc_info = 478 { 479 32, // size 480 true, // is_big_endian 481 elfcpp::EM_SPARC, // machine_code 482 false, // has_make_symbol 483 false, // has_resolve 484 false, // has_code_fill 485 true, // is_default_stack_executable 486 false, // can_icf_inline_merge_sections 487 '\0', // wrap_char 488 "/usr/lib/ld.so.1", // dynamic_linker 489 0x00010000, // default_text_segment_address 490 64 * 1024, // abi_pagesize (overridable by -z max-page-size) 491 8 * 1024, // common_pagesize (overridable by -z common-page-size) 492 false, // isolate_execinstr 493 0, // rosegment_gap 494 elfcpp::SHN_UNDEF, // small_common_shndx 495 elfcpp::SHN_UNDEF, // large_common_shndx 496 0, // small_common_section_flags 497 0, // large_common_section_flags 498 NULL, // attributes_section 499 NULL, // attributes_vendor 500 "_start", // entry_symbol_name 501 32, // hash_entry_size 502 }; 503 504 template<> 505 Target::Target_info Target_sparc<64, true>::sparc_info = 506 { 507 64, // size 508 true, // is_big_endian 509 elfcpp::EM_SPARCV9, // machine_code 510 true, // has_make_symbol 511 false, // has_resolve 512 false, // has_code_fill 513 true, // is_default_stack_executable 514 false, // can_icf_inline_merge_sections 515 '\0', // wrap_char 516 "/usr/lib/sparcv9/ld.so.1", // dynamic_linker 517 0x100000, // default_text_segment_address 518 64 * 1024, // abi_pagesize (overridable by -z max-page-size) 519 8 * 1024, // common_pagesize (overridable by -z common-page-size) 520 false, // isolate_execinstr 521 0, // rosegment_gap 522 elfcpp::SHN_UNDEF, // small_common_shndx 523 elfcpp::SHN_UNDEF, // large_common_shndx 524 0, // small_common_section_flags 525 0, // large_common_section_flags 526 NULL, // attributes_section 527 NULL, // attributes_vendor 528 "_start", // entry_symbol_name 529 32, // hash_entry_size 530 }; 531 532 // We have to take care here, even when operating in little-endian 533 // mode, sparc instructions are still big endian. 534 template<int size, bool big_endian> 535 class Sparc_relocate_functions 536 { 537 private: 538 // Do a simple relocation with the addend in the relocation. 539 template<int valsize> 540 static inline void 541 rela(unsigned char* view, 542 unsigned int right_shift, 543 typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask, 544 typename elfcpp::Swap<size, big_endian>::Valtype value, 545 typename elfcpp::Swap<size, big_endian>::Valtype addend) 546 { 547 typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype; 548 Valtype* wv = reinterpret_cast<Valtype*>(view); 549 Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv); 550 Valtype reloc = ((value + addend) >> right_shift); 551 552 val &= ~dst_mask; 553 reloc &= dst_mask; 554 555 elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc); 556 } 557 558 // Do a simple relocation using a symbol value with the addend in 559 // the relocation. 560 template<int valsize> 561 static inline void 562 rela(unsigned char* view, 563 unsigned int right_shift, 564 typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask, 565 const Sized_relobj_file<size, big_endian>* object, 566 const Symbol_value<size>* psymval, 567 typename elfcpp::Swap<valsize, big_endian>::Valtype addend) 568 { 569 typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype; 570 Valtype* wv = reinterpret_cast<Valtype*>(view); 571 Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv); 572 Valtype reloc = (psymval->value(object, addend) >> right_shift); 573 574 val &= ~dst_mask; 575 reloc &= dst_mask; 576 577 elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc); 578 } 579 580 // Do a simple relocation using a symbol value with the addend in 581 // the relocation, unaligned. 582 template<int valsize> 583 static inline void 584 rela_ua(unsigned char* view, 585 unsigned int right_shift, elfcpp::Elf_Xword dst_mask, 586 const Sized_relobj_file<size, big_endian>* object, 587 const Symbol_value<size>* psymval, 588 typename elfcpp::Swap<size, big_endian>::Valtype addend) 589 { 590 typedef typename elfcpp::Swap_unaligned<valsize, 591 big_endian>::Valtype Valtype; 592 unsigned char* wv = view; 593 Valtype val = elfcpp::Swap_unaligned<valsize, big_endian>::readval(wv); 594 Valtype reloc = (psymval->value(object, addend) >> right_shift); 595 596 val &= ~dst_mask; 597 reloc &= dst_mask; 598 599 elfcpp::Swap_unaligned<valsize, big_endian>::writeval(wv, val | reloc); 600 } 601 602 // Do a simple PC relative relocation with a Symbol_value with the 603 // addend in the relocation. 604 template<int valsize> 605 static inline void 606 pcrela(unsigned char* view, 607 unsigned int right_shift, 608 typename elfcpp::Elf_types<valsize>::Elf_Addr dst_mask, 609 const Sized_relobj_file<size, big_endian>* object, 610 const Symbol_value<size>* psymval, 611 typename elfcpp::Swap<size, big_endian>::Valtype addend, 612 typename elfcpp::Elf_types<size>::Elf_Addr address) 613 { 614 typedef typename elfcpp::Swap<valsize, big_endian>::Valtype Valtype; 615 Valtype* wv = reinterpret_cast<Valtype*>(view); 616 Valtype val = elfcpp::Swap<valsize, big_endian>::readval(wv); 617 Valtype reloc = ((psymval->value(object, addend) - address) 618 >> right_shift); 619 620 val &= ~dst_mask; 621 reloc &= dst_mask; 622 623 elfcpp::Swap<valsize, big_endian>::writeval(wv, val | reloc); 624 } 625 626 template<int valsize> 627 static inline void 628 pcrela_unaligned(unsigned char* view, 629 const Sized_relobj_file<size, big_endian>* object, 630 const Symbol_value<size>* psymval, 631 typename elfcpp::Swap<size, big_endian>::Valtype addend, 632 typename elfcpp::Elf_types<size>::Elf_Addr address) 633 { 634 typedef typename elfcpp::Swap_unaligned<valsize, 635 big_endian>::Valtype Valtype; 636 unsigned char* wv = view; 637 Valtype reloc = (psymval->value(object, addend) - address); 638 639 elfcpp::Swap_unaligned<valsize, big_endian>::writeval(wv, reloc); 640 } 641 642 typedef Sparc_relocate_functions<size, big_endian> This; 643 typedef Sparc_relocate_functions<size, true> This_insn; 644 645 public: 646 // R_SPARC_WDISP30: (Symbol + Addend - Address) >> 2 647 static inline void 648 wdisp30(unsigned char* view, 649 const Sized_relobj_file<size, big_endian>* object, 650 const Symbol_value<size>* psymval, 651 typename elfcpp::Elf_types<size>::Elf_Addr addend, 652 typename elfcpp::Elf_types<size>::Elf_Addr address) 653 { 654 This_insn::template pcrela<32>(view, 2, 0x3fffffff, object, 655 psymval, addend, address); 656 } 657 658 // R_SPARC_WDISP22: (Symbol + Addend - Address) >> 2 659 static inline void 660 wdisp22(unsigned char* view, 661 const Sized_relobj_file<size, big_endian>* object, 662 const Symbol_value<size>* psymval, 663 typename elfcpp::Elf_types<size>::Elf_Addr addend, 664 typename elfcpp::Elf_types<size>::Elf_Addr address) 665 { 666 This_insn::template pcrela<32>(view, 2, 0x003fffff, object, 667 psymval, addend, address); 668 } 669 670 // R_SPARC_WDISP19: (Symbol + Addend - Address) >> 2 671 static inline void 672 wdisp19(unsigned char* view, 673 const Sized_relobj_file<size, big_endian>* object, 674 const Symbol_value<size>* psymval, 675 typename elfcpp::Elf_types<size>::Elf_Addr addend, 676 typename elfcpp::Elf_types<size>::Elf_Addr address) 677 { 678 This_insn::template pcrela<32>(view, 2, 0x0007ffff, object, 679 psymval, addend, address); 680 } 681 682 // R_SPARC_WDISP16: (Symbol + Addend - Address) >> 2 683 static inline void 684 wdisp16(unsigned char* view, 685 const Sized_relobj_file<size, big_endian>* object, 686 const Symbol_value<size>* psymval, 687 typename elfcpp::Elf_types<size>::Elf_Addr addend, 688 typename elfcpp::Elf_types<size>::Elf_Addr address) 689 { 690 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 691 Valtype* wv = reinterpret_cast<Valtype*>(view); 692 Valtype val = elfcpp::Swap<32, true>::readval(wv); 693 Valtype reloc = ((psymval->value(object, addend) - address) 694 >> 2); 695 696 // The relocation value is split between the low 14 bits, 697 // and bits 20-21. 698 val &= ~((0x3 << 20) | 0x3fff); 699 reloc = (((reloc & 0xc000) << (20 - 14)) 700 | (reloc & 0x3ffff)); 701 702 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 703 } 704 705 // R_SPARC_WDISP10: (Symbol + Addend - Address) >> 2 706 static inline void 707 wdisp10(unsigned char* view, 708 const Sized_relobj_file<size, big_endian>* object, 709 const Symbol_value<size>* psymval, 710 typename elfcpp::Elf_types<size>::Elf_Addr addend, 711 typename elfcpp::Elf_types<size>::Elf_Addr address) 712 { 713 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 714 Valtype* wv = reinterpret_cast<Valtype*>(view); 715 Valtype val = elfcpp::Swap<32, true>::readval(wv); 716 Valtype reloc = ((psymval->value(object, addend) - address) 717 >> 2); 718 719 // The relocation value is split between the low bits 5-12, 720 // and high bits 19-20. 721 val &= ~((0x3 << 19) | (0xff << 5)); 722 reloc = (((reloc & 0x300) << (19 - 8)) 723 | ((reloc & 0xff) << (5 - 0))); 724 725 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 726 } 727 728 // R_SPARC_PC22: (Symbol + Addend - Address) >> 10 729 static inline void 730 pc22(unsigned char* view, 731 const Sized_relobj_file<size, big_endian>* object, 732 const Symbol_value<size>* psymval, 733 typename elfcpp::Elf_types<size>::Elf_Addr addend, 734 typename elfcpp::Elf_types<size>::Elf_Addr address) 735 { 736 This_insn::template pcrela<32>(view, 10, 0x003fffff, object, 737 psymval, addend, address); 738 } 739 740 // R_SPARC_PC10: (Symbol + Addend - Address) & 0x3ff 741 static inline void 742 pc10(unsigned char* view, 743 const Sized_relobj_file<size, big_endian>* object, 744 const Symbol_value<size>* psymval, 745 typename elfcpp::Elf_types<size>::Elf_Addr addend, 746 typename elfcpp::Elf_types<size>::Elf_Addr address) 747 { 748 This_insn::template pcrela<32>(view, 0, 0x000003ff, object, 749 psymval, addend, address); 750 } 751 752 // R_SPARC_HI22: (Symbol + Addend) >> 10 753 static inline void 754 hi22(unsigned char* view, 755 typename elfcpp::Elf_types<size>::Elf_Addr value, 756 typename elfcpp::Elf_types<size>::Elf_Addr addend) 757 { 758 This_insn::template rela<32>(view, 10, 0x003fffff, value, addend); 759 } 760 761 // R_SPARC_HI22: (Symbol + Addend) >> 10 762 static inline void 763 hi22(unsigned char* view, 764 const Sized_relobj_file<size, big_endian>* object, 765 const Symbol_value<size>* psymval, 766 typename elfcpp::Elf_types<size>::Elf_Addr addend) 767 { 768 This_insn::template rela<32>(view, 10, 0x003fffff, object, psymval, addend); 769 } 770 771 // R_SPARC_PCPLT22: (Symbol + Addend - Address) >> 10 772 static inline void 773 pcplt22(unsigned char* view, 774 const Sized_relobj_file<size, big_endian>* object, 775 const Symbol_value<size>* psymval, 776 typename elfcpp::Elf_types<size>::Elf_Addr addend, 777 typename elfcpp::Elf_types<size>::Elf_Addr address) 778 { 779 This_insn::template pcrela<32>(view, 10, 0x003fffff, object, 780 psymval, addend, address); 781 } 782 783 // R_SPARC_LO10: (Symbol + Addend) & 0x3ff 784 static inline void 785 lo10(unsigned char* view, 786 typename elfcpp::Elf_types<size>::Elf_Addr value, 787 typename elfcpp::Elf_types<size>::Elf_Addr addend) 788 { 789 This_insn::template rela<32>(view, 0, 0x000003ff, value, addend); 790 } 791 792 // R_SPARC_LO10: (Symbol + Addend) & 0x3ff 793 static inline void 794 lo10(unsigned char* view, 795 const Sized_relobj_file<size, big_endian>* object, 796 const Symbol_value<size>* psymval, 797 typename elfcpp::Elf_types<size>::Elf_Addr addend) 798 { 799 This_insn::template rela<32>(view, 0, 0x000003ff, object, psymval, addend); 800 } 801 802 // R_SPARC_LO10: (Symbol + Addend) & 0x3ff 803 static inline void 804 lo10(unsigned char* view, 805 const Sized_relobj_file<size, big_endian>* object, 806 const Symbol_value<size>* psymval, 807 typename elfcpp::Elf_types<size>::Elf_Addr addend, 808 typename elfcpp::Elf_types<size>::Elf_Addr address) 809 { 810 This_insn::template pcrela<32>(view, 0, 0x000003ff, object, 811 psymval, addend, address); 812 } 813 814 // R_SPARC_OLO10: ((Symbol + Addend) & 0x3ff) + Addend2 815 static inline void 816 olo10(unsigned char* view, 817 const Sized_relobj_file<size, big_endian>* object, 818 const Symbol_value<size>* psymval, 819 typename elfcpp::Elf_types<size>::Elf_Addr addend, 820 typename elfcpp::Elf_types<size>::Elf_Addr addend2) 821 { 822 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 823 Valtype* wv = reinterpret_cast<Valtype*>(view); 824 Valtype val = elfcpp::Swap<32, true>::readval(wv); 825 Valtype reloc = psymval->value(object, addend); 826 827 val &= ~0x1fff; 828 reloc &= 0x3ff; 829 reloc += addend2; 830 reloc &= 0x1fff; 831 832 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 833 } 834 835 // R_SPARC_22: (Symbol + Addend) 836 static inline void 837 rela32_22(unsigned char* view, 838 const Sized_relobj_file<size, big_endian>* object, 839 const Symbol_value<size>* psymval, 840 typename elfcpp::Elf_types<size>::Elf_Addr addend) 841 { 842 This_insn::template rela<32>(view, 0, 0x003fffff, object, psymval, addend); 843 } 844 845 // R_SPARC_13: (Symbol + Addend) 846 static inline void 847 rela32_13(unsigned char* view, 848 typename elfcpp::Elf_types<size>::Elf_Addr value, 849 typename elfcpp::Elf_types<size>::Elf_Addr addend) 850 { 851 This_insn::template rela<32>(view, 0, 0x00001fff, value, addend); 852 } 853 854 // R_SPARC_13: (Symbol + Addend) 855 static inline void 856 rela32_13(unsigned char* view, 857 const Sized_relobj_file<size, big_endian>* object, 858 const Symbol_value<size>* psymval, 859 typename elfcpp::Elf_types<size>::Elf_Addr addend) 860 { 861 This_insn::template rela<32>(view, 0, 0x00001fff, object, psymval, addend); 862 } 863 864 // R_SPARC_UA16: (Symbol + Addend) 865 static inline void 866 ua16(unsigned char* view, 867 const Sized_relobj_file<size, big_endian>* object, 868 const Symbol_value<size>* psymval, 869 typename elfcpp::Elf_types<size>::Elf_Addr addend) 870 { 871 This::template rela_ua<16>(view, 0, 0xffff, object, psymval, addend); 872 } 873 874 // R_SPARC_UA32: (Symbol + Addend) 875 static inline void 876 ua32(unsigned char* view, 877 const Sized_relobj_file<size, big_endian>* object, 878 const Symbol_value<size>* psymval, 879 typename elfcpp::Elf_types<size>::Elf_Addr addend) 880 { 881 This::template rela_ua<32>(view, 0, 0xffffffff, object, psymval, addend); 882 } 883 884 // R_SPARC_UA64: (Symbol + Addend) 885 static inline void 886 ua64(unsigned char* view, 887 const Sized_relobj_file<size, big_endian>* object, 888 const Symbol_value<size>* psymval, 889 typename elfcpp::Elf_types<size>::Elf_Addr addend) 890 { 891 This::template rela_ua<64>(view, 0, ~(elfcpp::Elf_Xword) 0, 892 object, psymval, addend); 893 } 894 895 // R_SPARC_DISP8: (Symbol + Addend - Address) 896 static inline void 897 disp8(unsigned char* view, 898 const Sized_relobj_file<size, big_endian>* object, 899 const Symbol_value<size>* psymval, 900 typename elfcpp::Elf_types<size>::Elf_Addr addend, 901 typename elfcpp::Elf_types<size>::Elf_Addr address) 902 { 903 This::template pcrela_unaligned<8>(view, object, psymval, 904 addend, address); 905 } 906 907 // R_SPARC_DISP16: (Symbol + Addend - Address) 908 static inline void 909 disp16(unsigned char* view, 910 const Sized_relobj_file<size, big_endian>* object, 911 const Symbol_value<size>* psymval, 912 typename elfcpp::Elf_types<size>::Elf_Addr addend, 913 typename elfcpp::Elf_types<size>::Elf_Addr address) 914 { 915 This::template pcrela_unaligned<16>(view, object, psymval, 916 addend, address); 917 } 918 919 // R_SPARC_DISP32: (Symbol + Addend - Address) 920 static inline void 921 disp32(unsigned char* view, 922 const Sized_relobj_file<size, big_endian>* object, 923 const Symbol_value<size>* psymval, 924 typename elfcpp::Elf_types<size>::Elf_Addr addend, 925 typename elfcpp::Elf_types<size>::Elf_Addr address) 926 { 927 This::template pcrela_unaligned<32>(view, object, psymval, 928 addend, address); 929 } 930 931 // R_SPARC_DISP64: (Symbol + Addend - Address) 932 static inline void 933 disp64(unsigned char* view, 934 const Sized_relobj_file<size, big_endian>* object, 935 const Symbol_value<size>* psymval, 936 elfcpp::Elf_Xword addend, 937 typename elfcpp::Elf_types<size>::Elf_Addr address) 938 { 939 This::template pcrela_unaligned<64>(view, object, psymval, 940 addend, address); 941 } 942 943 // R_SPARC_H34: (Symbol + Addend) >> 12 944 static inline void 945 h34(unsigned char* view, 946 const Sized_relobj_file<size, big_endian>* object, 947 const Symbol_value<size>* psymval, 948 typename elfcpp::Elf_types<size>::Elf_Addr addend) 949 { 950 This_insn::template rela<32>(view, 12, 0x003fffff, object, psymval, addend); 951 } 952 953 // R_SPARC_H44: (Symbol + Addend) >> 22 954 static inline void 955 h44(unsigned char* view, 956 const Sized_relobj_file<size, big_endian>* object, 957 const Symbol_value<size>* psymval, 958 typename elfcpp::Elf_types<size>::Elf_Addr addend) 959 { 960 This_insn::template rela<32>(view, 22, 0x003fffff, object, psymval, addend); 961 } 962 963 // R_SPARC_M44: ((Symbol + Addend) >> 12) & 0x3ff 964 static inline void 965 m44(unsigned char* view, 966 const Sized_relobj_file<size, big_endian>* object, 967 const Symbol_value<size>* psymval, 968 typename elfcpp::Elf_types<size>::Elf_Addr addend) 969 { 970 This_insn::template rela<32>(view, 12, 0x000003ff, object, psymval, addend); 971 } 972 973 // R_SPARC_L44: (Symbol + Addend) & 0xfff 974 static inline void 975 l44(unsigned char* view, 976 const Sized_relobj_file<size, big_endian>* object, 977 const Symbol_value<size>* psymval, 978 typename elfcpp::Elf_types<size>::Elf_Addr addend) 979 { 980 This_insn::template rela<32>(view, 0, 0x00000fff, object, psymval, addend); 981 } 982 983 // R_SPARC_HH22: (Symbol + Addend) >> 42 984 static inline void 985 hh22(unsigned char* view, 986 const Sized_relobj_file<size, big_endian>* object, 987 const Symbol_value<size>* psymval, 988 typename elfcpp::Elf_types<size>::Elf_Addr addend) 989 { 990 This_insn::template rela<32>(view, 42, 0x003fffff, object, psymval, addend); 991 } 992 993 // R_SPARC_PC_HH22: (Symbol + Addend - Address) >> 42 994 static inline void 995 pc_hh22(unsigned char* view, 996 const Sized_relobj_file<size, big_endian>* object, 997 const Symbol_value<size>* psymval, 998 typename elfcpp::Elf_types<size>::Elf_Addr addend, 999 typename elfcpp::Elf_types<size>::Elf_Addr address) 1000 { 1001 This_insn::template pcrela<32>(view, 42, 0x003fffff, object, 1002 psymval, addend, address); 1003 } 1004 1005 // R_SPARC_HM10: ((Symbol + Addend) >> 32) & 0x3ff 1006 static inline void 1007 hm10(unsigned char* view, 1008 const Sized_relobj_file<size, big_endian>* object, 1009 const Symbol_value<size>* psymval, 1010 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1011 { 1012 This_insn::template rela<32>(view, 32, 0x000003ff, object, psymval, addend); 1013 } 1014 1015 // R_SPARC_PC_HM10: ((Symbol + Addend - Address) >> 32) & 0x3ff 1016 static inline void 1017 pc_hm10(unsigned char* view, 1018 const Sized_relobj_file<size, big_endian>* object, 1019 const Symbol_value<size>* psymval, 1020 typename elfcpp::Elf_types<size>::Elf_Addr addend, 1021 typename elfcpp::Elf_types<size>::Elf_Addr address) 1022 { 1023 This_insn::template pcrela<32>(view, 32, 0x000003ff, object, 1024 psymval, addend, address); 1025 } 1026 1027 // R_SPARC_11: (Symbol + Addend) 1028 static inline void 1029 rela32_11(unsigned char* view, 1030 const Sized_relobj_file<size, big_endian>* object, 1031 const Symbol_value<size>* psymval, 1032 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1033 { 1034 This_insn::template rela<32>(view, 0, 0x000007ff, object, psymval, addend); 1035 } 1036 1037 // R_SPARC_10: (Symbol + Addend) 1038 static inline void 1039 rela32_10(unsigned char* view, 1040 const Sized_relobj_file<size, big_endian>* object, 1041 const Symbol_value<size>* psymval, 1042 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1043 { 1044 This_insn::template rela<32>(view, 0, 0x000003ff, object, psymval, addend); 1045 } 1046 1047 // R_SPARC_7: (Symbol + Addend) 1048 static inline void 1049 rela32_7(unsigned char* view, 1050 const Sized_relobj_file<size, big_endian>* object, 1051 const Symbol_value<size>* psymval, 1052 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1053 { 1054 This_insn::template rela<32>(view, 0, 0x0000007f, object, psymval, addend); 1055 } 1056 1057 // R_SPARC_6: (Symbol + Addend) 1058 static inline void 1059 rela32_6(unsigned char* view, 1060 const Sized_relobj_file<size, big_endian>* object, 1061 const Symbol_value<size>* psymval, 1062 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1063 { 1064 This_insn::template rela<32>(view, 0, 0x0000003f, object, psymval, addend); 1065 } 1066 1067 // R_SPARC_5: (Symbol + Addend) 1068 static inline void 1069 rela32_5(unsigned char* view, 1070 const Sized_relobj_file<size, big_endian>* object, 1071 const Symbol_value<size>* psymval, 1072 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1073 { 1074 This_insn::template rela<32>(view, 0, 0x0000001f, object, psymval, addend); 1075 } 1076 1077 // R_SPARC_TLS_LDO_HIX22: @dtpoff(Symbol + Addend) >> 10 1078 static inline void 1079 ldo_hix22(unsigned char* view, 1080 typename elfcpp::Elf_types<size>::Elf_Addr value, 1081 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1082 { 1083 This_insn::hi22(view, value, addend); 1084 } 1085 1086 // R_SPARC_TLS_LDO_LOX10: @dtpoff(Symbol + Addend) & 0x3ff 1087 static inline void 1088 ldo_lox10(unsigned char* view, 1089 typename elfcpp::Elf_types<size>::Elf_Addr value, 1090 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1091 { 1092 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 1093 Valtype* wv = reinterpret_cast<Valtype*>(view); 1094 Valtype val = elfcpp::Swap<32, true>::readval(wv); 1095 Valtype reloc = (value + addend); 1096 1097 val &= ~0x1fff; 1098 reloc &= 0x3ff; 1099 1100 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 1101 } 1102 1103 // R_SPARC_TLS_LE_HIX22: (@tpoff(Symbol + Addend) ^ 0xffffffffffffffff) >> 10 1104 static inline void 1105 hix22(unsigned char* view, 1106 typename elfcpp::Elf_types<size>::Elf_Addr value, 1107 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1108 { 1109 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 1110 Valtype* wv = reinterpret_cast<Valtype*>(view); 1111 Valtype val = elfcpp::Swap<32, true>::readval(wv); 1112 Valtype reloc = (value + addend); 1113 1114 val &= ~0x3fffff; 1115 1116 reloc ^= ~(Valtype)0; 1117 reloc >>= 10; 1118 1119 reloc &= 0x3fffff; 1120 1121 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 1122 } 1123 1124 // R_SPARC_GOTDATA_OP_HIX22: @gdopoff(Symbol + Addend) >> 10 1125 static inline void 1126 gdop_hix22(unsigned char* view, 1127 typename elfcpp::Elf_types<size>::Elf_Addr value) 1128 { 1129 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 1130 Valtype* wv = reinterpret_cast<Valtype*>(view); 1131 Valtype val = elfcpp::Swap<32, true>::readval(wv); 1132 int32_t reloc = static_cast<int32_t>(value); 1133 1134 val &= ~0x3fffff; 1135 1136 if (reloc < 0) 1137 reloc ^= ~static_cast<int32_t>(0); 1138 reloc >>= 10; 1139 1140 reloc &= 0x3fffff; 1141 1142 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 1143 } 1144 1145 // R_SPARC_HIX22: ((Symbol + Addend) ^ 0xffffffffffffffff) >> 10 1146 static inline void 1147 hix22(unsigned char* view, 1148 const Sized_relobj_file<size, big_endian>* object, 1149 const Symbol_value<size>* psymval, 1150 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1151 { 1152 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 1153 Valtype* wv = reinterpret_cast<Valtype*>(view); 1154 Valtype val = elfcpp::Swap<32, true>::readval(wv); 1155 Valtype reloc = psymval->value(object, addend); 1156 1157 val &= ~0x3fffff; 1158 1159 reloc ^= ~(Valtype)0; 1160 reloc >>= 10; 1161 1162 reloc &= 0x3fffff; 1163 1164 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 1165 } 1166 1167 1168 // R_SPARC_TLS_LE_LOX10: (@tpoff(Symbol + Addend) & 0x3ff) | 0x1c00 1169 static inline void 1170 lox10(unsigned char* view, 1171 typename elfcpp::Elf_types<size>::Elf_Addr value, 1172 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1173 { 1174 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 1175 Valtype* wv = reinterpret_cast<Valtype*>(view); 1176 Valtype val = elfcpp::Swap<32, true>::readval(wv); 1177 Valtype reloc = (value + addend); 1178 1179 val &= ~0x1fff; 1180 reloc &= 0x3ff; 1181 reloc |= 0x1c00; 1182 1183 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 1184 } 1185 1186 // R_SPARC_GOTDATA_OP_LOX10: (@gdopoff(Symbol + Addend) & 0x3ff) | 0x1c00 1187 static inline void 1188 gdop_lox10(unsigned char* view, 1189 typename elfcpp::Elf_types<size>::Elf_Addr value) 1190 { 1191 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 1192 Valtype* wv = reinterpret_cast<Valtype*>(view); 1193 Valtype val = elfcpp::Swap<32, true>::readval(wv); 1194 int32_t reloc = static_cast<int32_t>(value); 1195 1196 if (reloc < 0) 1197 reloc = (reloc & 0x3ff) | 0x1c00; 1198 else 1199 reloc = (reloc & 0x3ff); 1200 1201 val &= ~0x1fff; 1202 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 1203 } 1204 1205 // R_SPARC_LOX10: ((Symbol + Addend) & 0x3ff) | 0x1c00 1206 static inline void 1207 lox10(unsigned char* view, 1208 const Sized_relobj_file<size, big_endian>* object, 1209 const Symbol_value<size>* psymval, 1210 typename elfcpp::Elf_types<size>::Elf_Addr addend) 1211 { 1212 typedef typename elfcpp::Swap<32, true>::Valtype Valtype; 1213 Valtype* wv = reinterpret_cast<Valtype*>(view); 1214 Valtype val = elfcpp::Swap<32, true>::readval(wv); 1215 Valtype reloc = psymval->value(object, addend); 1216 1217 val &= ~0x1fff; 1218 reloc &= 0x3ff; 1219 reloc |= 0x1c00; 1220 1221 elfcpp::Swap<32, true>::writeval(wv, val | reloc); 1222 } 1223 }; 1224 1225 // Get the GOT section, creating it if necessary. 1226 1227 template<int size, bool big_endian> 1228 Output_data_got<size, big_endian>* 1229 Target_sparc<size, big_endian>::got_section(Symbol_table* symtab, 1230 Layout* layout) 1231 { 1232 if (this->got_ == NULL) 1233 { 1234 gold_assert(symtab != NULL && layout != NULL); 1235 1236 this->got_ = new Output_data_got<size, big_endian>(); 1237 1238 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 1239 (elfcpp::SHF_ALLOC 1240 | elfcpp::SHF_WRITE), 1241 this->got_, ORDER_RELRO, true); 1242 1243 // Define _GLOBAL_OFFSET_TABLE_ at the start of the .got section. 1244 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL, 1245 Symbol_table::PREDEFINED, 1246 this->got_, 1247 0, 0, elfcpp::STT_OBJECT, 1248 elfcpp::STB_LOCAL, 1249 elfcpp::STV_HIDDEN, 0, 1250 false, false); 1251 } 1252 1253 return this->got_; 1254 } 1255 1256 // Get the dynamic reloc section, creating it if necessary. 1257 1258 template<int size, bool big_endian> 1259 typename Target_sparc<size, big_endian>::Reloc_section* 1260 Target_sparc<size, big_endian>::rela_dyn_section(Layout* layout) 1261 { 1262 if (this->rela_dyn_ == NULL) 1263 { 1264 gold_assert(layout != NULL); 1265 this->rela_dyn_ = new Reloc_section(parameters->options().combreloc()); 1266 layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA, 1267 elfcpp::SHF_ALLOC, this->rela_dyn_, 1268 ORDER_DYNAMIC_RELOCS, false); 1269 } 1270 return this->rela_dyn_; 1271 } 1272 1273 // Get the section to use for IFUNC relocs, creating it if 1274 // necessary. These go in .rela.dyn, but only after all other dynamic 1275 // relocations. They need to follow the other dynamic relocations so 1276 // that they can refer to global variables initialized by those 1277 // relocs. 1278 1279 template<int size, bool big_endian> 1280 typename Target_sparc<size, big_endian>::Reloc_section* 1281 Target_sparc<size, big_endian>::rela_ifunc_section(Layout* layout) 1282 { 1283 if (this->rela_ifunc_ == NULL) 1284 { 1285 // Make sure we have already created the dynamic reloc section. 1286 this->rela_dyn_section(layout); 1287 this->rela_ifunc_ = new Reloc_section(false); 1288 layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA, 1289 elfcpp::SHF_ALLOC, this->rela_ifunc_, 1290 ORDER_DYNAMIC_RELOCS, false); 1291 gold_assert(this->rela_dyn_->output_section() 1292 == this->rela_ifunc_->output_section()); 1293 } 1294 return this->rela_ifunc_; 1295 } 1296 1297 // A class to handle the PLT data. 1298 1299 template<int size, bool big_endian> 1300 class Output_data_plt_sparc : public Output_section_data 1301 { 1302 public: 1303 typedef Output_data_reloc<elfcpp::SHT_RELA, true, 1304 size, big_endian> Reloc_section; 1305 1306 Output_data_plt_sparc(Layout*); 1307 1308 // Add an entry to the PLT. 1309 void add_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym); 1310 1311 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol. 1312 unsigned int 1313 add_local_ifunc_entry(Symbol_table*, Layout*, 1314 Sized_relobj_file<size, big_endian>* relobj, 1315 unsigned int local_sym_index); 1316 1317 // Return the .rela.plt section data. 1318 const Reloc_section* rel_plt() const 1319 { 1320 return this->rel_; 1321 } 1322 1323 // Return where the IFUNC relocations should go. 1324 Reloc_section* 1325 rela_ifunc(Symbol_table*, Layout*); 1326 1327 void 1328 emit_pending_ifunc_relocs(); 1329 1330 // Return whether we created a section for IFUNC relocations. 1331 bool 1332 has_ifunc_section() const 1333 { return this->ifunc_rel_ != NULL; } 1334 1335 // Return the number of PLT entries. 1336 unsigned int 1337 entry_count() const 1338 { return this->count_ + this->ifunc_count_; } 1339 1340 // Return the offset of the first non-reserved PLT entry. 1341 static unsigned int 1342 first_plt_entry_offset() 1343 { return 4 * base_plt_entry_size; } 1344 1345 // Return the size of a PLT entry. 1346 static unsigned int 1347 get_plt_entry_size() 1348 { return base_plt_entry_size; } 1349 1350 // Return the PLT address to use for a global symbol. 1351 uint64_t 1352 address_for_global(const Symbol*); 1353 1354 // Return the PLT address to use for a local symbol. 1355 uint64_t 1356 address_for_local(const Relobj*, unsigned int symndx); 1357 1358 protected: 1359 void do_adjust_output_section(Output_section* os); 1360 1361 // Write to a map file. 1362 void 1363 do_print_to_mapfile(Mapfile* mapfile) const 1364 { mapfile->print_output_data(this, _("** PLT")); } 1365 1366 private: 1367 // The size of an entry in the PLT. 1368 static const int base_plt_entry_size = (size == 32 ? 12 : 32); 1369 1370 static const unsigned int plt_entries_per_block = 160; 1371 static const unsigned int plt_insn_chunk_size = 24; 1372 static const unsigned int plt_pointer_chunk_size = 8; 1373 static const unsigned int plt_block_size = 1374 (plt_entries_per_block 1375 * (plt_insn_chunk_size + plt_pointer_chunk_size)); 1376 1377 section_offset_type 1378 plt_index_to_offset(unsigned int index) 1379 { 1380 section_offset_type offset; 1381 1382 if (size == 32 || index < 32768) 1383 offset = index * base_plt_entry_size; 1384 else 1385 { 1386 unsigned int ext_index = index - 32768; 1387 1388 offset = (32768 * base_plt_entry_size) 1389 + ((ext_index / plt_entries_per_block) 1390 * plt_block_size) 1391 + ((ext_index % plt_entries_per_block) 1392 * plt_insn_chunk_size); 1393 } 1394 return offset; 1395 } 1396 1397 // Set the final size. 1398 void 1399 set_final_data_size() 1400 { 1401 unsigned int full_count = this->entry_count() + 4; 1402 unsigned int extra = (size == 32 ? 4 : 0); 1403 section_offset_type sz = plt_index_to_offset(full_count) + extra; 1404 1405 return this->set_data_size(sz); 1406 } 1407 1408 // Write out the PLT data. 1409 void 1410 do_write(Output_file*); 1411 1412 struct Global_ifunc 1413 { 1414 Reloc_section* rel; 1415 Symbol* gsym; 1416 unsigned int plt_index; 1417 }; 1418 1419 struct Local_ifunc 1420 { 1421 Reloc_section* rel; 1422 Sized_relobj_file<size, big_endian>* object; 1423 unsigned int local_sym_index; 1424 unsigned int plt_index; 1425 }; 1426 1427 // The reloc section. 1428 Reloc_section* rel_; 1429 // The IFUNC relocations, if necessary. These must follow the 1430 // regular relocations. 1431 Reloc_section* ifunc_rel_; 1432 // The number of PLT entries. 1433 unsigned int count_; 1434 // The number of PLT entries for IFUNC symbols. 1435 unsigned int ifunc_count_; 1436 // Global STT_GNU_IFUNC symbols. 1437 std::vector<Global_ifunc> global_ifuncs_; 1438 // Local STT_GNU_IFUNC symbols. 1439 std::vector<Local_ifunc> local_ifuncs_; 1440 }; 1441 1442 // Define the constants as required by C++ standard. 1443 1444 template<int size, bool big_endian> 1445 const int Output_data_plt_sparc<size, big_endian>::base_plt_entry_size; 1446 1447 template<int size, bool big_endian> 1448 const unsigned int 1449 Output_data_plt_sparc<size, big_endian>::plt_entries_per_block; 1450 1451 template<int size, bool big_endian> 1452 const unsigned int Output_data_plt_sparc<size, big_endian>::plt_insn_chunk_size; 1453 1454 template<int size, bool big_endian> 1455 const unsigned int 1456 Output_data_plt_sparc<size, big_endian>::plt_pointer_chunk_size; 1457 1458 template<int size, bool big_endian> 1459 const unsigned int Output_data_plt_sparc<size, big_endian>::plt_block_size; 1460 1461 // Create the PLT section. The ordinary .got section is an argument, 1462 // since we need to refer to the start. 1463 1464 template<int size, bool big_endian> 1465 Output_data_plt_sparc<size, big_endian>::Output_data_plt_sparc(Layout* layout) 1466 : Output_section_data(size == 32 ? 4 : 8), ifunc_rel_(NULL), 1467 count_(0), ifunc_count_(0), global_ifuncs_(), local_ifuncs_() 1468 { 1469 this->rel_ = new Reloc_section(false); 1470 layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA, 1471 elfcpp::SHF_ALLOC, this->rel_, 1472 ORDER_DYNAMIC_PLT_RELOCS, false); 1473 } 1474 1475 template<int size, bool big_endian> 1476 void 1477 Output_data_plt_sparc<size, big_endian>::do_adjust_output_section(Output_section* os) 1478 { 1479 os->set_entsize(0); 1480 } 1481 1482 // Add an entry to the PLT. 1483 1484 template<int size, bool big_endian> 1485 void 1486 Output_data_plt_sparc<size, big_endian>::add_entry(Symbol_table* symtab, 1487 Layout* layout, 1488 Symbol* gsym) 1489 { 1490 gold_assert(!gsym->has_plt_offset()); 1491 1492 section_offset_type plt_offset; 1493 unsigned int index; 1494 1495 if (gsym->type() == elfcpp::STT_GNU_IFUNC 1496 && gsym->can_use_relative_reloc(false)) 1497 { 1498 index = this->ifunc_count_; 1499 plt_offset = plt_index_to_offset(index); 1500 gsym->set_plt_offset(plt_offset); 1501 ++this->ifunc_count_; 1502 Reloc_section* rel = this->rela_ifunc(symtab, layout); 1503 1504 struct Global_ifunc gi; 1505 gi.rel = rel; 1506 gi.gsym = gsym; 1507 gi.plt_index = index; 1508 this->global_ifuncs_.push_back(gi); 1509 } 1510 else 1511 { 1512 plt_offset = plt_index_to_offset(this->count_ + 4); 1513 gsym->set_plt_offset(plt_offset); 1514 ++this->count_; 1515 gsym->set_needs_dynsym_entry(); 1516 this->rel_->add_global(gsym, elfcpp::R_SPARC_JMP_SLOT, this, 1517 plt_offset, 0); 1518 } 1519 1520 // Note that we don't need to save the symbol. The contents of the 1521 // PLT are independent of which symbols are used. The symbols only 1522 // appear in the relocations. 1523 } 1524 1525 template<int size, bool big_endian> 1526 unsigned int 1527 Output_data_plt_sparc<size, big_endian>::add_local_ifunc_entry( 1528 Symbol_table* symtab, 1529 Layout* layout, 1530 Sized_relobj_file<size, big_endian>* relobj, 1531 unsigned int local_sym_index) 1532 { 1533 unsigned int index = this->ifunc_count_; 1534 section_offset_type plt_offset; 1535 1536 plt_offset = plt_index_to_offset(index); 1537 ++this->ifunc_count_; 1538 1539 Reloc_section* rel = this->rela_ifunc(symtab, layout); 1540 1541 struct Local_ifunc li; 1542 li.rel = rel; 1543 li.object = relobj; 1544 li.local_sym_index = local_sym_index; 1545 li.plt_index = index; 1546 this->local_ifuncs_.push_back(li); 1547 1548 return plt_offset; 1549 } 1550 1551 // Emit any pending IFUNC plt relocations. 1552 1553 template<int size, bool big_endian> 1554 void 1555 Output_data_plt_sparc<size, big_endian>::emit_pending_ifunc_relocs() 1556 { 1557 // Emit any pending IFUNC relocs. 1558 for (typename std::vector<Global_ifunc>::const_iterator p = 1559 this->global_ifuncs_.begin(); 1560 p != this->global_ifuncs_.end(); 1561 ++p) 1562 { 1563 section_offset_type plt_offset; 1564 unsigned int index; 1565 1566 index = this->count_ + p->plt_index + 4; 1567 plt_offset = this->plt_index_to_offset(index); 1568 p->rel->add_symbolless_global_addend(p->gsym, elfcpp::R_SPARC_JMP_IREL, 1569 this, plt_offset, 0); 1570 } 1571 1572 for (typename std::vector<Local_ifunc>::const_iterator p = 1573 this->local_ifuncs_.begin(); 1574 p != this->local_ifuncs_.end(); 1575 ++p) 1576 { 1577 section_offset_type plt_offset; 1578 unsigned int index; 1579 1580 index = this->count_ + p->plt_index + 4; 1581 plt_offset = this->plt_index_to_offset(index); 1582 p->rel->add_symbolless_local_addend(p->object, p->local_sym_index, 1583 elfcpp::R_SPARC_JMP_IREL, 1584 this, plt_offset, 0); 1585 } 1586 } 1587 1588 // Return where the IFUNC relocations should go in the PLT. These 1589 // follow the non-IFUNC relocations. 1590 1591 template<int size, bool big_endian> 1592 typename Output_data_plt_sparc<size, big_endian>::Reloc_section* 1593 Output_data_plt_sparc<size, big_endian>::rela_ifunc( 1594 Symbol_table* symtab, 1595 Layout* layout) 1596 { 1597 if (this->ifunc_rel_ == NULL) 1598 { 1599 this->ifunc_rel_ = new Reloc_section(false); 1600 layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA, 1601 elfcpp::SHF_ALLOC, this->ifunc_rel_, 1602 ORDER_DYNAMIC_PLT_RELOCS, false); 1603 gold_assert(this->ifunc_rel_->output_section() 1604 == this->rel_->output_section()); 1605 1606 if (parameters->doing_static_link()) 1607 { 1608 // A statically linked executable will only have a .rel.plt 1609 // section to hold R_SPARC_IRELATIVE and R_SPARC_JMP_IREL 1610 // relocs for STT_GNU_IFUNC symbols. The library will use 1611 // these symbols to locate the IRELATIVE and JMP_IREL relocs 1612 // at program startup time. 1613 symtab->define_in_output_data("__rela_iplt_start", NULL, 1614 Symbol_table::PREDEFINED, 1615 this->ifunc_rel_, 0, 0, 1616 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, 1617 elfcpp::STV_HIDDEN, 0, false, true); 1618 symtab->define_in_output_data("__rela_iplt_end", NULL, 1619 Symbol_table::PREDEFINED, 1620 this->ifunc_rel_, 0, 0, 1621 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, 1622 elfcpp::STV_HIDDEN, 0, true, true); 1623 } 1624 } 1625 return this->ifunc_rel_; 1626 } 1627 1628 // Return the PLT address to use for a global symbol. 1629 1630 template<int size, bool big_endian> 1631 uint64_t 1632 Output_data_plt_sparc<size, big_endian>::address_for_global(const Symbol* gsym) 1633 { 1634 uint64_t offset = 0; 1635 if (gsym->type() == elfcpp::STT_GNU_IFUNC 1636 && gsym->can_use_relative_reloc(false)) 1637 offset = plt_index_to_offset(this->count_ + 4); 1638 return this->address() + offset + gsym->plt_offset(); 1639 } 1640 1641 // Return the PLT address to use for a local symbol. These are always 1642 // IRELATIVE relocs. 1643 1644 template<int size, bool big_endian> 1645 uint64_t 1646 Output_data_plt_sparc<size, big_endian>::address_for_local( 1647 const Relobj* object, 1648 unsigned int r_sym) 1649 { 1650 return (this->address() 1651 + plt_index_to_offset(this->count_ + 4) 1652 + object->local_plt_offset(r_sym)); 1653 } 1654 1655 static const unsigned int sparc_nop = 0x01000000; 1656 static const unsigned int sparc_sethi_g1 = 0x03000000; 1657 static const unsigned int sparc_branch_always = 0x30800000; 1658 static const unsigned int sparc_branch_always_pt = 0x30680000; 1659 static const unsigned int sparc_mov = 0x80100000; 1660 static const unsigned int sparc_mov_g0_o0 = 0x90100000; 1661 static const unsigned int sparc_mov_o7_g5 = 0x8a10000f; 1662 static const unsigned int sparc_call_plus_8 = 0x40000002; 1663 static const unsigned int sparc_ldx_o7_imm_g1 = 0xc25be000; 1664 static const unsigned int sparc_jmpl_o7_g1_g1 = 0x83c3c001; 1665 static const unsigned int sparc_mov_g5_o7 = 0x9e100005; 1666 1667 // Write out the PLT. 1668 1669 template<int size, bool big_endian> 1670 void 1671 Output_data_plt_sparc<size, big_endian>::do_write(Output_file* of) 1672 { 1673 const off_t offset = this->offset(); 1674 const section_size_type oview_size = 1675 convert_to_section_size_type(this->data_size()); 1676 unsigned char* const oview = of->get_output_view(offset, oview_size); 1677 unsigned char* pov = oview; 1678 1679 memset(pov, 0, base_plt_entry_size * 4); 1680 pov += this->first_plt_entry_offset(); 1681 1682 unsigned int plt_offset = base_plt_entry_size * 4; 1683 const unsigned int count = this->entry_count(); 1684 1685 if (size == 64) 1686 { 1687 unsigned int limit; 1688 1689 limit = (count > 32768 ? 32768 : count); 1690 1691 for (unsigned int i = 0; i < limit; ++i) 1692 { 1693 elfcpp::Swap<32, true>::writeval(pov + 0x00, 1694 sparc_sethi_g1 + plt_offset); 1695 elfcpp::Swap<32, true>::writeval(pov + 0x04, 1696 sparc_branch_always_pt + 1697 (((base_plt_entry_size - 1698 (plt_offset + 4)) >> 2) & 1699 0x7ffff)); 1700 elfcpp::Swap<32, true>::writeval(pov + 0x08, sparc_nop); 1701 elfcpp::Swap<32, true>::writeval(pov + 0x0c, sparc_nop); 1702 elfcpp::Swap<32, true>::writeval(pov + 0x10, sparc_nop); 1703 elfcpp::Swap<32, true>::writeval(pov + 0x14, sparc_nop); 1704 elfcpp::Swap<32, true>::writeval(pov + 0x18, sparc_nop); 1705 elfcpp::Swap<32, true>::writeval(pov + 0x1c, sparc_nop); 1706 1707 pov += base_plt_entry_size; 1708 plt_offset += base_plt_entry_size; 1709 } 1710 1711 if (count > 32768) 1712 { 1713 unsigned int ext_cnt = count - 32768; 1714 unsigned int blks = ext_cnt / plt_entries_per_block; 1715 1716 for (unsigned int i = 0; i < blks; ++i) 1717 { 1718 unsigned int data_off = (plt_entries_per_block 1719 * plt_insn_chunk_size) - 4; 1720 1721 for (unsigned int j = 0; j < plt_entries_per_block; ++j) 1722 { 1723 elfcpp::Swap<32, true>::writeval(pov + 0x00, 1724 sparc_mov_o7_g5); 1725 elfcpp::Swap<32, true>::writeval(pov + 0x04, 1726 sparc_call_plus_8); 1727 elfcpp::Swap<32, true>::writeval(pov + 0x08, 1728 sparc_nop); 1729 elfcpp::Swap<32, true>::writeval(pov + 0x0c, 1730 sparc_ldx_o7_imm_g1 + 1731 (data_off & 0x1fff)); 1732 elfcpp::Swap<32, true>::writeval(pov + 0x10, 1733 sparc_jmpl_o7_g1_g1); 1734 elfcpp::Swap<32, true>::writeval(pov + 0x14, 1735 sparc_mov_g5_o7); 1736 1737 elfcpp::Swap<64, big_endian>::writeval( 1738 pov + 0x4 + data_off, 1739 (elfcpp::Elf_Xword) (oview - (pov + 0x04))); 1740 1741 pov += plt_insn_chunk_size; 1742 data_off -= 16; 1743 } 1744 } 1745 1746 unsigned int sub_blk_cnt = ext_cnt % plt_entries_per_block; 1747 for (unsigned int i = 0; i < sub_blk_cnt; ++i) 1748 { 1749 unsigned int data_off = (sub_blk_cnt 1750 * plt_insn_chunk_size) - 4; 1751 1752 for (unsigned int j = 0; j < plt_entries_per_block; ++j) 1753 { 1754 elfcpp::Swap<32, true>::writeval(pov + 0x00, 1755 sparc_mov_o7_g5); 1756 elfcpp::Swap<32, true>::writeval(pov + 0x04, 1757 sparc_call_plus_8); 1758 elfcpp::Swap<32, true>::writeval(pov + 0x08, 1759 sparc_nop); 1760 elfcpp::Swap<32, true>::writeval(pov + 0x0c, 1761 sparc_ldx_o7_imm_g1 + 1762 (data_off & 0x1fff)); 1763 elfcpp::Swap<32, true>::writeval(pov + 0x10, 1764 sparc_jmpl_o7_g1_g1); 1765 elfcpp::Swap<32, true>::writeval(pov + 0x14, 1766 sparc_mov_g5_o7); 1767 1768 elfcpp::Swap<64, big_endian>::writeval( 1769 pov + 0x4 + data_off, 1770 (elfcpp::Elf_Xword) (oview - (pov + 0x04))); 1771 1772 pov += plt_insn_chunk_size; 1773 data_off -= 16; 1774 } 1775 } 1776 } 1777 } 1778 else 1779 { 1780 for (unsigned int i = 0; i < count; ++i) 1781 { 1782 elfcpp::Swap<32, true>::writeval(pov + 0x00, 1783 sparc_sethi_g1 + plt_offset); 1784 elfcpp::Swap<32, true>::writeval(pov + 0x04, 1785 sparc_branch_always + 1786 (((- (plt_offset + 4)) >> 2) & 1787 0x003fffff)); 1788 elfcpp::Swap<32, true>::writeval(pov + 0x08, sparc_nop); 1789 1790 pov += base_plt_entry_size; 1791 plt_offset += base_plt_entry_size; 1792 } 1793 1794 elfcpp::Swap<32, true>::writeval(pov, sparc_nop); 1795 pov += 4; 1796 } 1797 1798 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size); 1799 1800 of->write_output_view(offset, oview_size, oview); 1801 } 1802 1803 // Create the PLT section. 1804 1805 template<int size, bool big_endian> 1806 void 1807 Target_sparc<size, big_endian>::make_plt_section(Symbol_table* symtab, 1808 Layout* layout) 1809 { 1810 // Create the GOT sections first. 1811 this->got_section(symtab, layout); 1812 1813 // Ensure that .rela.dyn always appears before .rela.plt This is 1814 // necessary due to how, on Sparc and some other targets, .rela.dyn 1815 // needs to include .rela.plt in it's range. 1816 this->rela_dyn_section(layout); 1817 1818 this->plt_ = new Output_data_plt_sparc<size, big_endian>(layout); 1819 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS, 1820 (elfcpp::SHF_ALLOC 1821 | elfcpp::SHF_EXECINSTR 1822 | elfcpp::SHF_WRITE), 1823 this->plt_, ORDER_NON_RELRO_FIRST, false); 1824 1825 // Define _PROCEDURE_LINKAGE_TABLE_ at the start of the .plt section. 1826 symtab->define_in_output_data("_PROCEDURE_LINKAGE_TABLE_", NULL, 1827 Symbol_table::PREDEFINED, 1828 this->plt_, 1829 0, 0, elfcpp::STT_OBJECT, 1830 elfcpp::STB_LOCAL, 1831 elfcpp::STV_HIDDEN, 0, 1832 false, false); 1833 } 1834 1835 // Create a PLT entry for a global symbol. 1836 1837 template<int size, bool big_endian> 1838 void 1839 Target_sparc<size, big_endian>::make_plt_entry(Symbol_table* symtab, 1840 Layout* layout, 1841 Symbol* gsym) 1842 { 1843 if (gsym->has_plt_offset()) 1844 return; 1845 1846 if (this->plt_ == NULL) 1847 this->make_plt_section(symtab, layout); 1848 1849 this->plt_->add_entry(symtab, layout, gsym); 1850 } 1851 1852 // Make a PLT entry for a local STT_GNU_IFUNC symbol. 1853 1854 template<int size, bool big_endian> 1855 void 1856 Target_sparc<size, big_endian>::make_local_ifunc_plt_entry( 1857 Symbol_table* symtab, 1858 Layout* layout, 1859 Sized_relobj_file<size, big_endian>* relobj, 1860 unsigned int local_sym_index) 1861 { 1862 if (relobj->local_has_plt_offset(local_sym_index)) 1863 return; 1864 if (this->plt_ == NULL) 1865 this->make_plt_section(symtab, layout); 1866 unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout, 1867 relobj, 1868 local_sym_index); 1869 relobj->set_local_plt_offset(local_sym_index, plt_offset); 1870 } 1871 1872 // Return the number of entries in the PLT. 1873 1874 template<int size, bool big_endian> 1875 unsigned int 1876 Target_sparc<size, big_endian>::plt_entry_count() const 1877 { 1878 if (this->plt_ == NULL) 1879 return 0; 1880 return this->plt_->entry_count(); 1881 } 1882 1883 // Return the offset of the first non-reserved PLT entry. 1884 1885 template<int size, bool big_endian> 1886 unsigned int 1887 Target_sparc<size, big_endian>::first_plt_entry_offset() const 1888 { 1889 return Output_data_plt_sparc<size, big_endian>::first_plt_entry_offset(); 1890 } 1891 1892 // Return the size of each PLT entry. 1893 1894 template<int size, bool big_endian> 1895 unsigned int 1896 Target_sparc<size, big_endian>::plt_entry_size() const 1897 { 1898 return Output_data_plt_sparc<size, big_endian>::get_plt_entry_size(); 1899 } 1900 1901 // Create a GOT entry for the TLS module index. 1902 1903 template<int size, bool big_endian> 1904 unsigned int 1905 Target_sparc<size, big_endian>::got_mod_index_entry( 1906 Symbol_table* symtab, 1907 Layout* layout, 1908 Sized_relobj_file<size, big_endian>* object) 1909 { 1910 if (this->got_mod_index_offset_ == -1U) 1911 { 1912 gold_assert(symtab != NULL && layout != NULL && object != NULL); 1913 Reloc_section* rela_dyn = this->rela_dyn_section(layout); 1914 Output_data_got<size, big_endian>* got; 1915 unsigned int got_offset; 1916 1917 got = this->got_section(symtab, layout); 1918 got_offset = got->add_constant(0); 1919 rela_dyn->add_local(object, 0, 1920 (size == 64 ? 1921 elfcpp::R_SPARC_TLS_DTPMOD64 : 1922 elfcpp::R_SPARC_TLS_DTPMOD32), got, 1923 got_offset, 0); 1924 got->add_constant(0); 1925 this->got_mod_index_offset_ = got_offset; 1926 } 1927 return this->got_mod_index_offset_; 1928 } 1929 1930 // Optimize the TLS relocation type based on what we know about the 1931 // symbol. IS_FINAL is true if the final address of this symbol is 1932 // known at link time. 1933 1934 static tls::Tls_optimization 1935 optimize_tls_reloc(bool is_final, int r_type) 1936 { 1937 // If we are generating a shared library, then we can't do anything 1938 // in the linker. 1939 if (parameters->options().shared()) 1940 return tls::TLSOPT_NONE; 1941 1942 switch (r_type) 1943 { 1944 case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic 1945 case elfcpp::R_SPARC_TLS_GD_LO10: 1946 case elfcpp::R_SPARC_TLS_GD_ADD: 1947 case elfcpp::R_SPARC_TLS_GD_CALL: 1948 // These are General-Dynamic which permits fully general TLS 1949 // access. Since we know that we are generating an executable, 1950 // we can convert this to Initial-Exec. If we also know that 1951 // this is a local symbol, we can further switch to Local-Exec. 1952 if (is_final) 1953 return tls::TLSOPT_TO_LE; 1954 return tls::TLSOPT_TO_IE; 1955 1956 case elfcpp::R_SPARC_TLS_LDM_HI22: // Local-dynamic 1957 case elfcpp::R_SPARC_TLS_LDM_LO10: 1958 case elfcpp::R_SPARC_TLS_LDM_ADD: 1959 case elfcpp::R_SPARC_TLS_LDM_CALL: 1960 // This is Local-Dynamic, which refers to a local symbol in the 1961 // dynamic TLS block. Since we know that we generating an 1962 // executable, we can switch to Local-Exec. 1963 return tls::TLSOPT_TO_LE; 1964 1965 case elfcpp::R_SPARC_TLS_LDO_HIX22: // Alternate local-dynamic 1966 case elfcpp::R_SPARC_TLS_LDO_LOX10: 1967 case elfcpp::R_SPARC_TLS_LDO_ADD: 1968 // Another type of Local-Dynamic relocation. 1969 return tls::TLSOPT_TO_LE; 1970 1971 case elfcpp::R_SPARC_TLS_IE_HI22: // Initial-exec 1972 case elfcpp::R_SPARC_TLS_IE_LO10: 1973 case elfcpp::R_SPARC_TLS_IE_LD: 1974 case elfcpp::R_SPARC_TLS_IE_LDX: 1975 case elfcpp::R_SPARC_TLS_IE_ADD: 1976 // These are Initial-Exec relocs which get the thread offset 1977 // from the GOT. If we know that we are linking against the 1978 // local symbol, we can switch to Local-Exec, which links the 1979 // thread offset into the instruction. 1980 if (is_final) 1981 return tls::TLSOPT_TO_LE; 1982 return tls::TLSOPT_NONE; 1983 1984 case elfcpp::R_SPARC_TLS_LE_HIX22: // Local-exec 1985 case elfcpp::R_SPARC_TLS_LE_LOX10: 1986 // When we already have Local-Exec, there is nothing further we 1987 // can do. 1988 return tls::TLSOPT_NONE; 1989 1990 default: 1991 gold_unreachable(); 1992 } 1993 } 1994 1995 // Get the Reference_flags for a particular relocation. 1996 1997 template<int size, bool big_endian> 1998 int 1999 Target_sparc<size, big_endian>::Scan::get_reference_flags(unsigned int r_type) 2000 { 2001 r_type &= 0xff; 2002 switch (r_type) 2003 { 2004 case elfcpp::R_SPARC_NONE: 2005 case elfcpp::R_SPARC_REGISTER: 2006 case elfcpp::R_SPARC_GNU_VTINHERIT: 2007 case elfcpp::R_SPARC_GNU_VTENTRY: 2008 // No symbol reference. 2009 return 0; 2010 2011 case elfcpp::R_SPARC_UA64: 2012 case elfcpp::R_SPARC_64: 2013 case elfcpp::R_SPARC_HIX22: 2014 case elfcpp::R_SPARC_LOX10: 2015 case elfcpp::R_SPARC_H34: 2016 case elfcpp::R_SPARC_H44: 2017 case elfcpp::R_SPARC_M44: 2018 case elfcpp::R_SPARC_L44: 2019 case elfcpp::R_SPARC_HH22: 2020 case elfcpp::R_SPARC_HM10: 2021 case elfcpp::R_SPARC_LM22: 2022 case elfcpp::R_SPARC_HI22: 2023 case elfcpp::R_SPARC_LO10: 2024 case elfcpp::R_SPARC_OLO10: 2025 case elfcpp::R_SPARC_UA32: 2026 case elfcpp::R_SPARC_32: 2027 case elfcpp::R_SPARC_UA16: 2028 case elfcpp::R_SPARC_16: 2029 case elfcpp::R_SPARC_11: 2030 case elfcpp::R_SPARC_10: 2031 case elfcpp::R_SPARC_8: 2032 case elfcpp::R_SPARC_7: 2033 case elfcpp::R_SPARC_6: 2034 case elfcpp::R_SPARC_5: 2035 return Symbol::ABSOLUTE_REF; 2036 2037 case elfcpp::R_SPARC_DISP8: 2038 case elfcpp::R_SPARC_DISP16: 2039 case elfcpp::R_SPARC_DISP32: 2040 case elfcpp::R_SPARC_DISP64: 2041 case elfcpp::R_SPARC_PC_HH22: 2042 case elfcpp::R_SPARC_PC_HM10: 2043 case elfcpp::R_SPARC_PC_LM22: 2044 case elfcpp::R_SPARC_PC10: 2045 case elfcpp::R_SPARC_PC22: 2046 case elfcpp::R_SPARC_WDISP30: 2047 case elfcpp::R_SPARC_WDISP22: 2048 case elfcpp::R_SPARC_WDISP19: 2049 case elfcpp::R_SPARC_WDISP16: 2050 case elfcpp::R_SPARC_WDISP10: 2051 return Symbol::RELATIVE_REF; 2052 2053 case elfcpp::R_SPARC_PLT64: 2054 case elfcpp::R_SPARC_PLT32: 2055 case elfcpp::R_SPARC_HIPLT22: 2056 case elfcpp::R_SPARC_LOPLT10: 2057 case elfcpp::R_SPARC_PCPLT10: 2058 return Symbol::FUNCTION_CALL | Symbol::ABSOLUTE_REF; 2059 2060 case elfcpp::R_SPARC_PCPLT32: 2061 case elfcpp::R_SPARC_PCPLT22: 2062 case elfcpp::R_SPARC_WPLT30: 2063 return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF; 2064 2065 case elfcpp::R_SPARC_GOTDATA_OP: 2066 case elfcpp::R_SPARC_GOTDATA_OP_HIX22: 2067 case elfcpp::R_SPARC_GOTDATA_OP_LOX10: 2068 case elfcpp::R_SPARC_GOT10: 2069 case elfcpp::R_SPARC_GOT13: 2070 case elfcpp::R_SPARC_GOT22: 2071 // Absolute in GOT. 2072 return Symbol::ABSOLUTE_REF; 2073 2074 case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic 2075 case elfcpp::R_SPARC_TLS_GD_LO10: 2076 case elfcpp::R_SPARC_TLS_GD_ADD: 2077 case elfcpp::R_SPARC_TLS_GD_CALL: 2078 case elfcpp::R_SPARC_TLS_LDM_HI22: // Local-dynamic 2079 case elfcpp::R_SPARC_TLS_LDM_LO10: 2080 case elfcpp::R_SPARC_TLS_LDM_ADD: 2081 case elfcpp::R_SPARC_TLS_LDM_CALL: 2082 case elfcpp::R_SPARC_TLS_LDO_HIX22: // Alternate local-dynamic 2083 case elfcpp::R_SPARC_TLS_LDO_LOX10: 2084 case elfcpp::R_SPARC_TLS_LDO_ADD: 2085 case elfcpp::R_SPARC_TLS_LE_HIX22: 2086 case elfcpp::R_SPARC_TLS_LE_LOX10: 2087 case elfcpp::R_SPARC_TLS_IE_HI22: // Initial-exec 2088 case elfcpp::R_SPARC_TLS_IE_LO10: 2089 case elfcpp::R_SPARC_TLS_IE_LD: 2090 case elfcpp::R_SPARC_TLS_IE_LDX: 2091 case elfcpp::R_SPARC_TLS_IE_ADD: 2092 return Symbol::TLS_REF; 2093 2094 case elfcpp::R_SPARC_COPY: 2095 case elfcpp::R_SPARC_GLOB_DAT: 2096 case elfcpp::R_SPARC_JMP_SLOT: 2097 case elfcpp::R_SPARC_JMP_IREL: 2098 case elfcpp::R_SPARC_RELATIVE: 2099 case elfcpp::R_SPARC_IRELATIVE: 2100 case elfcpp::R_SPARC_TLS_DTPMOD64: 2101 case elfcpp::R_SPARC_TLS_DTPMOD32: 2102 case elfcpp::R_SPARC_TLS_DTPOFF64: 2103 case elfcpp::R_SPARC_TLS_DTPOFF32: 2104 case elfcpp::R_SPARC_TLS_TPOFF64: 2105 case elfcpp::R_SPARC_TLS_TPOFF32: 2106 default: 2107 // Not expected. We will give an error later. 2108 return 0; 2109 } 2110 } 2111 2112 // Generate a PLT entry slot for a call to __tls_get_addr 2113 template<int size, bool big_endian> 2114 void 2115 Target_sparc<size, big_endian>::Scan::generate_tls_call(Symbol_table* symtab, 2116 Layout* layout, 2117 Target_sparc<size, big_endian>* target) 2118 { 2119 Symbol* gsym = target->tls_get_addr_sym(symtab); 2120 2121 target->make_plt_entry(symtab, layout, gsym); 2122 } 2123 2124 // Report an unsupported relocation against a local symbol. 2125 2126 template<int size, bool big_endian> 2127 void 2128 Target_sparc<size, big_endian>::Scan::unsupported_reloc_local( 2129 Sized_relobj_file<size, big_endian>* object, 2130 unsigned int r_type) 2131 { 2132 gold_error(_("%s: unsupported reloc %u against local symbol"), 2133 object->name().c_str(), r_type); 2134 } 2135 2136 // We are about to emit a dynamic relocation of type R_TYPE. If the 2137 // dynamic linker does not support it, issue an error. 2138 2139 template<int size, bool big_endian> 2140 void 2141 Target_sparc<size, big_endian>::Scan::check_non_pic(Relobj* object, unsigned int r_type) 2142 { 2143 gold_assert(r_type != elfcpp::R_SPARC_NONE); 2144 2145 if (size == 64) 2146 { 2147 switch (r_type) 2148 { 2149 // These are the relocation types supported by glibc for sparc 64-bit. 2150 case elfcpp::R_SPARC_RELATIVE: 2151 case elfcpp::R_SPARC_IRELATIVE: 2152 case elfcpp::R_SPARC_COPY: 2153 case elfcpp::R_SPARC_32: 2154 case elfcpp::R_SPARC_64: 2155 case elfcpp::R_SPARC_GLOB_DAT: 2156 case elfcpp::R_SPARC_JMP_SLOT: 2157 case elfcpp::R_SPARC_JMP_IREL: 2158 case elfcpp::R_SPARC_TLS_DTPMOD64: 2159 case elfcpp::R_SPARC_TLS_DTPOFF64: 2160 case elfcpp::R_SPARC_TLS_TPOFF64: 2161 case elfcpp::R_SPARC_TLS_LE_HIX22: 2162 case elfcpp::R_SPARC_TLS_LE_LOX10: 2163 case elfcpp::R_SPARC_8: 2164 case elfcpp::R_SPARC_16: 2165 case elfcpp::R_SPARC_DISP8: 2166 case elfcpp::R_SPARC_DISP16: 2167 case elfcpp::R_SPARC_DISP32: 2168 case elfcpp::R_SPARC_WDISP30: 2169 case elfcpp::R_SPARC_LO10: 2170 case elfcpp::R_SPARC_HI22: 2171 case elfcpp::R_SPARC_OLO10: 2172 case elfcpp::R_SPARC_H34: 2173 case elfcpp::R_SPARC_H44: 2174 case elfcpp::R_SPARC_M44: 2175 case elfcpp::R_SPARC_L44: 2176 case elfcpp::R_SPARC_HH22: 2177 case elfcpp::R_SPARC_HM10: 2178 case elfcpp::R_SPARC_LM22: 2179 case elfcpp::R_SPARC_UA16: 2180 case elfcpp::R_SPARC_UA32: 2181 case elfcpp::R_SPARC_UA64: 2182 return; 2183 2184 default: 2185 break; 2186 } 2187 } 2188 else 2189 { 2190 switch (r_type) 2191 { 2192 // These are the relocation types supported by glibc for sparc 32-bit. 2193 case elfcpp::R_SPARC_RELATIVE: 2194 case elfcpp::R_SPARC_IRELATIVE: 2195 case elfcpp::R_SPARC_COPY: 2196 case elfcpp::R_SPARC_GLOB_DAT: 2197 case elfcpp::R_SPARC_32: 2198 case elfcpp::R_SPARC_JMP_SLOT: 2199 case elfcpp::R_SPARC_JMP_IREL: 2200 case elfcpp::R_SPARC_TLS_DTPMOD32: 2201 case elfcpp::R_SPARC_TLS_DTPOFF32: 2202 case elfcpp::R_SPARC_TLS_TPOFF32: 2203 case elfcpp::R_SPARC_TLS_LE_HIX22: 2204 case elfcpp::R_SPARC_TLS_LE_LOX10: 2205 case elfcpp::R_SPARC_8: 2206 case elfcpp::R_SPARC_16: 2207 case elfcpp::R_SPARC_DISP8: 2208 case elfcpp::R_SPARC_DISP16: 2209 case elfcpp::R_SPARC_DISP32: 2210 case elfcpp::R_SPARC_LO10: 2211 case elfcpp::R_SPARC_WDISP30: 2212 case elfcpp::R_SPARC_HI22: 2213 case elfcpp::R_SPARC_UA16: 2214 case elfcpp::R_SPARC_UA32: 2215 return; 2216 2217 default: 2218 break; 2219 } 2220 } 2221 2222 // This prevents us from issuing more than one error per reloc 2223 // section. But we can still wind up issuing more than one 2224 // error per object file. 2225 if (this->issued_non_pic_error_) 2226 return; 2227 gold_assert(parameters->options().output_is_position_independent()); 2228 object->error(_("requires unsupported dynamic reloc; " 2229 "recompile with -fPIC")); 2230 this->issued_non_pic_error_ = true; 2231 return; 2232 } 2233 2234 // Return whether we need to make a PLT entry for a relocation of the 2235 // given type against a STT_GNU_IFUNC symbol. 2236 2237 template<int size, bool big_endian> 2238 bool 2239 Target_sparc<size, big_endian>::Scan::reloc_needs_plt_for_ifunc( 2240 Sized_relobj_file<size, big_endian>* object, 2241 unsigned int r_type) 2242 { 2243 int flags = Scan::get_reference_flags(r_type); 2244 if (flags & Symbol::TLS_REF) 2245 gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"), 2246 object->name().c_str(), r_type); 2247 return flags != 0; 2248 } 2249 2250 // Scan a relocation for a local symbol. 2251 2252 template<int size, bool big_endian> 2253 inline void 2254 Target_sparc<size, big_endian>::Scan::local( 2255 Symbol_table* symtab, 2256 Layout* layout, 2257 Target_sparc<size, big_endian>* target, 2258 Sized_relobj_file<size, big_endian>* object, 2259 unsigned int data_shndx, 2260 Output_section* output_section, 2261 const elfcpp::Rela<size, big_endian>& reloc, 2262 unsigned int r_type, 2263 const elfcpp::Sym<size, big_endian>& lsym, 2264 bool is_discarded) 2265 { 2266 if (is_discarded) 2267 return; 2268 2269 bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC; 2270 unsigned int orig_r_type = r_type; 2271 r_type &= 0xff; 2272 2273 if (is_ifunc 2274 && this->reloc_needs_plt_for_ifunc(object, r_type)) 2275 { 2276 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2277 target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym); 2278 } 2279 2280 switch (r_type) 2281 { 2282 case elfcpp::R_SPARC_NONE: 2283 case elfcpp::R_SPARC_REGISTER: 2284 case elfcpp::R_SPARC_GNU_VTINHERIT: 2285 case elfcpp::R_SPARC_GNU_VTENTRY: 2286 break; 2287 2288 case elfcpp::R_SPARC_64: 2289 case elfcpp::R_SPARC_32: 2290 // If building a shared library (or a position-independent 2291 // executable), we need to create a dynamic relocation for 2292 // this location. The relocation applied at link time will 2293 // apply the link-time value, so we flag the location with 2294 // an R_SPARC_RELATIVE relocation so the dynamic loader can 2295 // relocate it easily. 2296 if (parameters->options().output_is_position_independent() 2297 && ((size == 64 && r_type == elfcpp::R_SPARC_64) 2298 || (size == 32 && r_type == elfcpp::R_SPARC_32))) 2299 { 2300 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2301 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2302 rela_dyn->add_local_relative(object, r_sym, elfcpp::R_SPARC_RELATIVE, 2303 output_section, data_shndx, 2304 reloc.get_r_offset(), 2305 reloc.get_r_addend(), is_ifunc); 2306 break; 2307 } 2308 /* Fall through. */ 2309 2310 case elfcpp::R_SPARC_HIX22: 2311 case elfcpp::R_SPARC_LOX10: 2312 case elfcpp::R_SPARC_H34: 2313 case elfcpp::R_SPARC_H44: 2314 case elfcpp::R_SPARC_M44: 2315 case elfcpp::R_SPARC_L44: 2316 case elfcpp::R_SPARC_HH22: 2317 case elfcpp::R_SPARC_HM10: 2318 case elfcpp::R_SPARC_LM22: 2319 case elfcpp::R_SPARC_UA64: 2320 case elfcpp::R_SPARC_UA32: 2321 case elfcpp::R_SPARC_UA16: 2322 case elfcpp::R_SPARC_HI22: 2323 case elfcpp::R_SPARC_LO10: 2324 case elfcpp::R_SPARC_OLO10: 2325 case elfcpp::R_SPARC_16: 2326 case elfcpp::R_SPARC_11: 2327 case elfcpp::R_SPARC_10: 2328 case elfcpp::R_SPARC_8: 2329 case elfcpp::R_SPARC_7: 2330 case elfcpp::R_SPARC_6: 2331 case elfcpp::R_SPARC_5: 2332 // If building a shared library (or a position-independent 2333 // executable), we need to create a dynamic relocation for 2334 // this location. 2335 if (parameters->options().output_is_position_independent()) 2336 { 2337 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2338 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2339 2340 check_non_pic(object, r_type); 2341 if (lsym.get_st_type() != elfcpp::STT_SECTION) 2342 { 2343 rela_dyn->add_local(object, r_sym, orig_r_type, output_section, 2344 data_shndx, reloc.get_r_offset(), 2345 reloc.get_r_addend()); 2346 } 2347 else 2348 { 2349 gold_assert(lsym.get_st_value() == 0); 2350 rela_dyn->add_symbolless_local_addend(object, r_sym, orig_r_type, 2351 output_section, data_shndx, 2352 reloc.get_r_offset(), 2353 reloc.get_r_addend()); 2354 } 2355 } 2356 break; 2357 2358 case elfcpp::R_SPARC_WDISP30: 2359 case elfcpp::R_SPARC_WPLT30: 2360 case elfcpp::R_SPARC_WDISP22: 2361 case elfcpp::R_SPARC_WDISP19: 2362 case elfcpp::R_SPARC_WDISP16: 2363 case elfcpp::R_SPARC_WDISP10: 2364 case elfcpp::R_SPARC_DISP8: 2365 case elfcpp::R_SPARC_DISP16: 2366 case elfcpp::R_SPARC_DISP32: 2367 case elfcpp::R_SPARC_DISP64: 2368 case elfcpp::R_SPARC_PC10: 2369 case elfcpp::R_SPARC_PC22: 2370 break; 2371 2372 case elfcpp::R_SPARC_GOTDATA_OP: 2373 case elfcpp::R_SPARC_GOTDATA_OP_HIX22: 2374 case elfcpp::R_SPARC_GOTDATA_OP_LOX10: 2375 // We will optimize this into a GOT relative relocation 2376 // and code transform the GOT load into an addition. 2377 break; 2378 2379 case elfcpp::R_SPARC_GOT10: 2380 case elfcpp::R_SPARC_GOT13: 2381 case elfcpp::R_SPARC_GOT22: 2382 { 2383 // The symbol requires a GOT entry. 2384 Output_data_got<size, big_endian>* got; 2385 unsigned int r_sym; 2386 2387 got = target->got_section(symtab, layout); 2388 r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2389 2390 // If we are generating a shared object, we need to add a 2391 // dynamic relocation for this symbol's GOT entry. 2392 if (parameters->options().output_is_position_independent()) 2393 { 2394 if (!object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD)) 2395 { 2396 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2397 unsigned int off = got->add_constant(0); 2398 object->set_local_got_offset(r_sym, GOT_TYPE_STANDARD, off); 2399 rela_dyn->add_local_relative(object, r_sym, 2400 elfcpp::R_SPARC_RELATIVE, 2401 got, off, 0, is_ifunc); 2402 } 2403 } 2404 else 2405 got->add_local(object, r_sym, GOT_TYPE_STANDARD); 2406 } 2407 break; 2408 2409 // These are initial TLS relocs, which are expected when 2410 // linking. 2411 case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic 2412 case elfcpp::R_SPARC_TLS_GD_LO10: 2413 case elfcpp::R_SPARC_TLS_GD_ADD: 2414 case elfcpp::R_SPARC_TLS_GD_CALL: 2415 case elfcpp::R_SPARC_TLS_LDM_HI22 : // Local-dynamic 2416 case elfcpp::R_SPARC_TLS_LDM_LO10: 2417 case elfcpp::R_SPARC_TLS_LDM_ADD: 2418 case elfcpp::R_SPARC_TLS_LDM_CALL: 2419 case elfcpp::R_SPARC_TLS_LDO_HIX22: // Alternate local-dynamic 2420 case elfcpp::R_SPARC_TLS_LDO_LOX10: 2421 case elfcpp::R_SPARC_TLS_LDO_ADD: 2422 case elfcpp::R_SPARC_TLS_IE_HI22: // Initial-exec 2423 case elfcpp::R_SPARC_TLS_IE_LO10: 2424 case elfcpp::R_SPARC_TLS_IE_LD: 2425 case elfcpp::R_SPARC_TLS_IE_LDX: 2426 case elfcpp::R_SPARC_TLS_IE_ADD: 2427 case elfcpp::R_SPARC_TLS_LE_HIX22: // Local-exec 2428 case elfcpp::R_SPARC_TLS_LE_LOX10: 2429 { 2430 bool output_is_shared = parameters->options().shared(); 2431 const tls::Tls_optimization optimized_type 2432 = optimize_tls_reloc(!output_is_shared, r_type); 2433 switch (r_type) 2434 { 2435 case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic 2436 case elfcpp::R_SPARC_TLS_GD_LO10: 2437 case elfcpp::R_SPARC_TLS_GD_ADD: 2438 case elfcpp::R_SPARC_TLS_GD_CALL: 2439 if (optimized_type == tls::TLSOPT_NONE) 2440 { 2441 // Create a pair of GOT entries for the module index and 2442 // dtv-relative offset. 2443 Output_data_got<size, big_endian>* got 2444 = target->got_section(symtab, layout); 2445 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2446 unsigned int shndx = lsym.get_st_shndx(); 2447 bool is_ordinary; 2448 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary); 2449 if (!is_ordinary) 2450 object->error(_("local symbol %u has bad shndx %u"), 2451 r_sym, shndx); 2452 else 2453 got->add_local_pair_with_rel(object, r_sym, 2454 lsym.get_st_shndx(), 2455 GOT_TYPE_TLS_PAIR, 2456 target->rela_dyn_section(layout), 2457 (size == 64 2458 ? elfcpp::R_SPARC_TLS_DTPMOD64 2459 : elfcpp::R_SPARC_TLS_DTPMOD32)); 2460 if (r_type == elfcpp::R_SPARC_TLS_GD_CALL) 2461 generate_tls_call(symtab, layout, target); 2462 } 2463 else if (optimized_type != tls::TLSOPT_TO_LE) 2464 unsupported_reloc_local(object, r_type); 2465 break; 2466 2467 case elfcpp::R_SPARC_TLS_LDM_HI22 : // Local-dynamic 2468 case elfcpp::R_SPARC_TLS_LDM_LO10: 2469 case elfcpp::R_SPARC_TLS_LDM_ADD: 2470 case elfcpp::R_SPARC_TLS_LDM_CALL: 2471 if (optimized_type == tls::TLSOPT_NONE) 2472 { 2473 // Create a GOT entry for the module index. 2474 target->got_mod_index_entry(symtab, layout, object); 2475 2476 if (r_type == elfcpp::R_SPARC_TLS_LDM_CALL) 2477 generate_tls_call(symtab, layout, target); 2478 } 2479 else if (optimized_type != tls::TLSOPT_TO_LE) 2480 unsupported_reloc_local(object, r_type); 2481 break; 2482 2483 case elfcpp::R_SPARC_TLS_LDO_HIX22: // Alternate local-dynamic 2484 case elfcpp::R_SPARC_TLS_LDO_LOX10: 2485 case elfcpp::R_SPARC_TLS_LDO_ADD: 2486 break; 2487 2488 case elfcpp::R_SPARC_TLS_IE_HI22: // Initial-exec 2489 case elfcpp::R_SPARC_TLS_IE_LO10: 2490 case elfcpp::R_SPARC_TLS_IE_LD: 2491 case elfcpp::R_SPARC_TLS_IE_LDX: 2492 case elfcpp::R_SPARC_TLS_IE_ADD: 2493 layout->set_has_static_tls(); 2494 if (optimized_type == tls::TLSOPT_NONE) 2495 { 2496 // Create a GOT entry for the tp-relative offset. 2497 Output_data_got<size, big_endian>* got 2498 = target->got_section(symtab, layout); 2499 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2500 2501 if (!object->local_has_got_offset(r_sym, GOT_TYPE_TLS_OFFSET)) 2502 { 2503 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2504 unsigned int off = got->add_constant(0); 2505 2506 object->set_local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET, off); 2507 2508 rela_dyn->add_symbolless_local_addend(object, r_sym, 2509 (size == 64 ? 2510 elfcpp::R_SPARC_TLS_TPOFF64 : 2511 elfcpp::R_SPARC_TLS_TPOFF32), 2512 got, off, 0); 2513 } 2514 } 2515 else if (optimized_type != tls::TLSOPT_TO_LE) 2516 unsupported_reloc_local(object, r_type); 2517 break; 2518 2519 case elfcpp::R_SPARC_TLS_LE_HIX22: // Local-exec 2520 case elfcpp::R_SPARC_TLS_LE_LOX10: 2521 layout->set_has_static_tls(); 2522 if (output_is_shared) 2523 { 2524 // We need to create a dynamic relocation. 2525 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION); 2526 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2527 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2528 rela_dyn->add_symbolless_local_addend(object, r_sym, r_type, 2529 output_section, data_shndx, 2530 reloc.get_r_offset(), 0); 2531 } 2532 break; 2533 } 2534 } 2535 break; 2536 2537 // These are relocations which should only be seen by the 2538 // dynamic linker, and should never be seen here. 2539 case elfcpp::R_SPARC_COPY: 2540 case elfcpp::R_SPARC_GLOB_DAT: 2541 case elfcpp::R_SPARC_JMP_SLOT: 2542 case elfcpp::R_SPARC_JMP_IREL: 2543 case elfcpp::R_SPARC_RELATIVE: 2544 case elfcpp::R_SPARC_IRELATIVE: 2545 case elfcpp::R_SPARC_TLS_DTPMOD64: 2546 case elfcpp::R_SPARC_TLS_DTPMOD32: 2547 case elfcpp::R_SPARC_TLS_DTPOFF64: 2548 case elfcpp::R_SPARC_TLS_DTPOFF32: 2549 case elfcpp::R_SPARC_TLS_TPOFF64: 2550 case elfcpp::R_SPARC_TLS_TPOFF32: 2551 gold_error(_("%s: unexpected reloc %u in object file"), 2552 object->name().c_str(), r_type); 2553 break; 2554 2555 default: 2556 unsupported_reloc_local(object, r_type); 2557 break; 2558 } 2559 } 2560 2561 // Report an unsupported relocation against a global symbol. 2562 2563 template<int size, bool big_endian> 2564 void 2565 Target_sparc<size, big_endian>::Scan::unsupported_reloc_global( 2566 Sized_relobj_file<size, big_endian>* object, 2567 unsigned int r_type, 2568 Symbol* gsym) 2569 { 2570 gold_error(_("%s: unsupported reloc %u against global symbol %s"), 2571 object->name().c_str(), r_type, gsym->demangled_name().c_str()); 2572 } 2573 2574 // Scan a relocation for a global symbol. 2575 2576 template<int size, bool big_endian> 2577 inline void 2578 Target_sparc<size, big_endian>::Scan::global( 2579 Symbol_table* symtab, 2580 Layout* layout, 2581 Target_sparc<size, big_endian>* target, 2582 Sized_relobj_file<size, big_endian>* object, 2583 unsigned int data_shndx, 2584 Output_section* output_section, 2585 const elfcpp::Rela<size, big_endian>& reloc, 2586 unsigned int r_type, 2587 Symbol* gsym) 2588 { 2589 unsigned int orig_r_type = r_type; 2590 bool is_ifunc = gsym->type() == elfcpp::STT_GNU_IFUNC; 2591 2592 // A reference to _GLOBAL_OFFSET_TABLE_ implies that we need a got 2593 // section. We check here to avoid creating a dynamic reloc against 2594 // _GLOBAL_OFFSET_TABLE_. 2595 if (!target->has_got_section() 2596 && strcmp(gsym->name(), "_GLOBAL_OFFSET_TABLE_") == 0) 2597 target->got_section(symtab, layout); 2598 2599 r_type &= 0xff; 2600 2601 // A STT_GNU_IFUNC symbol may require a PLT entry. 2602 if (is_ifunc 2603 && this->reloc_needs_plt_for_ifunc(object, r_type)) 2604 target->make_plt_entry(symtab, layout, gsym); 2605 2606 switch (r_type) 2607 { 2608 case elfcpp::R_SPARC_NONE: 2609 case elfcpp::R_SPARC_REGISTER: 2610 case elfcpp::R_SPARC_GNU_VTINHERIT: 2611 case elfcpp::R_SPARC_GNU_VTENTRY: 2612 break; 2613 2614 case elfcpp::R_SPARC_PLT64: 2615 case elfcpp::R_SPARC_PLT32: 2616 case elfcpp::R_SPARC_HIPLT22: 2617 case elfcpp::R_SPARC_LOPLT10: 2618 case elfcpp::R_SPARC_PCPLT32: 2619 case elfcpp::R_SPARC_PCPLT22: 2620 case elfcpp::R_SPARC_PCPLT10: 2621 case elfcpp::R_SPARC_WPLT30: 2622 // If the symbol is fully resolved, this is just a PC32 reloc. 2623 // Otherwise we need a PLT entry. 2624 if (gsym->final_value_is_known()) 2625 break; 2626 // If building a shared library, we can also skip the PLT entry 2627 // if the symbol is defined in the output file and is protected 2628 // or hidden. 2629 if (gsym->is_defined() 2630 && !gsym->is_from_dynobj() 2631 && !gsym->is_preemptible()) 2632 break; 2633 target->make_plt_entry(symtab, layout, gsym); 2634 break; 2635 2636 case elfcpp::R_SPARC_DISP8: 2637 case elfcpp::R_SPARC_DISP16: 2638 case elfcpp::R_SPARC_DISP32: 2639 case elfcpp::R_SPARC_DISP64: 2640 case elfcpp::R_SPARC_PC_HH22: 2641 case elfcpp::R_SPARC_PC_HM10: 2642 case elfcpp::R_SPARC_PC_LM22: 2643 case elfcpp::R_SPARC_PC10: 2644 case elfcpp::R_SPARC_PC22: 2645 case elfcpp::R_SPARC_WDISP30: 2646 case elfcpp::R_SPARC_WDISP22: 2647 case elfcpp::R_SPARC_WDISP19: 2648 case elfcpp::R_SPARC_WDISP16: 2649 case elfcpp::R_SPARC_WDISP10: 2650 { 2651 if (gsym->needs_plt_entry()) 2652 target->make_plt_entry(symtab, layout, gsym); 2653 // Make a dynamic relocation if necessary. 2654 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type))) 2655 { 2656 if (parameters->options().output_is_executable() 2657 && gsym->may_need_copy_reloc()) 2658 { 2659 target->copy_reloc(symtab, layout, object, 2660 data_shndx, output_section, gsym, 2661 reloc); 2662 } 2663 else 2664 { 2665 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2666 check_non_pic(object, r_type); 2667 rela_dyn->add_global(gsym, orig_r_type, output_section, object, 2668 data_shndx, reloc.get_r_offset(), 2669 reloc.get_r_addend()); 2670 } 2671 } 2672 } 2673 break; 2674 2675 case elfcpp::R_SPARC_UA64: 2676 case elfcpp::R_SPARC_64: 2677 case elfcpp::R_SPARC_HIX22: 2678 case elfcpp::R_SPARC_LOX10: 2679 case elfcpp::R_SPARC_H34: 2680 case elfcpp::R_SPARC_H44: 2681 case elfcpp::R_SPARC_M44: 2682 case elfcpp::R_SPARC_L44: 2683 case elfcpp::R_SPARC_HH22: 2684 case elfcpp::R_SPARC_HM10: 2685 case elfcpp::R_SPARC_LM22: 2686 case elfcpp::R_SPARC_HI22: 2687 case elfcpp::R_SPARC_LO10: 2688 case elfcpp::R_SPARC_OLO10: 2689 case elfcpp::R_SPARC_UA32: 2690 case elfcpp::R_SPARC_32: 2691 case elfcpp::R_SPARC_UA16: 2692 case elfcpp::R_SPARC_16: 2693 case elfcpp::R_SPARC_11: 2694 case elfcpp::R_SPARC_10: 2695 case elfcpp::R_SPARC_8: 2696 case elfcpp::R_SPARC_7: 2697 case elfcpp::R_SPARC_6: 2698 case elfcpp::R_SPARC_5: 2699 { 2700 // Make a PLT entry if necessary. 2701 if (gsym->needs_plt_entry()) 2702 { 2703 target->make_plt_entry(symtab, layout, gsym); 2704 // Since this is not a PC-relative relocation, we may be 2705 // taking the address of a function. In that case we need to 2706 // set the entry in the dynamic symbol table to the address of 2707 // the PLT entry. 2708 if (gsym->is_from_dynobj() && !parameters->options().shared()) 2709 gsym->set_needs_dynsym_value(); 2710 } 2711 // Make a dynamic relocation if necessary. 2712 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type))) 2713 { 2714 unsigned int r_off = reloc.get_r_offset(); 2715 2716 // The assembler can sometimes emit unaligned relocations 2717 // for dwarf2 cfi directives. 2718 switch (r_type) 2719 { 2720 case elfcpp::R_SPARC_16: 2721 if (r_off & 0x1) 2722 orig_r_type = r_type = elfcpp::R_SPARC_UA16; 2723 break; 2724 case elfcpp::R_SPARC_32: 2725 if (r_off & 0x3) 2726 orig_r_type = r_type = elfcpp::R_SPARC_UA32; 2727 break; 2728 case elfcpp::R_SPARC_64: 2729 if (r_off & 0x7) 2730 orig_r_type = r_type = elfcpp::R_SPARC_UA64; 2731 break; 2732 case elfcpp::R_SPARC_UA16: 2733 if (!(r_off & 0x1)) 2734 orig_r_type = r_type = elfcpp::R_SPARC_16; 2735 break; 2736 case elfcpp::R_SPARC_UA32: 2737 if (!(r_off & 0x3)) 2738 orig_r_type = r_type = elfcpp::R_SPARC_32; 2739 break; 2740 case elfcpp::R_SPARC_UA64: 2741 if (!(r_off & 0x7)) 2742 orig_r_type = r_type = elfcpp::R_SPARC_64; 2743 break; 2744 } 2745 2746 if (!parameters->options().output_is_position_independent() 2747 && gsym->may_need_copy_reloc()) 2748 { 2749 target->copy_reloc(symtab, layout, object, 2750 data_shndx, output_section, gsym, reloc); 2751 } 2752 else if (((size == 64 && r_type == elfcpp::R_SPARC_64) 2753 || (size == 32 && r_type == elfcpp::R_SPARC_32)) 2754 && gsym->type() == elfcpp::STT_GNU_IFUNC 2755 && gsym->can_use_relative_reloc(false) 2756 && !gsym->is_from_dynobj() 2757 && !gsym->is_undefined() 2758 && !gsym->is_preemptible()) 2759 { 2760 // Use an IRELATIVE reloc for a locally defined 2761 // STT_GNU_IFUNC symbol. This makes a function 2762 // address in a PIE executable match the address in a 2763 // shared library that it links against. 2764 Reloc_section* rela_dyn = 2765 target->rela_ifunc_section(layout); 2766 unsigned int r_type = elfcpp::R_SPARC_IRELATIVE; 2767 rela_dyn->add_symbolless_global_addend(gsym, r_type, 2768 output_section, object, 2769 data_shndx, 2770 reloc.get_r_offset(), 2771 reloc.get_r_addend()); 2772 } 2773 else if (((size == 64 && r_type == elfcpp::R_SPARC_64) 2774 || (size == 32 && r_type == elfcpp::R_SPARC_32)) 2775 && gsym->can_use_relative_reloc(false)) 2776 { 2777 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2778 rela_dyn->add_global_relative(gsym, elfcpp::R_SPARC_RELATIVE, 2779 output_section, object, 2780 data_shndx, reloc.get_r_offset(), 2781 reloc.get_r_addend(), is_ifunc); 2782 } 2783 else 2784 { 2785 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2786 2787 check_non_pic(object, r_type); 2788 if (gsym->is_from_dynobj() 2789 || gsym->is_undefined() 2790 || gsym->is_preemptible()) 2791 rela_dyn->add_global(gsym, orig_r_type, output_section, 2792 object, data_shndx, 2793 reloc.get_r_offset(), 2794 reloc.get_r_addend()); 2795 else 2796 rela_dyn->add_symbolless_global_addend(gsym, orig_r_type, 2797 output_section, 2798 object, data_shndx, 2799 reloc.get_r_offset(), 2800 reloc.get_r_addend()); 2801 } 2802 } 2803 } 2804 break; 2805 2806 case elfcpp::R_SPARC_GOTDATA_OP: 2807 case elfcpp::R_SPARC_GOTDATA_OP_HIX22: 2808 case elfcpp::R_SPARC_GOTDATA_OP_LOX10: 2809 if (gsym->is_defined() 2810 && !gsym->is_from_dynobj() 2811 && !gsym->is_preemptible() 2812 && !is_ifunc) 2813 { 2814 // We will optimize this into a GOT relative relocation 2815 // and code transform the GOT load into an addition. 2816 break; 2817 } 2818 case elfcpp::R_SPARC_GOT10: 2819 case elfcpp::R_SPARC_GOT13: 2820 case elfcpp::R_SPARC_GOT22: 2821 { 2822 // The symbol requires a GOT entry. 2823 Output_data_got<size, big_endian>* got; 2824 2825 got = target->got_section(symtab, layout); 2826 if (gsym->final_value_is_known()) 2827 { 2828 // For a STT_GNU_IFUNC symbol we want the PLT address. 2829 if (gsym->type() == elfcpp::STT_GNU_IFUNC) 2830 got->add_global_plt(gsym, GOT_TYPE_STANDARD); 2831 else 2832 got->add_global(gsym, GOT_TYPE_STANDARD); 2833 } 2834 else 2835 { 2836 // If this symbol is not fully resolved, we need to add a 2837 // GOT entry with a dynamic relocation. 2838 bool is_ifunc = gsym->type() == elfcpp::STT_GNU_IFUNC; 2839 2840 // Use a GLOB_DAT rather than a RELATIVE reloc if: 2841 // 2842 // 1) The symbol may be defined in some other module. 2843 // 2844 // 2) We are building a shared library and this is a 2845 // protected symbol; using GLOB_DAT means that the dynamic 2846 // linker can use the address of the PLT in the main 2847 // executable when appropriate so that function address 2848 // comparisons work. 2849 // 2850 // 3) This is a STT_GNU_IFUNC symbol in position dependent 2851 // code, again so that function address comparisons work. 2852 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2853 if (gsym->is_from_dynobj() 2854 || gsym->is_undefined() 2855 || gsym->is_preemptible() 2856 || (gsym->visibility() == elfcpp::STV_PROTECTED 2857 && parameters->options().shared()) 2858 || (gsym->type() == elfcpp::STT_GNU_IFUNC 2859 && parameters->options().output_is_position_independent() 2860 && !gsym->is_forced_local())) 2861 { 2862 unsigned int r_type = elfcpp::R_SPARC_GLOB_DAT; 2863 2864 // If this symbol is forced local, this relocation will 2865 // not work properly. That's because ld.so on sparc 2866 // (and 32-bit powerpc) expects st_value in the r_addend 2867 // of relocations for STB_LOCAL symbols. Curiously the 2868 // BFD linker does not promote global hidden symbols to be 2869 // STB_LOCAL in the dynamic symbol table like Gold does. 2870 gold_assert(!gsym->is_forced_local()); 2871 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD, rela_dyn, 2872 r_type); 2873 } 2874 else if (!gsym->has_got_offset(GOT_TYPE_STANDARD)) 2875 { 2876 unsigned int off = got->add_constant(0); 2877 2878 gsym->set_got_offset(GOT_TYPE_STANDARD, off); 2879 if (is_ifunc) 2880 { 2881 // Tell the dynamic linker to use the PLT address 2882 // when resolving relocations. 2883 if (gsym->is_from_dynobj() 2884 && !parameters->options().shared()) 2885 gsym->set_needs_dynsym_value(); 2886 } 2887 rela_dyn->add_global_relative(gsym, elfcpp::R_SPARC_RELATIVE, 2888 got, off, 0, is_ifunc); 2889 } 2890 } 2891 } 2892 break; 2893 2894 // These are initial tls relocs, which are expected when 2895 // linking. 2896 case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic 2897 case elfcpp::R_SPARC_TLS_GD_LO10: 2898 case elfcpp::R_SPARC_TLS_GD_ADD: 2899 case elfcpp::R_SPARC_TLS_GD_CALL: 2900 case elfcpp::R_SPARC_TLS_LDM_HI22: // Local-dynamic 2901 case elfcpp::R_SPARC_TLS_LDM_LO10: 2902 case elfcpp::R_SPARC_TLS_LDM_ADD: 2903 case elfcpp::R_SPARC_TLS_LDM_CALL: 2904 case elfcpp::R_SPARC_TLS_LDO_HIX22: // Alternate local-dynamic 2905 case elfcpp::R_SPARC_TLS_LDO_LOX10: 2906 case elfcpp::R_SPARC_TLS_LDO_ADD: 2907 case elfcpp::R_SPARC_TLS_LE_HIX22: 2908 case elfcpp::R_SPARC_TLS_LE_LOX10: 2909 case elfcpp::R_SPARC_TLS_IE_HI22: // Initial-exec 2910 case elfcpp::R_SPARC_TLS_IE_LO10: 2911 case elfcpp::R_SPARC_TLS_IE_LD: 2912 case elfcpp::R_SPARC_TLS_IE_LDX: 2913 case elfcpp::R_SPARC_TLS_IE_ADD: 2914 { 2915 const bool is_final = gsym->final_value_is_known(); 2916 const tls::Tls_optimization optimized_type 2917 = optimize_tls_reloc(is_final, r_type); 2918 switch (r_type) 2919 { 2920 case elfcpp::R_SPARC_TLS_GD_HI22: // Global-dynamic 2921 case elfcpp::R_SPARC_TLS_GD_LO10: 2922 case elfcpp::R_SPARC_TLS_GD_ADD: 2923 case elfcpp::R_SPARC_TLS_GD_CALL: 2924 if (optimized_type == tls::TLSOPT_NONE) 2925 { 2926 // Create a pair of GOT entries for the module index and 2927 // dtv-relative offset. 2928 Output_data_got<size, big_endian>* got 2929 = target->got_section(symtab, layout); 2930 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR, 2931 target->rela_dyn_section(layout), 2932 (size == 64 2933 ? elfcpp::R_SPARC_TLS_DTPMOD64 2934 : elfcpp::R_SPARC_TLS_DTPMOD32), 2935 (size == 64 2936 ? elfcpp::R_SPARC_TLS_DTPOFF64 2937 : elfcpp::R_SPARC_TLS_DTPOFF32)); 2938 2939 // Emit R_SPARC_WPLT30 against "__tls_get_addr" 2940 if (r_type == elfcpp::R_SPARC_TLS_GD_CALL) 2941 generate_tls_call(symtab, layout, target); 2942 } 2943 else if (optimized_type == tls::TLSOPT_TO_IE) 2944 { 2945 // Create a GOT entry for the tp-relative offset. 2946 Output_data_got<size, big_endian>* got 2947 = target->got_section(symtab, layout); 2948 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET, 2949 target->rela_dyn_section(layout), 2950 (size == 64 ? 2951 elfcpp::R_SPARC_TLS_TPOFF64 : 2952 elfcpp::R_SPARC_TLS_TPOFF32)); 2953 } 2954 else if (optimized_type != tls::TLSOPT_TO_LE) 2955 unsupported_reloc_global(object, r_type, gsym); 2956 break; 2957 2958 case elfcpp::R_SPARC_TLS_LDM_HI22: // Local-dynamic 2959 case elfcpp::R_SPARC_TLS_LDM_LO10: 2960 case elfcpp::R_SPARC_TLS_LDM_ADD: 2961 case elfcpp::R_SPARC_TLS_LDM_CALL: 2962 if (optimized_type == tls::TLSOPT_NONE) 2963 { 2964 // Create a GOT entry for the module index. 2965 target->got_mod_index_entry(symtab, layout, object); 2966 2967 if (r_type == elfcpp::R_SPARC_TLS_LDM_CALL) 2968 generate_tls_call(symtab, layout, target); 2969 } 2970 else if (optimized_type != tls::TLSOPT_TO_LE) 2971 unsupported_reloc_global(object, r_type, gsym); 2972 break; 2973 2974 case elfcpp::R_SPARC_TLS_LDO_HIX22: // Alternate local-dynamic 2975 case elfcpp::R_SPARC_TLS_LDO_LOX10: 2976 case elfcpp::R_SPARC_TLS_LDO_ADD: 2977 break; 2978 2979 case elfcpp::R_SPARC_TLS_LE_HIX22: 2980 case elfcpp::R_SPARC_TLS_LE_LOX10: 2981 layout->set_has_static_tls(); 2982 if (parameters->options().shared()) 2983 { 2984 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2985 rela_dyn->add_symbolless_global_addend(gsym, orig_r_type, 2986 output_section, object, 2987 data_shndx, reloc.get_r_offset(), 2988 0); 2989 } 2990 break; 2991 2992 case elfcpp::R_SPARC_TLS_IE_HI22: // Initial-exec 2993 case elfcpp::R_SPARC_TLS_IE_LO10: 2994 case elfcpp::R_SPARC_TLS_IE_LD: 2995 case elfcpp::R_SPARC_TLS_IE_LDX: 2996 case elfcpp::R_SPARC_TLS_IE_ADD: 2997 layout->set_has_static_tls(); 2998 if (optimized_type == tls::TLSOPT_NONE) 2999 { 3000 // Create a GOT entry for the tp-relative offset. 3001 Output_data_got<size, big_endian>* got 3002 = target->got_section(symtab, layout); 3003 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET, 3004 target->rela_dyn_section(layout), 3005 (size == 64 3006 ? elfcpp::R_SPARC_TLS_TPOFF64 3007 : elfcpp::R_SPARC_TLS_TPOFF32)); 3008 } 3009 else if (optimized_type != tls::TLSOPT_TO_LE) 3010 unsupported_reloc_global(object, r_type, gsym); 3011 break; 3012 } 3013 } 3014 break; 3015 3016 // These are relocations which should only be seen by the 3017 // dynamic linker, and should never be seen here. 3018 case elfcpp::R_SPARC_COPY: 3019 case elfcpp::R_SPARC_GLOB_DAT: 3020 case elfcpp::R_SPARC_JMP_SLOT: 3021 case elfcpp::R_SPARC_JMP_IREL: 3022 case elfcpp::R_SPARC_RELATIVE: 3023 case elfcpp::R_SPARC_IRELATIVE: 3024 case elfcpp::R_SPARC_TLS_DTPMOD64: 3025 case elfcpp::R_SPARC_TLS_DTPMOD32: 3026 case elfcpp::R_SPARC_TLS_DTPOFF64: 3027 case elfcpp::R_SPARC_TLS_DTPOFF32: 3028 case elfcpp::R_SPARC_TLS_TPOFF64: 3029 case elfcpp::R_SPARC_TLS_TPOFF32: 3030 gold_error(_("%s: unexpected reloc %u in object file"), 3031 object->name().c_str(), r_type); 3032 break; 3033 3034 default: 3035 unsupported_reloc_global(object, r_type, gsym); 3036 break; 3037 } 3038 } 3039 3040 // Make a new symbol table entry. 3041 // STT_SPARC_REGISTER symbols require special handling, 3042 // so we intercept these symbols and keep track of them separately. 3043 // We will resolve register symbols here and output them at symbol 3044 // finalization time. 3045 3046 template<int size, bool big_endian> 3047 Sized_symbol<size>* 3048 Target_sparc<size, big_endian>::make_symbol(const char* name, 3049 elfcpp::STT type, 3050 Object* object, 3051 unsigned int shndx, 3052 uint64_t value) 3053 { 3054 // REGISTER symbols are used only on SPARC-64. 3055 if (size == 64 && type == elfcpp::STT_SPARC_REGISTER) 3056 { 3057 // Ignore REGISTER symbols in dynamic objects. 3058 if (object->is_dynamic()) 3059 return NULL; 3060 // Only registers 2, 3, 6, and 7 can be declared global. 3061 int reg = value; 3062 switch (reg) 3063 { 3064 case 2: case 3: 3065 reg -= 2; 3066 break; 3067 case 6: case 7: 3068 reg -= 4; 3069 break; 3070 default: 3071 gold_error(_("%s: only registers %%g[2367] can be declared " 3072 "using STT_REGISTER"), 3073 object->name().c_str()); 3074 return NULL; 3075 } 3076 Register_symbol& rsym = this->register_syms_[reg]; 3077 if (rsym.name == NULL) 3078 { 3079 rsym.name = name; 3080 rsym.shndx = shndx; 3081 rsym.obj = object; 3082 } 3083 else 3084 { 3085 if (strcmp(rsym.name, name) != 0) 3086 { 3087 gold_error(_("%s: register %%g%d declared as '%s'; " 3088 "previously declared as '%s' in %s"), 3089 object->name().c_str(), 3090 static_cast<int>(value), 3091 *name ? name : "#scratch", 3092 *rsym.name ? rsym.name : "#scratch", 3093 rsym.obj->name().c_str()); 3094 return NULL; 3095 } 3096 } 3097 return NULL; 3098 } 3099 return new Sized_symbol<size>(); 3100 } 3101 3102 // Process relocations for gc. 3103 3104 template<int size, bool big_endian> 3105 void 3106 Target_sparc<size, big_endian>::gc_process_relocs( 3107 Symbol_table* symtab, 3108 Layout* layout, 3109 Sized_relobj_file<size, big_endian>* object, 3110 unsigned int data_shndx, 3111 unsigned int, 3112 const unsigned char* prelocs, 3113 size_t reloc_count, 3114 Output_section* output_section, 3115 bool needs_special_offset_handling, 3116 size_t local_symbol_count, 3117 const unsigned char* plocal_symbols) 3118 { 3119 typedef Target_sparc<size, big_endian> Sparc; 3120 typedef typename Target_sparc<size, big_endian>::Scan Scan; 3121 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian> 3122 Classify_reloc; 3123 3124 gold::gc_process_relocs<size, big_endian, Sparc, Scan, Classify_reloc>( 3125 symtab, 3126 layout, 3127 this, 3128 object, 3129 data_shndx, 3130 prelocs, 3131 reloc_count, 3132 output_section, 3133 needs_special_offset_handling, 3134 local_symbol_count, 3135 plocal_symbols); 3136 } 3137 3138 // Scan relocations for a section. 3139 3140 template<int size, bool big_endian> 3141 void 3142 Target_sparc<size, big_endian>::scan_relocs( 3143 Symbol_table* symtab, 3144 Layout* layout, 3145 Sized_relobj_file<size, big_endian>* object, 3146 unsigned int data_shndx, 3147 unsigned int sh_type, 3148 const unsigned char* prelocs, 3149 size_t reloc_count, 3150 Output_section* output_section, 3151 bool needs_special_offset_handling, 3152 size_t local_symbol_count, 3153 const unsigned char* plocal_symbols) 3154 { 3155 typedef Target_sparc<size, big_endian> Sparc; 3156 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian> 3157 Classify_reloc; 3158 3159 if (sh_type == elfcpp::SHT_REL) 3160 { 3161 gold_error(_("%s: unsupported REL reloc section"), 3162 object->name().c_str()); 3163 return; 3164 } 3165 3166 gold::scan_relocs<size, big_endian, Sparc, Scan, Classify_reloc>( 3167 symtab, 3168 layout, 3169 this, 3170 object, 3171 data_shndx, 3172 prelocs, 3173 reloc_count, 3174 output_section, 3175 needs_special_offset_handling, 3176 local_symbol_count, 3177 plocal_symbols); 3178 } 3179 3180 // Finalize the sections. 3181 3182 template<int size, bool big_endian> 3183 void 3184 Target_sparc<size, big_endian>::do_finalize_sections( 3185 Layout* layout, 3186 const Input_objects*, 3187 Symbol_table* symtab) 3188 { 3189 if (this->plt_) 3190 this->plt_->emit_pending_ifunc_relocs(); 3191 3192 // Fill in some more dynamic tags. 3193 const Reloc_section* rel_plt = (this->plt_ == NULL 3194 ? NULL 3195 : this->plt_->rel_plt()); 3196 layout->add_target_dynamic_tags(false, this->plt_, rel_plt, 3197 this->rela_dyn_, true, true); 3198 3199 // Emit any relocs we saved in an attempt to avoid generating COPY 3200 // relocs. 3201 if (this->copy_relocs_.any_saved_relocs()) 3202 this->copy_relocs_.emit(this->rela_dyn_section(layout)); 3203 3204 if (parameters->doing_static_link() 3205 && (this->plt_ == NULL || !this->plt_->has_ifunc_section())) 3206 { 3207 // If linking statically, make sure that the __rela_iplt symbols 3208 // were defined if necessary, even if we didn't create a PLT. 3209 static const Define_symbol_in_segment syms[] = 3210 { 3211 { 3212 "__rela_iplt_start", // name 3213 elfcpp::PT_LOAD, // segment_type 3214 elfcpp::PF_W, // segment_flags_set 3215 elfcpp::PF(0), // segment_flags_clear 3216 0, // value 3217 0, // size 3218 elfcpp::STT_NOTYPE, // type 3219 elfcpp::STB_GLOBAL, // binding 3220 elfcpp::STV_HIDDEN, // visibility 3221 0, // nonvis 3222 Symbol::SEGMENT_START, // offset_from_base 3223 true // only_if_ref 3224 }, 3225 { 3226 "__rela_iplt_end", // name 3227 elfcpp::PT_LOAD, // segment_type 3228 elfcpp::PF_W, // segment_flags_set 3229 elfcpp::PF(0), // segment_flags_clear 3230 0, // value 3231 0, // size 3232 elfcpp::STT_NOTYPE, // type 3233 elfcpp::STB_GLOBAL, // binding 3234 elfcpp::STV_HIDDEN, // visibility 3235 0, // nonvis 3236 Symbol::SEGMENT_START, // offset_from_base 3237 true // only_if_ref 3238 } 3239 }; 3240 3241 symtab->define_symbols(layout, 2, syms, 3242 layout->script_options()->saw_sections_clause()); 3243 } 3244 3245 for (int reg = 0; reg < 4; ++reg) 3246 { 3247 Register_symbol& rsym = this->register_syms_[reg]; 3248 if (rsym.name != NULL) 3249 { 3250 int value = reg < 3 ? reg + 2 : reg + 4; 3251 Sized_symbol<size>* sym = new Sized_symbol<size>(); 3252 if (rsym.shndx == elfcpp::SHN_UNDEF) 3253 sym->init_undefined(rsym.name, NULL, value, 3254 elfcpp::STT_SPARC_REGISTER, elfcpp::STB_GLOBAL, 3255 elfcpp::STV_DEFAULT, 0); 3256 else 3257 sym->init_constant(rsym.name, NULL, value, 0, 3258 elfcpp::STT_SPARC_REGISTER, elfcpp::STB_GLOBAL, 3259 elfcpp::STV_DEFAULT, 0, false); 3260 symtab->add_target_global_symbol(sym); 3261 layout->add_target_specific_dynamic_tag(elfcpp::DT_SPARC_REGISTER, 3262 value); 3263 } 3264 } 3265 } 3266 3267 // Perform a relocation. 3268 3269 template<int size, bool big_endian> 3270 inline bool 3271 Target_sparc<size, big_endian>::Relocate::relocate( 3272 const Relocate_info<size, big_endian>* relinfo, 3273 unsigned int, 3274 Target_sparc* target, 3275 Output_section*, 3276 size_t relnum, 3277 const unsigned char* preloc, 3278 const Sized_symbol<size>* gsym, 3279 const Symbol_value<size>* psymval, 3280 unsigned char* view, 3281 typename elfcpp::Elf_types<size>::Elf_Addr address, 3282 section_size_type view_size) 3283 { 3284 const elfcpp::Rela<size, big_endian> rela(preloc); 3285 unsigned int r_type = elfcpp::elf_r_type<size>(rela.get_r_info()); 3286 bool orig_is_ifunc = psymval->is_ifunc_symbol(); 3287 r_type &= 0xff; 3288 3289 if (this->ignore_gd_add_) 3290 { 3291 if (r_type != elfcpp::R_SPARC_TLS_GD_ADD) 3292 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3293 _("missing expected TLS relocation")); 3294 else 3295 { 3296 this->ignore_gd_add_ = false; 3297 return false; 3298 } 3299 } 3300 3301 if (view == NULL) 3302 return true; 3303 3304 if (this->reloc_adjust_addr_ == view) 3305 view -= 4; 3306 3307 typedef Sparc_relocate_functions<size, big_endian> Reloc; 3308 const Sized_relobj_file<size, big_endian>* object = relinfo->object; 3309 3310 // Pick the value to use for symbols defined in shared objects. 3311 Symbol_value<size> symval; 3312 if (gsym != NULL 3313 && gsym->use_plt_offset(Scan::get_reference_flags(r_type))) 3314 { 3315 elfcpp::Elf_Xword value; 3316 3317 value = target->plt_address_for_global(gsym); 3318 3319 symval.set_output_value(value); 3320 3321 psymval = &symval; 3322 } 3323 else if (gsym == NULL && orig_is_ifunc) 3324 { 3325 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 3326 if (object->local_has_plt_offset(r_sym)) 3327 { 3328 symval.set_output_value(target->plt_address_for_local(object, r_sym)); 3329 psymval = &symval; 3330 } 3331 } 3332 3333 const elfcpp::Elf_Xword addend = rela.get_r_addend(); 3334 3335 // Get the GOT offset if needed. Unlike i386 and x86_64, our GOT 3336 // pointer points to the beginning, not the end, of the table. 3337 // So we just use the plain offset. 3338 unsigned int got_offset = 0; 3339 bool gdop_valid = false; 3340 switch (r_type) 3341 { 3342 case elfcpp::R_SPARC_GOTDATA_OP: 3343 case elfcpp::R_SPARC_GOTDATA_OP_HIX22: 3344 case elfcpp::R_SPARC_GOTDATA_OP_LOX10: 3345 // If this is local, we did not create a GOT entry because we 3346 // intend to transform this into a GOT relative relocation. 3347 if (gsym == NULL 3348 || (gsym->is_defined() 3349 && !gsym->is_from_dynobj() 3350 && !gsym->is_preemptible() 3351 && !orig_is_ifunc)) 3352 { 3353 got_offset = psymval->value(object, addend) - target->got_address(); 3354 gdop_valid = true; 3355 break; 3356 } 3357 case elfcpp::R_SPARC_GOT10: 3358 case elfcpp::R_SPARC_GOT13: 3359 case elfcpp::R_SPARC_GOT22: 3360 if (gsym != NULL) 3361 { 3362 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD)); 3363 got_offset = gsym->got_offset(GOT_TYPE_STANDARD); 3364 } 3365 else 3366 { 3367 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 3368 gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD)); 3369 got_offset = object->local_got_offset(r_sym, GOT_TYPE_STANDARD); 3370 } 3371 break; 3372 3373 default: 3374 break; 3375 } 3376 3377 switch (r_type) 3378 { 3379 case elfcpp::R_SPARC_NONE: 3380 case elfcpp::R_SPARC_REGISTER: 3381 case elfcpp::R_SPARC_GNU_VTINHERIT: 3382 case elfcpp::R_SPARC_GNU_VTENTRY: 3383 break; 3384 3385 case elfcpp::R_SPARC_8: 3386 Relocate_functions<size, big_endian>::rela8(view, object, 3387 psymval, addend); 3388 break; 3389 3390 case elfcpp::R_SPARC_16: 3391 if (rela.get_r_offset() & 0x1) 3392 { 3393 // The assembler can sometimes emit unaligned relocations 3394 // for dwarf2 cfi directives. 3395 Reloc::ua16(view, object, psymval, addend); 3396 } 3397 else 3398 Relocate_functions<size, big_endian>::rela16(view, object, 3399 psymval, addend); 3400 break; 3401 3402 case elfcpp::R_SPARC_32: 3403 if (!parameters->options().output_is_position_independent()) 3404 { 3405 if (rela.get_r_offset() & 0x3) 3406 { 3407 // The assembler can sometimes emit unaligned relocations 3408 // for dwarf2 cfi directives. 3409 Reloc::ua32(view, object, psymval, addend); 3410 } 3411 else 3412 Relocate_functions<size, big_endian>::rela32(view, object, 3413 psymval, addend); 3414 } 3415 break; 3416 3417 case elfcpp::R_SPARC_DISP8: 3418 Reloc::disp8(view, object, psymval, addend, address); 3419 break; 3420 3421 case elfcpp::R_SPARC_DISP16: 3422 Reloc::disp16(view, object, psymval, addend, address); 3423 break; 3424 3425 case elfcpp::R_SPARC_DISP32: 3426 Reloc::disp32(view, object, psymval, addend, address); 3427 break; 3428 3429 case elfcpp::R_SPARC_DISP64: 3430 Reloc::disp64(view, object, psymval, addend, address); 3431 break; 3432 3433 case elfcpp::R_SPARC_WDISP30: 3434 case elfcpp::R_SPARC_WPLT30: 3435 Reloc::wdisp30(view, object, psymval, addend, address); 3436 if (target->may_relax()) 3437 relax_call(target, view, rela, view_size); 3438 break; 3439 3440 case elfcpp::R_SPARC_WDISP22: 3441 Reloc::wdisp22(view, object, psymval, addend, address); 3442 break; 3443 3444 case elfcpp::R_SPARC_WDISP19: 3445 Reloc::wdisp19(view, object, psymval, addend, address); 3446 break; 3447 3448 case elfcpp::R_SPARC_WDISP16: 3449 Reloc::wdisp16(view, object, psymval, addend, address); 3450 break; 3451 3452 case elfcpp::R_SPARC_WDISP10: 3453 Reloc::wdisp10(view, object, psymval, addend, address); 3454 break; 3455 3456 case elfcpp::R_SPARC_HI22: 3457 Reloc::hi22(view, object, psymval, addend); 3458 break; 3459 3460 case elfcpp::R_SPARC_22: 3461 Reloc::rela32_22(view, object, psymval, addend); 3462 break; 3463 3464 case elfcpp::R_SPARC_13: 3465 Reloc::rela32_13(view, object, psymval, addend); 3466 break; 3467 3468 case elfcpp::R_SPARC_LO10: 3469 Reloc::lo10(view, object, psymval, addend); 3470 break; 3471 3472 case elfcpp::R_SPARC_GOTDATA_OP_LOX10: 3473 if (gdop_valid) 3474 { 3475 Reloc::gdop_lox10(view, got_offset); 3476 break; 3477 } 3478 /* Fall through. */ 3479 case elfcpp::R_SPARC_GOT10: 3480 Reloc::lo10(view, got_offset, addend); 3481 break; 3482 3483 case elfcpp::R_SPARC_GOTDATA_OP: 3484 if (gdop_valid) 3485 { 3486 typedef typename elfcpp::Swap<32, true>::Valtype Insntype; 3487 Insntype* wv = reinterpret_cast<Insntype*>(view); 3488 Insntype val; 3489 3490 // {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd 3491 val = elfcpp::Swap<32, true>::readval(wv); 3492 val = 0x80000000 | (val & 0x3e07c01f); 3493 elfcpp::Swap<32, true>::writeval(wv, val); 3494 } 3495 break; 3496 3497 case elfcpp::R_SPARC_GOT13: 3498 Reloc::rela32_13(view, got_offset, addend); 3499 break; 3500 3501 case elfcpp::R_SPARC_GOTDATA_OP_HIX22: 3502 if (gdop_valid) 3503 { 3504 Reloc::gdop_hix22(view, got_offset); 3505 break; 3506 } 3507 /* Fall through. */ 3508 case elfcpp::R_SPARC_GOT22: 3509 Reloc::hi22(view, got_offset, addend); 3510 break; 3511 3512 case elfcpp::R_SPARC_PC10: 3513 Reloc::pc10(view, object, psymval, addend, address); 3514 break; 3515 3516 case elfcpp::R_SPARC_PC22: 3517 Reloc::pc22(view, object, psymval, addend, address); 3518 break; 3519 3520 case elfcpp::R_SPARC_TLS_DTPOFF32: 3521 case elfcpp::R_SPARC_UA32: 3522 Reloc::ua32(view, object, psymval, addend); 3523 break; 3524 3525 case elfcpp::R_SPARC_PLT64: 3526 Relocate_functions<size, big_endian>::rela64(view, object, 3527 psymval, addend); 3528 break; 3529 3530 case elfcpp::R_SPARC_PLT32: 3531 Relocate_functions<size, big_endian>::rela32(view, object, 3532 psymval, addend); 3533 break; 3534 3535 case elfcpp::R_SPARC_HIPLT22: 3536 Reloc::hi22(view, object, psymval, addend); 3537 break; 3538 3539 case elfcpp::R_SPARC_LOPLT10: 3540 Reloc::lo10(view, object, psymval, addend); 3541 break; 3542 3543 case elfcpp::R_SPARC_PCPLT32: 3544 Reloc::disp32(view, object, psymval, addend, address); 3545 break; 3546 3547 case elfcpp::R_SPARC_PCPLT22: 3548 Reloc::pcplt22(view, object, psymval, addend, address); 3549 break; 3550 3551 case elfcpp::R_SPARC_PCPLT10: 3552 Reloc::lo10(view, object, psymval, addend, address); 3553 break; 3554 3555 case elfcpp::R_SPARC_64: 3556 if (!parameters->options().output_is_position_independent()) 3557 { 3558 if (rela.get_r_offset() & 0x7) 3559 { 3560 // The assembler can sometimes emit unaligned relocations 3561 // for dwarf2 cfi directives. 3562 Reloc::ua64(view, object, psymval, addend); 3563 } 3564 else 3565 Relocate_functions<size, big_endian>::rela64(view, object, 3566 psymval, addend); 3567 } 3568 break; 3569 3570 case elfcpp::R_SPARC_OLO10: 3571 { 3572 unsigned int addend2 = rela.get_r_info() & 0xffffffff; 3573 addend2 = ((addend2 >> 8) ^ 0x800000) - 0x800000; 3574 Reloc::olo10(view, object, psymval, addend, addend2); 3575 } 3576 break; 3577 3578 case elfcpp::R_SPARC_HH22: 3579 Reloc::hh22(view, object, psymval, addend); 3580 break; 3581 3582 case elfcpp::R_SPARC_PC_HH22: 3583 Reloc::pc_hh22(view, object, psymval, addend, address); 3584 break; 3585 3586 case elfcpp::R_SPARC_HM10: 3587 Reloc::hm10(view, object, psymval, addend); 3588 break; 3589 3590 case elfcpp::R_SPARC_PC_HM10: 3591 Reloc::pc_hm10(view, object, psymval, addend, address); 3592 break; 3593 3594 case elfcpp::R_SPARC_LM22: 3595 Reloc::hi22(view, object, psymval, addend); 3596 break; 3597 3598 case elfcpp::R_SPARC_PC_LM22: 3599 Reloc::pcplt22(view, object, psymval, addend, address); 3600 break; 3601 3602 case elfcpp::R_SPARC_11: 3603 Reloc::rela32_11(view, object, psymval, addend); 3604 break; 3605 3606 case elfcpp::R_SPARC_10: 3607 Reloc::rela32_10(view, object, psymval, addend); 3608 break; 3609 3610 case elfcpp::R_SPARC_7: 3611 Reloc::rela32_7(view, object, psymval, addend); 3612 break; 3613 3614 case elfcpp::R_SPARC_6: 3615 Reloc::rela32_6(view, object, psymval, addend); 3616 break; 3617 3618 case elfcpp::R_SPARC_5: 3619 Reloc::rela32_5(view, object, psymval, addend); 3620 break; 3621 3622 case elfcpp::R_SPARC_HIX22: 3623 Reloc::hix22(view, object, psymval, addend); 3624 break; 3625 3626 case elfcpp::R_SPARC_LOX10: 3627 Reloc::lox10(view, object, psymval, addend); 3628 break; 3629 3630 case elfcpp::R_SPARC_H34: 3631 Reloc::h34(view, object, psymval, addend); 3632 break; 3633 3634 case elfcpp::R_SPARC_H44: 3635 Reloc::h44(view, object, psymval, addend); 3636 break; 3637 3638 case elfcpp::R_SPARC_M44: 3639 Reloc::m44(view, object, psymval, addend); 3640 break; 3641 3642 case elfcpp::R_SPARC_L44: 3643 Reloc::l44(view, object, psymval, addend); 3644 break; 3645 3646 case elfcpp::R_SPARC_TLS_DTPOFF64: 3647 case elfcpp::R_SPARC_UA64: 3648 Reloc::ua64(view, object, psymval, addend); 3649 break; 3650 3651 case elfcpp::R_SPARC_UA16: 3652 Reloc::ua16(view, object, psymval, addend); 3653 break; 3654 3655 case elfcpp::R_SPARC_TLS_GD_HI22: 3656 case elfcpp::R_SPARC_TLS_GD_LO10: 3657 case elfcpp::R_SPARC_TLS_GD_ADD: 3658 case elfcpp::R_SPARC_TLS_GD_CALL: 3659 case elfcpp::R_SPARC_TLS_LDM_HI22: 3660 case elfcpp::R_SPARC_TLS_LDM_LO10: 3661 case elfcpp::R_SPARC_TLS_LDM_ADD: 3662 case elfcpp::R_SPARC_TLS_LDM_CALL: 3663 case elfcpp::R_SPARC_TLS_LDO_HIX22: 3664 case elfcpp::R_SPARC_TLS_LDO_LOX10: 3665 case elfcpp::R_SPARC_TLS_LDO_ADD: 3666 case elfcpp::R_SPARC_TLS_IE_HI22: 3667 case elfcpp::R_SPARC_TLS_IE_LO10: 3668 case elfcpp::R_SPARC_TLS_IE_LD: 3669 case elfcpp::R_SPARC_TLS_IE_LDX: 3670 case elfcpp::R_SPARC_TLS_IE_ADD: 3671 case elfcpp::R_SPARC_TLS_LE_HIX22: 3672 case elfcpp::R_SPARC_TLS_LE_LOX10: 3673 this->relocate_tls(relinfo, target, relnum, rela, 3674 r_type, gsym, psymval, view, 3675 address, view_size); 3676 break; 3677 3678 case elfcpp::R_SPARC_COPY: 3679 case elfcpp::R_SPARC_GLOB_DAT: 3680 case elfcpp::R_SPARC_JMP_SLOT: 3681 case elfcpp::R_SPARC_JMP_IREL: 3682 case elfcpp::R_SPARC_RELATIVE: 3683 case elfcpp::R_SPARC_IRELATIVE: 3684 // These are outstanding tls relocs, which are unexpected when 3685 // linking. 3686 case elfcpp::R_SPARC_TLS_DTPMOD64: 3687 case elfcpp::R_SPARC_TLS_DTPMOD32: 3688 case elfcpp::R_SPARC_TLS_TPOFF64: 3689 case elfcpp::R_SPARC_TLS_TPOFF32: 3690 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3691 _("unexpected reloc %u in object file"), 3692 r_type); 3693 break; 3694 3695 default: 3696 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3697 _("unsupported reloc %u"), 3698 r_type); 3699 break; 3700 } 3701 3702 return true; 3703 } 3704 3705 // Perform a TLS relocation. 3706 3707 template<int size, bool big_endian> 3708 inline void 3709 Target_sparc<size, big_endian>::Relocate::relocate_tls( 3710 const Relocate_info<size, big_endian>* relinfo, 3711 Target_sparc<size, big_endian>* target, 3712 size_t relnum, 3713 const elfcpp::Rela<size, big_endian>& rela, 3714 unsigned int r_type, 3715 const Sized_symbol<size>* gsym, 3716 const Symbol_value<size>* psymval, 3717 unsigned char* view, 3718 typename elfcpp::Elf_types<size>::Elf_Addr address, 3719 section_size_type) 3720 { 3721 Output_segment* tls_segment = relinfo->layout->tls_segment(); 3722 typedef Sparc_relocate_functions<size, big_endian> Reloc; 3723 const Sized_relobj_file<size, big_endian>* object = relinfo->object; 3724 typedef typename elfcpp::Swap<32, true>::Valtype Insntype; 3725 3726 const elfcpp::Elf_Xword addend = rela.get_r_addend(); 3727 typename elfcpp::Elf_types<size>::Elf_Addr value = psymval->value(object, 0); 3728 3729 const bool is_final = 3730 (gsym == NULL 3731 ? !parameters->options().output_is_position_independent() 3732 : gsym->final_value_is_known()); 3733 const tls::Tls_optimization optimized_type 3734 = optimize_tls_reloc(is_final, r_type); 3735 3736 switch (r_type) 3737 { 3738 case elfcpp::R_SPARC_TLS_GD_HI22: 3739 case elfcpp::R_SPARC_TLS_GD_LO10: 3740 case elfcpp::R_SPARC_TLS_GD_ADD: 3741 case elfcpp::R_SPARC_TLS_GD_CALL: 3742 if (optimized_type == tls::TLSOPT_TO_LE) 3743 { 3744 Insntype* wv = reinterpret_cast<Insntype*>(view); 3745 Insntype val; 3746 3747 value -= tls_segment->memsz(); 3748 3749 switch (r_type) 3750 { 3751 case elfcpp::R_SPARC_TLS_GD_HI22: 3752 // TLS_GD_HI22 --> TLS_LE_HIX22 3753 Reloc::hix22(view, value, addend); 3754 break; 3755 3756 case elfcpp::R_SPARC_TLS_GD_LO10: 3757 // TLS_GD_LO10 --> TLS_LE_LOX10 3758 Reloc::lox10(view, value, addend); 3759 break; 3760 3761 case elfcpp::R_SPARC_TLS_GD_ADD: 3762 // add %reg1, %reg2, %reg3 --> mov %g7, %reg2, %reg3 3763 val = elfcpp::Swap<32, true>::readval(wv); 3764 val = (val & ~0x7c000) | 0x1c000; 3765 elfcpp::Swap<32, true>::writeval(wv, val); 3766 break; 3767 case elfcpp::R_SPARC_TLS_GD_CALL: 3768 // call __tls_get_addr --> nop 3769 elfcpp::Swap<32, true>::writeval(wv, sparc_nop); 3770 break; 3771 } 3772 break; 3773 } 3774 else 3775 { 3776 unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE 3777 ? GOT_TYPE_TLS_OFFSET 3778 : GOT_TYPE_TLS_PAIR); 3779 if (gsym != NULL) 3780 { 3781 gold_assert(gsym->has_got_offset(got_type)); 3782 value = gsym->got_offset(got_type); 3783 } 3784 else 3785 { 3786 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 3787 gold_assert(object->local_has_got_offset(r_sym, got_type)); 3788 value = object->local_got_offset(r_sym, got_type); 3789 } 3790 if (optimized_type == tls::TLSOPT_TO_IE) 3791 { 3792 Insntype* wv = reinterpret_cast<Insntype*>(view); 3793 Insntype val; 3794 3795 switch (r_type) 3796 { 3797 case elfcpp::R_SPARC_TLS_GD_HI22: 3798 // TLS_GD_HI22 --> TLS_IE_HI22 3799 Reloc::hi22(view, value, addend); 3800 break; 3801 3802 case elfcpp::R_SPARC_TLS_GD_LO10: 3803 // TLS_GD_LO10 --> TLS_IE_LO10 3804 Reloc::lo10(view, value, addend); 3805 break; 3806 3807 case elfcpp::R_SPARC_TLS_GD_ADD: 3808 // add %reg1, %reg2, %reg3 --> ld [%reg1 + %reg2], %reg3 3809 val = elfcpp::Swap<32, true>::readval(wv); 3810 3811 if (size == 64) 3812 val |= 0xc0580000; 3813 else 3814 val |= 0xc0000000; 3815 3816 elfcpp::Swap<32, true>::writeval(wv, val); 3817 break; 3818 3819 case elfcpp::R_SPARC_TLS_GD_CALL: 3820 // The compiler can put the TLS_GD_ADD instruction 3821 // into the delay slot of the call. If so, we need 3822 // to transpose the two instructions so that the 3823 // new sequence works properly. 3824 // 3825 // The test we use is if the instruction in the 3826 // delay slot is an add with destination register 3827 // equal to %o0 3828 val = elfcpp::Swap<32, true>::readval(wv + 1); 3829 if ((val & 0x81f80000) == 0x80000000 3830 && ((val >> 25) & 0x1f) == 0x8) 3831 { 3832 if (size == 64) 3833 val |= 0xc0580000; 3834 else 3835 val |= 0xc0000000; 3836 3837 elfcpp::Swap<32, true>::writeval(wv, val); 3838 3839 wv += 1; 3840 this->ignore_gd_add_ = true; 3841 } 3842 else 3843 { 3844 // Even if the delay slot isn't the TLS_GD_ADD 3845 // instruction, we still have to handle the case 3846 // where it sets up %o0 in some other way. 3847 elfcpp::Swap<32, true>::writeval(wv, val); 3848 wv += 1; 3849 this->reloc_adjust_addr_ = view + 4; 3850 } 3851 // call __tls_get_addr --> add %g7, %o0, %o0 3852 elfcpp::Swap<32, true>::writeval(wv, 0x9001c008); 3853 break; 3854 } 3855 break; 3856 } 3857 else if (optimized_type == tls::TLSOPT_NONE) 3858 { 3859 switch (r_type) 3860 { 3861 case elfcpp::R_SPARC_TLS_GD_HI22: 3862 Reloc::hi22(view, value, addend); 3863 break; 3864 case elfcpp::R_SPARC_TLS_GD_LO10: 3865 Reloc::lo10(view, value, addend); 3866 break; 3867 case elfcpp::R_SPARC_TLS_GD_ADD: 3868 break; 3869 case elfcpp::R_SPARC_TLS_GD_CALL: 3870 { 3871 Symbol_value<size> symval; 3872 elfcpp::Elf_Xword value; 3873 Symbol* tsym; 3874 3875 tsym = target->tls_get_addr_sym_; 3876 gold_assert(tsym); 3877 value = (target->plt_section()->address() + 3878 tsym->plt_offset()); 3879 symval.set_output_value(value); 3880 Reloc::wdisp30(view, object, &symval, addend, address); 3881 } 3882 break; 3883 } 3884 break; 3885 } 3886 } 3887 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3888 _("unsupported reloc %u"), 3889 r_type); 3890 break; 3891 3892 case elfcpp::R_SPARC_TLS_LDM_HI22: 3893 case elfcpp::R_SPARC_TLS_LDM_LO10: 3894 case elfcpp::R_SPARC_TLS_LDM_ADD: 3895 case elfcpp::R_SPARC_TLS_LDM_CALL: 3896 if (optimized_type == tls::TLSOPT_TO_LE) 3897 { 3898 Insntype* wv = reinterpret_cast<Insntype*>(view); 3899 3900 switch (r_type) 3901 { 3902 case elfcpp::R_SPARC_TLS_LDM_HI22: 3903 case elfcpp::R_SPARC_TLS_LDM_LO10: 3904 case elfcpp::R_SPARC_TLS_LDM_ADD: 3905 elfcpp::Swap<32, true>::writeval(wv, sparc_nop); 3906 break; 3907 3908 case elfcpp::R_SPARC_TLS_LDM_CALL: 3909 elfcpp::Swap<32, true>::writeval(wv, sparc_mov_g0_o0); 3910 break; 3911 } 3912 break; 3913 } 3914 else if (optimized_type == tls::TLSOPT_NONE) 3915 { 3916 // Relocate the field with the offset of the GOT entry for 3917 // the module index. 3918 unsigned int got_offset; 3919 3920 got_offset = target->got_mod_index_entry(NULL, NULL, NULL); 3921 switch (r_type) 3922 { 3923 case elfcpp::R_SPARC_TLS_LDM_HI22: 3924 Reloc::hi22(view, got_offset, addend); 3925 break; 3926 case elfcpp::R_SPARC_TLS_LDM_LO10: 3927 Reloc::lo10(view, got_offset, addend); 3928 break; 3929 case elfcpp::R_SPARC_TLS_LDM_ADD: 3930 break; 3931 case elfcpp::R_SPARC_TLS_LDM_CALL: 3932 { 3933 Symbol_value<size> symval; 3934 elfcpp::Elf_Xword value; 3935 Symbol* tsym; 3936 3937 tsym = target->tls_get_addr_sym_; 3938 gold_assert(tsym); 3939 value = (target->plt_section()->address() + 3940 tsym->plt_offset()); 3941 symval.set_output_value(value); 3942 Reloc::wdisp30(view, object, &symval, addend, address); 3943 } 3944 break; 3945 } 3946 break; 3947 } 3948 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3949 _("unsupported reloc %u"), 3950 r_type); 3951 break; 3952 3953 // These relocs can appear in debugging sections, in which case 3954 // we won't see the TLS_LDM relocs. The local_dynamic_type 3955 // field tells us this. 3956 case elfcpp::R_SPARC_TLS_LDO_HIX22: 3957 if (optimized_type == tls::TLSOPT_TO_LE) 3958 { 3959 value -= tls_segment->memsz(); 3960 Reloc::hix22(view, value, addend); 3961 } 3962 else 3963 Reloc::ldo_hix22(view, value, addend); 3964 break; 3965 case elfcpp::R_SPARC_TLS_LDO_LOX10: 3966 if (optimized_type == tls::TLSOPT_TO_LE) 3967 { 3968 value -= tls_segment->memsz(); 3969 Reloc::lox10(view, value, addend); 3970 } 3971 else 3972 Reloc::ldo_lox10(view, value, addend); 3973 break; 3974 case elfcpp::R_SPARC_TLS_LDO_ADD: 3975 if (optimized_type == tls::TLSOPT_TO_LE) 3976 { 3977 Insntype* wv = reinterpret_cast<Insntype*>(view); 3978 Insntype val; 3979 3980 // add %reg1, %reg2, %reg3 --> add %g7, %reg2, %reg3 3981 val = elfcpp::Swap<32, true>::readval(wv); 3982 val = (val & ~0x7c000) | 0x1c000; 3983 elfcpp::Swap<32, true>::writeval(wv, val); 3984 } 3985 break; 3986 3987 // When optimizing IE --> LE, the only relocation that is handled 3988 // differently is R_SPARC_TLS_IE_LD, it is rewritten from 3989 // 'ld{,x} [rs1 + rs2], rd' into 'mov rs2, rd' or simply a NOP is 3990 // rs2 and rd are the same. 3991 case elfcpp::R_SPARC_TLS_IE_LD: 3992 case elfcpp::R_SPARC_TLS_IE_LDX: 3993 if (optimized_type == tls::TLSOPT_TO_LE) 3994 { 3995 Insntype* wv = reinterpret_cast<Insntype*>(view); 3996 Insntype val = elfcpp::Swap<32, true>::readval(wv); 3997 Insntype rs2 = val & 0x1f; 3998 Insntype rd = (val >> 25) & 0x1f; 3999 4000 if (rs2 == rd) 4001 val = sparc_nop; 4002 else 4003 val = sparc_mov | (val & 0x3e00001f); 4004 4005 elfcpp::Swap<32, true>::writeval(wv, val); 4006 } 4007 break; 4008 4009 case elfcpp::R_SPARC_TLS_IE_HI22: 4010 case elfcpp::R_SPARC_TLS_IE_LO10: 4011 if (optimized_type == tls::TLSOPT_TO_LE) 4012 { 4013 value -= tls_segment->memsz(); 4014 switch (r_type) 4015 { 4016 case elfcpp::R_SPARC_TLS_IE_HI22: 4017 // IE_HI22 --> LE_HIX22 4018 Reloc::hix22(view, value, addend); 4019 break; 4020 case elfcpp::R_SPARC_TLS_IE_LO10: 4021 // IE_LO10 --> LE_LOX10 4022 Reloc::lox10(view, value, addend); 4023 break; 4024 } 4025 break; 4026 } 4027 else if (optimized_type == tls::TLSOPT_NONE) 4028 { 4029 // Relocate the field with the offset of the GOT entry for 4030 // the tp-relative offset of the symbol. 4031 if (gsym != NULL) 4032 { 4033 gold_assert(gsym->has_got_offset(GOT_TYPE_TLS_OFFSET)); 4034 value = gsym->got_offset(GOT_TYPE_TLS_OFFSET); 4035 } 4036 else 4037 { 4038 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 4039 gold_assert(object->local_has_got_offset(r_sym, 4040 GOT_TYPE_TLS_OFFSET)); 4041 value = object->local_got_offset(r_sym, 4042 GOT_TYPE_TLS_OFFSET); 4043 } 4044 switch (r_type) 4045 { 4046 case elfcpp::R_SPARC_TLS_IE_HI22: 4047 Reloc::hi22(view, value, addend); 4048 break; 4049 case elfcpp::R_SPARC_TLS_IE_LO10: 4050 Reloc::lo10(view, value, addend); 4051 break; 4052 } 4053 break; 4054 } 4055 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 4056 _("unsupported reloc %u"), 4057 r_type); 4058 break; 4059 4060 case elfcpp::R_SPARC_TLS_IE_ADD: 4061 // This seems to be mainly so that we can find the addition 4062 // instruction if there is one. There doesn't seem to be any 4063 // actual relocation to apply. 4064 break; 4065 4066 case elfcpp::R_SPARC_TLS_LE_HIX22: 4067 // If we're creating a shared library, a dynamic relocation will 4068 // have been created for this location, so do not apply it now. 4069 if (!parameters->options().shared()) 4070 { 4071 value -= tls_segment->memsz(); 4072 Reloc::hix22(view, value, addend); 4073 } 4074 break; 4075 4076 case elfcpp::R_SPARC_TLS_LE_LOX10: 4077 // If we're creating a shared library, a dynamic relocation will 4078 // have been created for this location, so do not apply it now. 4079 if (!parameters->options().shared()) 4080 { 4081 value -= tls_segment->memsz(); 4082 Reloc::lox10(view, value, addend); 4083 } 4084 break; 4085 } 4086 } 4087 4088 // Relax a call instruction. 4089 4090 template<int size, bool big_endian> 4091 inline void 4092 Target_sparc<size, big_endian>::Relocate::relax_call( 4093 Target_sparc<size, big_endian>* target, 4094 unsigned char* view, 4095 const elfcpp::Rela<size, big_endian>& rela, 4096 section_size_type view_size) 4097 { 4098 typedef typename elfcpp::Swap<32, true>::Valtype Insntype; 4099 Insntype *wv = reinterpret_cast<Insntype*>(view); 4100 Insntype call_insn, delay_insn, set_insn; 4101 uint32_t op3, reg, off; 4102 4103 // This code tries to relax call instructions that meet 4104 // certain criteria. 4105 // 4106 // The first criteria is that the call must be such that the return 4107 // address which the call writes into %o7 is unused. Two sequences 4108 // meet this criteria, and are used to implement tail calls. 4109 // 4110 // Leaf function tail call: 4111 // 4112 // or %o7, %g0, %ANY_REG 4113 // call FUNC 4114 // or %ANY_REG, %g0, %o7 4115 // 4116 // Non-leaf function tail call: 4117 // 4118 // call FUNC 4119 // restore 4120 // 4121 // The second criteria is that the call destination is close. If 4122 // the displacement can fit in a signed 22-bit immediate field of a 4123 // pre-V9 branch, we can do it. If we are generating a 64-bit 4124 // object or a 32-bit object with ELF machine type EF_SPARC32PLUS, 4125 // and the displacement fits in a signed 19-bit immediate field, 4126 // then we can use a V9 branch. 4127 4128 // Make sure the delay instruction can be safely accessed. 4129 if (rela.get_r_offset() + 8 > view_size) 4130 return; 4131 4132 call_insn = elfcpp::Swap<32, true>::readval(wv); 4133 delay_insn = elfcpp::Swap<32, true>::readval(wv + 1); 4134 4135 // Make sure it is really a call instruction. 4136 if (((call_insn >> 30) & 0x3) != 1) 4137 return; 4138 4139 if (((delay_insn >> 30) & 0x3) != 2) 4140 return; 4141 4142 // Accept only a restore or an integer arithmetic operation whose 4143 // sole side effect is to write the %o7 register (and perhaps set 4144 // the condition codes, which are considered clobbered across 4145 // function calls). 4146 // 4147 // For example, we don't want to match a tagged addition or 4148 // subtraction. We also don't want to match something like a 4149 // divide. 4150 // 4151 // Specifically we accept add{,cc}, and{,cc}, or{,cc}, 4152 // xor{,cc}, sub{,cc}, andn{,cc}, orn{,cc}, and xnor{,cc}. 4153 4154 op3 = (delay_insn >> 19) & 0x3f; 4155 reg = (delay_insn >> 25) & 0x1f; 4156 if (op3 != 0x3d 4157 && ((op3 & 0x28) != 0 || reg != 15)) 4158 return; 4159 4160 // For non-restore instructions, make sure %o7 isn't 4161 // an input. 4162 if (op3 != 0x3d) 4163 { 4164 // First check RS1 4165 reg = (delay_insn >> 14) & 0x15; 4166 if (reg == 15) 4167 return; 4168 4169 // And if non-immediate, check RS2 4170 if (((delay_insn >> 13) & 1) == 0) 4171 { 4172 reg = (delay_insn & 0x1f); 4173 if (reg == 15) 4174 return; 4175 } 4176 } 4177 4178 // Now check the branch distance. We are called after the 4179 // call has been relocated, so we just have to peek at the 4180 // offset contained in the instruction. 4181 off = call_insn & 0x3fffffff; 4182 if ((off & 0x3fe00000) != 0 4183 && (off & 0x3fe00000) != 0x3fe00000) 4184 return; 4185 4186 if ((size == 64 || target->elf_machine_ == elfcpp::EM_SPARC32PLUS) 4187 && ((off & 0x3c0000) == 0 4188 || (off & 0x3c0000) == 0x3c0000)) 4189 { 4190 // ba,pt %xcc, FUNC 4191 call_insn = 0x10680000 | (off & 0x07ffff); 4192 } 4193 else 4194 { 4195 // ba FUNC 4196 call_insn = 0x10800000 | (off & 0x3fffff); 4197 } 4198 elfcpp::Swap<32, true>::writeval(wv, call_insn); 4199 4200 // See if we can NOP out the delay slot instruction. We peek 4201 // at the instruction before the call to make sure we're dealing 4202 // with exactly the: 4203 // 4204 // or %o7, %g0, %ANY_REG 4205 // call 4206 // or %ANY_REG, %g0, %o7 4207 // 4208 // case. Otherwise this might be a tricky piece of hand written 4209 // assembler calculating %o7 in some non-trivial way, and therefore 4210 // we can't be sure that NOP'ing out the delay slot is safe. 4211 if (op3 == 0x02 4212 && rela.get_r_offset() >= 4) 4213 { 4214 if ((delay_insn & ~(0x1f << 14)) != 0x9e100000) 4215 return; 4216 4217 set_insn = elfcpp::Swap<32, true>::readval(wv - 1); 4218 if ((set_insn & ~(0x1f << 25)) != 0x8013c000) 4219 return; 4220 4221 reg = (set_insn >> 25) & 0x1f; 4222 if (reg == 0 || reg == 15) 4223 return; 4224 if (reg != ((delay_insn >> 14) & 0x1f)) 4225 return; 4226 4227 // All tests pass, nop it out. 4228 elfcpp::Swap<32, true>::writeval(wv + 1, sparc_nop); 4229 } 4230 } 4231 4232 // Relocate section data. 4233 4234 template<int size, bool big_endian> 4235 void 4236 Target_sparc<size, big_endian>::relocate_section( 4237 const Relocate_info<size, big_endian>* relinfo, 4238 unsigned int sh_type, 4239 const unsigned char* prelocs, 4240 size_t reloc_count, 4241 Output_section* output_section, 4242 bool needs_special_offset_handling, 4243 unsigned char* view, 4244 typename elfcpp::Elf_types<size>::Elf_Addr address, 4245 section_size_type view_size, 4246 const Reloc_symbol_changes* reloc_symbol_changes) 4247 { 4248 typedef Target_sparc<size, big_endian> Sparc; 4249 typedef typename Target_sparc<size, big_endian>::Relocate Sparc_relocate; 4250 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian> 4251 Classify_reloc; 4252 4253 gold_assert(sh_type == elfcpp::SHT_RELA); 4254 4255 gold::relocate_section<size, big_endian, Sparc, Sparc_relocate, 4256 gold::Default_comdat_behavior, Classify_reloc>( 4257 relinfo, 4258 this, 4259 prelocs, 4260 reloc_count, 4261 output_section, 4262 needs_special_offset_handling, 4263 view, 4264 address, 4265 view_size, 4266 reloc_symbol_changes); 4267 } 4268 4269 // Scan the relocs during a relocatable link. 4270 4271 template<int size, bool big_endian> 4272 void 4273 Target_sparc<size, big_endian>::scan_relocatable_relocs( 4274 Symbol_table* symtab, 4275 Layout* layout, 4276 Sized_relobj_file<size, big_endian>* object, 4277 unsigned int data_shndx, 4278 unsigned int sh_type, 4279 const unsigned char* prelocs, 4280 size_t reloc_count, 4281 Output_section* output_section, 4282 bool needs_special_offset_handling, 4283 size_t local_symbol_count, 4284 const unsigned char* plocal_symbols, 4285 Relocatable_relocs* rr) 4286 { 4287 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian> 4288 Classify_reloc; 4289 typedef gold::Default_scan_relocatable_relocs<Classify_reloc> 4290 Scan_relocatable_relocs; 4291 4292 gold_assert(sh_type == elfcpp::SHT_RELA); 4293 4294 gold::scan_relocatable_relocs<size, big_endian, Scan_relocatable_relocs>( 4295 symtab, 4296 layout, 4297 object, 4298 data_shndx, 4299 prelocs, 4300 reloc_count, 4301 output_section, 4302 needs_special_offset_handling, 4303 local_symbol_count, 4304 plocal_symbols, 4305 rr); 4306 } 4307 4308 // Scan the relocs for --emit-relocs. 4309 4310 template<int size, bool big_endian> 4311 void 4312 Target_sparc<size, big_endian>::emit_relocs_scan( 4313 Symbol_table* symtab, 4314 Layout* layout, 4315 Sized_relobj_file<size, big_endian>* object, 4316 unsigned int data_shndx, 4317 unsigned int sh_type, 4318 const unsigned char* prelocs, 4319 size_t reloc_count, 4320 Output_section* output_section, 4321 bool needs_special_offset_handling, 4322 size_t local_symbol_count, 4323 const unsigned char* plocal_syms, 4324 Relocatable_relocs* rr) 4325 { 4326 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian> 4327 Classify_reloc; 4328 typedef gold::Default_emit_relocs_strategy<Classify_reloc> 4329 Emit_relocs_strategy; 4330 4331 gold_assert(sh_type == elfcpp::SHT_RELA); 4332 4333 gold::scan_relocatable_relocs<size, big_endian, Emit_relocs_strategy>( 4334 symtab, 4335 layout, 4336 object, 4337 data_shndx, 4338 prelocs, 4339 reloc_count, 4340 output_section, 4341 needs_special_offset_handling, 4342 local_symbol_count, 4343 plocal_syms, 4344 rr); 4345 } 4346 4347 // Emit relocations for a section. 4348 4349 template<int size, bool big_endian> 4350 void 4351 Target_sparc<size, big_endian>::relocate_relocs( 4352 const Relocate_info<size, big_endian>* relinfo, 4353 unsigned int sh_type, 4354 const unsigned char* prelocs, 4355 size_t reloc_count, 4356 Output_section* output_section, 4357 typename elfcpp::Elf_types<size>::Elf_Off offset_in_output_section, 4358 unsigned char* view, 4359 typename elfcpp::Elf_types<size>::Elf_Addr view_address, 4360 section_size_type view_size, 4361 unsigned char* reloc_view, 4362 section_size_type reloc_view_size) 4363 { 4364 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, big_endian> 4365 Classify_reloc; 4366 4367 gold_assert(sh_type == elfcpp::SHT_RELA); 4368 4369 gold::relocate_relocs<size, big_endian, Classify_reloc>( 4370 relinfo, 4371 prelocs, 4372 reloc_count, 4373 output_section, 4374 offset_in_output_section, 4375 view, 4376 view_address, 4377 view_size, 4378 reloc_view, 4379 reloc_view_size); 4380 } 4381 4382 // Return the value to use for a dynamic which requires special 4383 // treatment. This is how we support equality comparisons of function 4384 // pointers across shared library boundaries, as described in the 4385 // processor specific ABI supplement. 4386 4387 template<int size, bool big_endian> 4388 uint64_t 4389 Target_sparc<size, big_endian>::do_dynsym_value(const Symbol* gsym) const 4390 { 4391 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset()); 4392 return this->plt_section()->address() + gsym->plt_offset(); 4393 } 4394 4395 // do_make_elf_object to override the same function in the base class. 4396 // We need to use a target-specific sub-class of 4397 // Sized_relobj_file<size, big_endian> to process SPARC specific bits 4398 // of the ELF headers. Hence we need to have our own ELF object creation. 4399 4400 template<int size, bool big_endian> 4401 Object* 4402 Target_sparc<size, big_endian>::do_make_elf_object( 4403 const std::string& name, 4404 Input_file* input_file, 4405 off_t offset, const elfcpp::Ehdr<size, big_endian>& ehdr) 4406 { 4407 elfcpp::Elf_Half machine = ehdr.get_e_machine(); 4408 elfcpp::Elf_Word flags = ehdr.get_e_flags(); 4409 elfcpp::Elf_Word omm, mm; 4410 4411 switch (machine) 4412 { 4413 case elfcpp::EM_SPARC32PLUS: 4414 this->elf_machine_ = elfcpp::EM_SPARC32PLUS; 4415 break; 4416 4417 case elfcpp::EM_SPARC: 4418 case elfcpp::EM_SPARCV9: 4419 break; 4420 4421 default: 4422 break; 4423 } 4424 4425 if (!this->elf_flags_set_) 4426 { 4427 this->elf_flags_ = flags; 4428 this->elf_flags_set_ = true; 4429 } 4430 else 4431 { 4432 // Accumulate cpu feature bits. 4433 this->elf_flags_ |= (flags & (elfcpp::EF_SPARC_32PLUS 4434 | elfcpp::EF_SPARC_SUN_US1 4435 | elfcpp::EF_SPARC_HAL_R1 4436 | elfcpp::EF_SPARC_SUN_US3)); 4437 4438 // Bump the memory model setting to the most restrictive 4439 // one we encounter. 4440 omm = (this->elf_flags_ & elfcpp::EF_SPARCV9_MM); 4441 mm = (flags & elfcpp::EF_SPARCV9_MM); 4442 if (omm != mm) 4443 { 4444 if (mm == elfcpp::EF_SPARCV9_TSO) 4445 { 4446 this->elf_flags_ &= ~elfcpp::EF_SPARCV9_MM; 4447 this->elf_flags_ |= elfcpp::EF_SPARCV9_TSO; 4448 } 4449 else if (mm == elfcpp::EF_SPARCV9_PSO 4450 && omm == elfcpp::EF_SPARCV9_RMO) 4451 { 4452 this->elf_flags_ &= ~elfcpp::EF_SPARCV9_MM; 4453 this->elf_flags_ |= elfcpp::EF_SPARCV9_PSO; 4454 } 4455 } 4456 } 4457 4458 // Validate that the little-endian flag matches how we've 4459 // been instantiated. 4460 if (!(flags & elfcpp::EF_SPARC_LEDATA) != big_endian) 4461 { 4462 if (big_endian) 4463 gold_error(_("%s: little endian elf flag set on BE object"), 4464 name.c_str()); 4465 else 4466 gold_error(_("%s: little endian elf flag clear on LE object"), 4467 name.c_str()); 4468 } 4469 4470 return Target::do_make_elf_object(name, input_file, offset, ehdr); 4471 } 4472 4473 // Adjust ELF file header. 4474 4475 template<int size, bool big_endian> 4476 void 4477 Target_sparc<size, big_endian>::do_adjust_elf_header( 4478 unsigned char* view, 4479 int len) 4480 { 4481 elfcpp::Ehdr_write<size, big_endian> oehdr(view); 4482 4483 oehdr.put_e_machine(this->elf_machine_); 4484 oehdr.put_e_flags(this->elf_flags_); 4485 4486 Sized_target<size, big_endian>::do_adjust_elf_header(view, len); 4487 } 4488 4489 // The selector for sparc object files. 4490 4491 template<int size, bool big_endian> 4492 class Target_selector_sparc : public Target_selector 4493 { 4494 public: 4495 Target_selector_sparc() 4496 : Target_selector(elfcpp::EM_NONE, size, big_endian, 4497 (size == 64 ? "elf64-sparc" : "elf32-sparc"), 4498 (size == 64 ? "elf64_sparc" : "elf32_sparc")) 4499 { } 4500 4501 virtual Target* 4502 do_recognize(Input_file*, off_t, int machine, int, int) 4503 { 4504 switch (size) 4505 { 4506 case 64: 4507 if (machine != elfcpp::EM_SPARCV9) 4508 return NULL; 4509 break; 4510 4511 case 32: 4512 if (machine != elfcpp::EM_SPARC 4513 && machine != elfcpp::EM_SPARC32PLUS) 4514 return NULL; 4515 break; 4516 4517 default: 4518 return NULL; 4519 } 4520 4521 return this->instantiate_target(); 4522 } 4523 4524 virtual Target* 4525 do_instantiate_target() 4526 { return new Target_sparc<size, big_endian>(); } 4527 }; 4528 4529 Target_selector_sparc<32, true> target_selector_sparc32; 4530 Target_selector_sparc<64, true> target_selector_sparc64; 4531 4532 } // End anonymous namespace. 4533