1 // s390.cc -- s390 target support for gold. 2 3 // Copyright (C) 2015-2016 Free Software Foundation, Inc. 4 // Written by Marcin Kocielnicki <koriakin (at) 0x04.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 <cstring> 26 27 #include "elfcpp.h" 28 #include "dwarf.h" 29 #include "parameters.h" 30 #include "reloc.h" 31 #include "s390.h" 32 #include "object.h" 33 #include "symtab.h" 34 #include "layout.h" 35 #include "output.h" 36 #include "copy-relocs.h" 37 #include "target.h" 38 #include "target-reloc.h" 39 #include "target-select.h" 40 #include "tls.h" 41 #include "gc.h" 42 #include "icf.h" 43 44 namespace 45 { 46 47 using namespace gold; 48 49 // A class to handle the .got.plt section. 50 51 template<int size> 52 class Output_data_got_plt_s390 : public Output_section_data_build 53 { 54 public: 55 Output_data_got_plt_s390(Layout* layout) 56 : Output_section_data_build(size/8), 57 layout_(layout) 58 { } 59 60 Output_data_got_plt_s390(Layout* layout, off_t data_size) 61 : Output_section_data_build(data_size, size/8), 62 layout_(layout) 63 { } 64 65 protected: 66 // Write out the PLT data. 67 void 68 do_write(Output_file*); 69 70 // Write to a map file. 71 void 72 do_print_to_mapfile(Mapfile* mapfile) const 73 { mapfile->print_output_data(this, "** GOT PLT"); } 74 75 private: 76 // A pointer to the Layout class, so that we can find the .dynamic 77 // section when we write out the GOT PLT section. 78 Layout* layout_; 79 }; 80 81 // A class to handle the PLT data. 82 83 template<int size> 84 class Output_data_plt_s390 : public Output_section_data 85 { 86 public: 87 typedef Output_data_reloc<elfcpp::SHT_RELA, true, size, true> 88 Reloc_section; 89 90 Output_data_plt_s390(Layout* layout, 91 Output_data_got<size, true>* got, 92 Output_data_got_plt_s390<size>* got_plt, 93 Output_data_space* got_irelative) 94 : Output_section_data(4), layout_(layout), 95 irelative_rel_(NULL), got_(got), got_plt_(got_plt), 96 got_irelative_(got_irelative), count_(0), 97 irelative_count_(0), free_list_() 98 { this->init(layout); } 99 100 Output_data_plt_s390(Layout* layout, 101 Output_data_got<size, true>* got, 102 Output_data_got_plt_s390<size>* got_plt, 103 Output_data_space* got_irelative, 104 unsigned int plt_count) 105 : Output_section_data((plt_count + 1) * plt_entry_size, 106 4, false), 107 layout_(layout), irelative_rel_(NULL), got_(got), 108 got_plt_(got_plt), got_irelative_(got_irelative), count_(plt_count), 109 irelative_count_(0), free_list_() 110 { 111 this->init(layout); 112 113 // Initialize the free list and reserve the first entry. 114 this->free_list_.init((plt_count + 1) * plt_entry_size, false); 115 this->free_list_.remove(0, plt_entry_size); 116 } 117 118 // Initialize the PLT section. 119 void 120 init(Layout* layout); 121 122 // Add an entry to the PLT. 123 void 124 add_entry(Symbol_table*, Layout*, Symbol* gsym); 125 126 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol. 127 unsigned int 128 add_local_ifunc_entry(Symbol_table*, Layout*, 129 Sized_relobj_file<size, true>*, unsigned int); 130 131 // Add the relocation for a PLT entry. 132 void 133 add_relocation(Symbol_table*, Layout*, Symbol*, unsigned int); 134 135 // Return the .rela.plt section data. 136 Reloc_section* 137 rela_plt() 138 { return this->rel_; } 139 140 // Return where the IRELATIVE relocations should go in the PLT 141 // relocations. 142 Reloc_section* 143 rela_irelative(Symbol_table*, Layout*); 144 145 // Return whether we created a section for IRELATIVE relocations. 146 bool 147 has_irelative_section() const 148 { return this->irelative_rel_ != NULL; } 149 150 // Return the number of PLT entries. 151 unsigned int 152 entry_count() const 153 { return this->count_ + this->irelative_count_; } 154 155 // Return the offset of the first non-reserved PLT entry. 156 unsigned int 157 first_plt_entry_offset() 158 { return plt_entry_size; } 159 160 // Return the size of a PLT entry. 161 unsigned int 162 get_plt_entry_size() const 163 { return plt_entry_size; } 164 165 // Reserve a slot in the PLT for an existing symbol in an incremental update. 166 void 167 reserve_slot(unsigned int plt_index) 168 { 169 this->free_list_.remove((plt_index + 1) * plt_entry_size, 170 (plt_index + 2) * plt_entry_size); 171 } 172 173 // Return the PLT address to use for a global symbol. 174 uint64_t 175 address_for_global(const Symbol*); 176 177 // Return the PLT address to use for a local symbol. 178 uint64_t 179 address_for_local(const Relobj*, unsigned int symndx); 180 181 // Add .eh_frame information for the PLT. 182 void 183 add_eh_frame(Layout* layout) 184 { 185 (void)layout; 186 layout->add_eh_frame_for_plt(this, 187 plt_eh_frame_cie, 188 plt_eh_frame_cie_size, 189 plt_eh_frame_fde, 190 plt_eh_frame_fde_size); 191 } 192 193 protected: 194 // Fill in the first PLT entry. 195 void 196 fill_first_plt_entry(unsigned char* pov, 197 typename elfcpp::Elf_types<size>::Elf_Addr got_address, 198 typename elfcpp::Elf_types<size>::Elf_Addr plt_address); 199 200 // Fill in a normal PLT entry. Returns the offset into the entry that 201 // should be the initial GOT slot value. 202 unsigned int 203 fill_plt_entry(unsigned char* pov, 204 typename elfcpp::Elf_types<size>::Elf_Addr got_address, 205 typename elfcpp::Elf_types<size>::Elf_Addr plt_address, 206 unsigned int got_offset, 207 unsigned int plt_offset, 208 unsigned int plt_rel_offset); 209 210 void 211 do_adjust_output_section(Output_section* os); 212 213 // Write to a map file. 214 void 215 do_print_to_mapfile(Mapfile* mapfile) const 216 { mapfile->print_output_data(this, _("** PLT")); } 217 218 private: 219 // Set the final size. 220 void 221 set_final_data_size(); 222 223 // Write out the PLT data. 224 void 225 do_write(Output_file*); 226 227 // A pointer to the Layout class, so that we can find the .dynamic 228 // section when we write out the GOT PLT section. 229 Layout* layout_; 230 // The reloc section. 231 Reloc_section* rel_; 232 // The IRELATIVE relocs, if necessary. These must follow the 233 // regular PLT relocations. 234 Reloc_section* irelative_rel_; 235 // The .got section. 236 Output_data_got<size, true>* got_; 237 // The .got.plt section. 238 Output_data_got_plt_s390<size>* got_plt_; 239 // The part of the .got.plt section used for IRELATIVE relocs. 240 Output_data_space* got_irelative_; 241 // The number of PLT entries. 242 unsigned int count_; 243 // Number of PLT entries with R_TILEGX_IRELATIVE relocs. These 244 // follow the regular PLT entries. 245 unsigned int irelative_count_; 246 // List of available regions within the section, for incremental 247 // update links. 248 Free_list free_list_; 249 250 // The size of an entry in the PLT. 251 static const int plt_entry_size = 0x20; 252 // The first entry in the PLT. 253 static const unsigned char first_plt_entry_32_abs[plt_entry_size]; 254 static const unsigned char first_plt_entry_32_pic[plt_entry_size]; 255 static const unsigned char first_plt_entry_64[plt_entry_size]; 256 // Other entries in the PLT for an executable. 257 static const unsigned char plt_entry_32_abs[plt_entry_size]; 258 static const unsigned char plt_entry_32_pic12[plt_entry_size]; 259 static const unsigned char plt_entry_32_pic16[plt_entry_size]; 260 static const unsigned char plt_entry_32_pic[plt_entry_size]; 261 static const unsigned char plt_entry_64[plt_entry_size]; 262 263 // The .eh_frame unwind information for the PLT. 264 static const int plt_eh_frame_cie_size = 12; 265 static const unsigned char plt_eh_frame_cie[plt_eh_frame_cie_size]; 266 static const int plt_eh_frame_fde_size = 12; 267 static const unsigned char plt_eh_frame_fde[plt_eh_frame_fde_size]; 268 }; 269 270 271 template<int size> 272 class Target_s390 : public Sized_target<size, true> 273 { 274 public: 275 typedef Output_data_reloc<elfcpp::SHT_RELA, true, size, true> Reloc_section; 276 277 Target_s390() 278 : Sized_target<size, true>(&s390_info), 279 got_(NULL), plt_(NULL), got_plt_(NULL), got_irelative_(NULL), 280 global_offset_table_(NULL), rela_dyn_(NULL), 281 rela_irelative_(NULL), copy_relocs_(elfcpp::R_390_COPY), 282 got_mod_index_offset_(-1U), tls_base_symbol_defined_(false), 283 layout_(NULL) 284 { } 285 286 // Scan the relocations to look for symbol adjustments. 287 void 288 gc_process_relocs(Symbol_table* symtab, 289 Layout* layout, 290 Sized_relobj_file<size, true>* object, 291 unsigned int data_shndx, 292 unsigned int sh_type, 293 const unsigned char* prelocs, 294 size_t reloc_count, 295 Output_section* output_section, 296 bool needs_special_offset_handling, 297 size_t local_symbol_count, 298 const unsigned char* plocal_symbols); 299 300 // Scan the relocations to look for symbol adjustments. 301 void 302 scan_relocs(Symbol_table* symtab, 303 Layout* layout, 304 Sized_relobj_file<size, true>* object, 305 unsigned int data_shndx, 306 unsigned int sh_type, 307 const unsigned char* prelocs, 308 size_t reloc_count, 309 Output_section* output_section, 310 bool needs_special_offset_handling, 311 size_t local_symbol_count, 312 const unsigned char* plocal_symbols); 313 314 // Finalize the sections. 315 void 316 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*); 317 318 // Return the value to use for a dynamic which requires special 319 // treatment. 320 uint64_t 321 do_dynsym_value(const Symbol*) const; 322 323 // Relocate a section. 324 void 325 relocate_section(const Relocate_info<size, true>*, 326 unsigned int sh_type, 327 const unsigned char* prelocs, 328 size_t reloc_count, 329 Output_section* output_section, 330 bool needs_special_offset_handling, 331 unsigned char* view, 332 typename elfcpp::Elf_types<size>::Elf_Addr view_address, 333 section_size_type view_size, 334 const Reloc_symbol_changes*); 335 336 // Scan the relocs during a relocatable link. 337 void 338 scan_relocatable_relocs(Symbol_table* symtab, 339 Layout* layout, 340 Sized_relobj_file<size, true>* object, 341 unsigned int data_shndx, 342 unsigned int sh_type, 343 const unsigned char* prelocs, 344 size_t reloc_count, 345 Output_section* output_section, 346 bool needs_special_offset_handling, 347 size_t local_symbol_count, 348 const unsigned char* plocal_symbols, 349 Relocatable_relocs*); 350 351 // Scan the relocs for --emit-relocs. 352 void 353 emit_relocs_scan(Symbol_table* symtab, 354 Layout* layout, 355 Sized_relobj_file<size, true>* object, 356 unsigned int data_shndx, 357 unsigned int sh_type, 358 const unsigned char* prelocs, 359 size_t reloc_count, 360 Output_section* output_section, 361 bool needs_special_offset_handling, 362 size_t local_symbol_count, 363 const unsigned char* plocal_syms, 364 Relocatable_relocs* rr); 365 366 // Return a string used to fill a code section with nops. 367 std::string 368 do_code_fill(section_size_type length) const; 369 370 // Emit relocations for a section. 371 void 372 relocate_relocs( 373 const Relocate_info<size, true>*, 374 unsigned int sh_type, 375 const unsigned char* prelocs, 376 size_t reloc_count, 377 Output_section* output_section, 378 typename elfcpp::Elf_types<size>::Elf_Off offset_in_output_section, 379 unsigned char* view, 380 typename elfcpp::Elf_types<size>::Elf_Addr view_address, 381 section_size_type view_size, 382 unsigned char* reloc_view, 383 section_size_type reloc_view_size); 384 385 // Return whether SYM is defined by the ABI. 386 bool 387 do_is_defined_by_abi(const Symbol* sym) const 388 { return strcmp(sym->name(), "__tls_get_offset") == 0; } 389 390 // Return the PLT address to use for a global symbol. 391 uint64_t 392 do_plt_address_for_global(const Symbol* gsym) const 393 { return this->plt_section()->address_for_global(gsym); } 394 395 uint64_t 396 do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const 397 { return this->plt_section()->address_for_local(relobj, symndx); } 398 399 // Return the offset to use for the GOT_INDX'th got entry which is 400 // for a local tls symbol specified by OBJECT, SYMNDX. 401 int64_t 402 do_tls_offset_for_local(const Relobj* object, 403 unsigned int symndx, 404 unsigned int got_indx) const; 405 406 // Return the offset to use for the GOT_INDX'th got entry which is 407 // for global tls symbol GSYM. 408 int64_t 409 do_tls_offset_for_global(Symbol* gsym, unsigned int got_indx) const; 410 411 // This function should be defined in targets that can use relocation 412 // types to determine (implemented in local_reloc_may_be_function_pointer 413 // and global_reloc_may_be_function_pointer) 414 // if a function's pointer is taken. ICF uses this in safe mode to only 415 // fold those functions whose pointer is defintely not taken. 416 bool 417 do_can_check_for_function_pointers() const 418 { return true; } 419 420 // Return whether SYM is call to a non-split function. 421 bool 422 do_is_call_to_non_split(const Symbol* sym, const unsigned char* preloc, 423 const unsigned char* view, 424 section_size_type view_size) const; 425 426 // Adjust -fsplit-stack code which calls non-split-stack code. 427 void 428 do_calls_non_split(Relobj* object, unsigned int shndx, 429 section_offset_type fnoffset, section_size_type fnsize, 430 const unsigned char* prelocs, size_t reloc_count, 431 unsigned char* view, section_size_type view_size, 432 std::string* from, std::string* to) const; 433 434 // Return the size of the GOT section. 435 section_size_type 436 got_size() const 437 { 438 gold_assert(this->got_ != NULL); 439 return this->got_->data_size(); 440 } 441 442 // Return the number of entries in the GOT. 443 unsigned int 444 got_entry_count() const 445 { 446 if (this->got_ == NULL) 447 return 0; 448 return this->got_size() / (size / 8); 449 } 450 451 // Return the number of entries in the PLT. 452 unsigned int 453 plt_entry_count() const; 454 455 // Return the offset of the first non-reserved PLT entry. 456 unsigned int 457 first_plt_entry_offset() const; 458 459 // Return the size of each PLT entry. 460 unsigned int 461 plt_entry_size() const; 462 463 // Create the GOT section for an incremental update. 464 Output_data_got_base* 465 init_got_plt_for_update(Symbol_table* symtab, 466 Layout* layout, 467 unsigned int got_count, 468 unsigned int plt_count); 469 470 // Reserve a GOT entry for a local symbol, and regenerate any 471 // necessary dynamic relocations. 472 void 473 reserve_local_got_entry(unsigned int got_index, 474 Sized_relobj<size, true>* obj, 475 unsigned int r_sym, 476 unsigned int got_type); 477 478 // Reserve a GOT entry for a global symbol, and regenerate any 479 // necessary dynamic relocations. 480 void 481 reserve_global_got_entry(unsigned int got_index, Symbol* gsym, 482 unsigned int got_type); 483 484 // Register an existing PLT entry for a global symbol. 485 void 486 register_global_plt_entry(Symbol_table*, Layout*, unsigned int plt_index, 487 Symbol* gsym); 488 489 // Force a COPY relocation for a given symbol. 490 void 491 emit_copy_reloc(Symbol_table*, Symbol*, Output_section*, off_t); 492 493 // Apply an incremental relocation. 494 void 495 apply_relocation(const Relocate_info<size, true>* relinfo, 496 typename elfcpp::Elf_types<size>::Elf_Addr r_offset, 497 unsigned int r_type, 498 typename elfcpp::Elf_types<size>::Elf_Swxword r_addend, 499 const Symbol* gsym, 500 unsigned char* view, 501 typename elfcpp::Elf_types<size>::Elf_Addr address, 502 section_size_type view_size); 503 504 private: 505 506 // The class which scans relocations. 507 class Scan 508 { 509 public: 510 Scan() 511 : issued_non_pic_error_(false) 512 { } 513 514 static inline int 515 get_reference_flags(unsigned int r_type); 516 517 inline void 518 local(Symbol_table* symtab, Layout* layout, Target_s390* target, 519 Sized_relobj_file<size, true>* object, 520 unsigned int data_shndx, 521 Output_section* output_section, 522 const elfcpp::Rela<size, true>& reloc, unsigned int r_type, 523 const elfcpp::Sym<size, true>& lsym, 524 bool is_discarded); 525 526 inline void 527 global(Symbol_table* symtab, Layout* layout, Target_s390* target, 528 Sized_relobj_file<size, true>* object, 529 unsigned int data_shndx, 530 Output_section* output_section, 531 const elfcpp::Rela<size, true>& reloc, unsigned int r_type, 532 Symbol* gsym); 533 534 inline bool 535 local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout, 536 Target_s390* target, 537 Sized_relobj_file<size, true>* object, 538 unsigned int data_shndx, 539 Output_section* output_section, 540 const elfcpp::Rela<size, true>& reloc, 541 unsigned int r_type, 542 const elfcpp::Sym<size, true>& lsym); 543 544 inline bool 545 global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout, 546 Target_s390* target, 547 Sized_relobj_file<size, true>* object, 548 unsigned int data_shndx, 549 Output_section* output_section, 550 const elfcpp::Rela<size, true>& reloc, 551 unsigned int r_type, 552 Symbol* gsym); 553 554 private: 555 static void 556 unsupported_reloc_local(Sized_relobj_file<size, true>*, 557 unsigned int r_type); 558 559 static void 560 unsupported_reloc_global(Sized_relobj_file<size, true>*, 561 unsigned int r_type, Symbol*); 562 563 void 564 check_non_pic(Relobj*, unsigned int r_type); 565 566 inline bool 567 possible_function_pointer_reloc(unsigned int r_type); 568 569 bool 570 reloc_needs_plt_for_ifunc(Sized_relobj_file<size, true>*, 571 unsigned int r_type); 572 573 // Whether we have issued an error about a non-PIC compilation. 574 bool issued_non_pic_error_; 575 }; 576 577 // The class which implements relocation. 578 class Relocate 579 { 580 public: 581 // Do a relocation. Return false if the caller should not issue 582 // any warnings about this relocation. 583 inline bool 584 relocate(const Relocate_info<size, true>*, unsigned int, 585 Target_s390*, Output_section*, size_t, const unsigned char*, 586 const Sized_symbol<size>*, const Symbol_value<size>*, 587 unsigned char*, typename elfcpp::Elf_types<size>::Elf_Addr, 588 section_size_type); 589 590 private: 591 // Do a TLS relocation. 592 inline typename elfcpp::Elf_types<size>::Elf_Addr 593 relocate_tls(const Relocate_info<size, true>*, Target_s390*, 594 size_t relnum, const elfcpp::Rela<size, true>&, 595 unsigned int r_type, const Sized_symbol<size>*, 596 const Symbol_value<size>*, 597 unsigned char*, section_size_type); 598 599 // Do a TLS General-Dynamic to Initial-Exec transition. 600 inline void 601 tls_gd_to_ie(const Relocate_info<size, true>*, size_t relnum, 602 const elfcpp::Rela<size, true>&, 603 unsigned char* view, 604 section_size_type view_size); 605 606 // Do a TLS General-Dynamic to Local-Exec transition. 607 inline void 608 tls_gd_to_le(const Relocate_info<size, true>*, size_t relnum, 609 const elfcpp::Rela<size, true>&, 610 unsigned char* view, 611 section_size_type view_size); 612 613 // Do a TLS Local-Dynamic to Local-Exec transition. 614 inline void 615 tls_ld_to_le(const Relocate_info<size, true>*, size_t relnum, 616 const elfcpp::Rela<size, true>&, 617 unsigned char* view, 618 section_size_type view_size); 619 620 // Do a TLS Initial-Exec to Local-Exec transition. 621 static inline void 622 tls_ie_to_le(const Relocate_info<size, true>*, size_t relnum, 623 const elfcpp::Rela<size, true>&, 624 unsigned char* view, 625 section_size_type view_size); 626 }; 627 628 // Adjust TLS relocation type based on the options and whether this 629 // is a local symbol. 630 static tls::Tls_optimization 631 optimize_tls_reloc(bool is_final, int r_type); 632 633 // Get the GOT section. 634 const Output_data_got<size, true>* 635 got_section() const 636 { 637 gold_assert(this->got_ != NULL); 638 return this->got_; 639 } 640 641 // Get the GOT section, creating it if necessary. 642 Output_data_got<size, true>* 643 got_section(Symbol_table*, Layout*); 644 645 typename elfcpp::Elf_types<size>::Elf_Addr 646 got_address() const 647 { 648 gold_assert(this->got_ != NULL); 649 return this->got_plt_->address(); 650 } 651 652 typename elfcpp::Elf_types<size>::Elf_Addr 653 got_main_offset() const 654 { 655 gold_assert(this->got_ != NULL); 656 return this->got_->address() - this->got_address(); 657 } 658 659 // Create the PLT section. 660 void 661 make_plt_section(Symbol_table* symtab, Layout* layout); 662 663 // Create a PLT entry for a global symbol. 664 void 665 make_plt_entry(Symbol_table*, Layout*, Symbol*); 666 667 // Create a PLT entry for a local STT_GNU_IFUNC symbol. 668 void 669 make_local_ifunc_plt_entry(Symbol_table*, Layout*, 670 Sized_relobj_file<size, true>* relobj, 671 unsigned int local_sym_index); 672 673 // Create a GOT entry for the TLS module index. 674 unsigned int 675 got_mod_index_entry(Symbol_table* symtab, Layout* layout, 676 Sized_relobj_file<size, true>* object); 677 678 // Get the PLT section. 679 Output_data_plt_s390<size>* 680 plt_section() const 681 { 682 gold_assert(this->plt_ != NULL); 683 return this->plt_; 684 } 685 686 // Get the dynamic reloc section, creating it if necessary. 687 Reloc_section* 688 rela_dyn_section(Layout*); 689 690 // Get the section to use for IRELATIVE relocations. 691 Reloc_section* 692 rela_irelative_section(Layout*); 693 694 // Add a potential copy relocation. 695 void 696 copy_reloc(Symbol_table* symtab, Layout* layout, 697 Sized_relobj_file<size, true>* object, 698 unsigned int shndx, Output_section* output_section, 699 Symbol* sym, const elfcpp::Rela<size, true>& reloc) 700 { 701 unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info()); 702 this->copy_relocs_.copy_reloc(symtab, layout, 703 symtab->get_sized_symbol<size>(sym), 704 object, shndx, output_section, 705 r_type, reloc.get_r_offset(), 706 reloc.get_r_addend(), 707 this->rela_dyn_section(layout)); 708 } 709 710 // A function for targets to call. Return whether BYTES/LEN matches 711 // VIEW/VIEW_SIZE at OFFSET. Like the one in Target, but takes 712 // an unsigned char * parameter. 713 bool 714 match_view_u(const unsigned char* view, section_size_type view_size, 715 section_offset_type offset, const unsigned char* bytes, size_t len) const 716 { 717 return this->match_view(view, view_size, offset, 718 reinterpret_cast<const char*>(bytes), len); 719 } 720 721 // Information about this specific target which we pass to the 722 // general Target structure. 723 static Target::Target_info s390_info; 724 725 // The types of GOT entries needed for this platform. 726 // These values are exposed to the ABI in an incremental link. 727 // Do not renumber existing values without changing the version 728 // number of the .gnu_incremental_inputs section. 729 enum Got_type 730 { 731 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol 732 GOT_TYPE_TLS_OFFSET = 1, // GOT entry for TLS offset 733 GOT_TYPE_TLS_PAIR = 2, // GOT entry for TLS module/offset pair 734 }; 735 736 // The GOT section. 737 Output_data_got<size, true>* got_; 738 // The PLT section. 739 Output_data_plt_s390<size>* plt_; 740 // The GOT PLT section. 741 Output_data_got_plt_s390<size>* got_plt_; 742 // The GOT section for IRELATIVE relocations. 743 Output_data_space* got_irelative_; 744 // The _GLOBAL_OFFSET_TABLE_ symbol. 745 Symbol* global_offset_table_; 746 // The dynamic reloc section. 747 Reloc_section* rela_dyn_; 748 // The section to use for IRELATIVE relocs. 749 Reloc_section* rela_irelative_; 750 // Relocs saved to avoid a COPY reloc. 751 Copy_relocs<elfcpp::SHT_RELA, size, true> copy_relocs_; 752 // Offset of the GOT entry for the TLS module index. 753 unsigned int got_mod_index_offset_; 754 // True if the _TLS_MODULE_BASE_ symbol has been defined. 755 bool tls_base_symbol_defined_; 756 // For use in do_tls_offset_for_* 757 Layout *layout_; 758 759 // Code sequences for -fsplit-stack matching. 760 static const unsigned char ss_code_bras_8[]; 761 static const unsigned char ss_code_l_basr[]; 762 static const unsigned char ss_code_a_basr[]; 763 static const unsigned char ss_code_larl[]; 764 static const unsigned char ss_code_brasl[]; 765 static const unsigned char ss_code_jg[]; 766 static const unsigned char ss_code_jgl[]; 767 768 // Variable code sequence matchers for -fsplit-stack. 769 bool ss_match_st_r14(unsigned char* view, 770 section_size_type view_size, 771 section_offset_type *offset) const; 772 bool ss_match_l_r14(unsigned char* view, 773 section_size_type view_size, 774 section_offset_type *offset) const; 775 bool ss_match_mcount(unsigned char* view, 776 section_size_type view_size, 777 section_offset_type *offset) const; 778 bool ss_match_ear(unsigned char* view, 779 section_size_type view_size, 780 section_offset_type *offset) const; 781 bool ss_match_c(unsigned char* view, 782 section_size_type view_size, 783 section_offset_type *offset) const; 784 bool ss_match_l(unsigned char* view, 785 section_size_type view_size, 786 section_offset_type *offset, 787 int *guard_reg) const; 788 bool ss_match_ahi(unsigned char* view, 789 section_size_type view_size, 790 section_offset_type *offset, 791 int guard_reg, 792 uint32_t *arg) const; 793 bool ss_match_alfi(unsigned char* view, 794 section_size_type view_size, 795 section_offset_type *offset, 796 int guard_reg, 797 uint32_t *arg) const; 798 bool ss_match_cr(unsigned char* view, 799 section_size_type view_size, 800 section_offset_type *offset, 801 int guard_reg) const; 802 }; 803 804 template<> 805 Target::Target_info Target_s390<32>::s390_info = 806 { 807 32, // size 808 true, // is_big_endian 809 elfcpp::EM_S390, // machine_code 810 false, // has_make_symbol 811 false, // has_resolve 812 true, // has_code_fill 813 true, // is_default_stack_executable 814 true, // can_icf_inline_merge_sections 815 '\0', // wrap_char 816 "/lib/ld.so.1", // dynamic_linker 817 0x00400000, // default_text_segment_address 818 4 * 1024, // abi_pagesize (overridable by -z max-page-size) 819 4 * 1024, // common_pagesize (overridable by -z common-page-size) 820 false, // isolate_execinstr 821 0, // rosegment_gap 822 elfcpp::SHN_UNDEF, // small_common_shndx 823 elfcpp::SHN_UNDEF, // large_common_shndx 824 0, // small_common_section_flags 825 0, // large_common_section_flags 826 NULL, // attributes_section 827 NULL, // attributes_vendor 828 "_start", // entry_symbol_name 829 32, // hash_entry_size 830 }; 831 832 template<> 833 Target::Target_info Target_s390<64>::s390_info = 834 { 835 64, // size 836 true, // is_big_endian 837 elfcpp::EM_S390, // machine_code 838 false, // has_make_symbol 839 false, // has_resolve 840 true, // has_code_fill 841 true, // is_default_stack_executable 842 true, // can_icf_inline_merge_sections 843 '\0', // wrap_char 844 "/lib/ld64.so.1", // dynamic_linker 845 0x80000000ll, // default_text_segment_address 846 4 * 1024, // abi_pagesize (overridable by -z max-page-size) 847 4 * 1024, // common_pagesize (overridable by -z common-page-size) 848 false, // isolate_execinstr 849 0, // rosegment_gap 850 elfcpp::SHN_UNDEF, // small_common_shndx 851 elfcpp::SHN_UNDEF, // large_common_shndx 852 0, // small_common_section_flags 853 0, // large_common_section_flags 854 NULL, // attributes_section 855 NULL, // attributes_vendor 856 "_start", // entry_symbol_name 857 64, // hash_entry_size 858 }; 859 860 template<int size> 861 class S390_relocate_functions 862 { 863 public: 864 enum Overflow_check 865 { 866 CHECK_NONE, 867 CHECK_SIGNED, 868 CHECK_UNSIGNED, 869 CHECK_BITFIELD, 870 CHECK_LOW_INSN, 871 CHECK_HIGH_INSN 872 }; 873 874 enum Status 875 { 876 STATUS_OK, 877 STATUS_OVERFLOW 878 }; 879 880 private: 881 typedef S390_relocate_functions<size> This; 882 typedef typename elfcpp::Elf_types<size>::Elf_Addr Address; 883 884 template<int valsize> 885 static inline bool 886 has_overflow_signed(Address value) 887 { 888 // limit = 1 << (valsize - 1) without shift count exceeding size of type 889 Address limit = static_cast<Address>(1) << ((valsize - 1) >> 1); 890 limit <<= ((valsize - 1) >> 1); 891 limit <<= ((valsize - 1) - 2 * ((valsize - 1) >> 1)); 892 return value + limit > (limit << 1) - 1; 893 } 894 895 template<int valsize> 896 static inline bool 897 has_overflow_unsigned(Address value) 898 { 899 Address limit = static_cast<Address>(1) << ((valsize - 1) >> 1); 900 limit <<= ((valsize - 1) >> 1); 901 limit <<= ((valsize - 1) - 2 * ((valsize - 1) >> 1)); 902 return value > (limit << 1) - 1; 903 } 904 905 template<int fieldsize> 906 static inline void 907 rela(unsigned char* view, Address mask, Address value) 908 { 909 typedef typename elfcpp::Swap<fieldsize, true>::Valtype Valtype; 910 Valtype* wv = reinterpret_cast<Valtype*>(view); 911 Valtype val = elfcpp::Swap<fieldsize, true>::readval(view); 912 val &= ~mask; 913 value &= mask; 914 elfcpp::Swap<fieldsize, true>::writeval(wv, val | value); 915 } 916 917 public: 918 // R_390_12, R_390_GOT12, R_390_GOTPLT12, R_390_GOTIE12 919 static inline Status 920 rela12(unsigned char* view, Address value) 921 { 922 if (This::template has_overflow_unsigned<12>(value)) 923 return STATUS_OVERFLOW; 924 This::template rela<16>(view, 0x0fff, value); 925 return STATUS_OK; 926 } 927 928 // R_390_16, R_390_GOT16, R_390_GOTPLT16, R_390_GOTOFF16, R_390_PLTOFF16 929 static inline Status 930 rela16(unsigned char* view, Address value) 931 { 932 if (This::template has_overflow_signed<16>(value)) 933 return STATUS_OVERFLOW; 934 This::template rela<16>(view, 0xffff, value); 935 return STATUS_OK; 936 } 937 938 // R_390_20, R_390_GOT20, R_390_GOTPLT20, R_390_GOTIE20 939 static inline Status 940 rela20(unsigned char* view, Address value) 941 { 942 if (This::template has_overflow_signed<20>(value)) 943 return STATUS_OVERFLOW; 944 This::template rela<16>(view, 0x0fff, value); 945 This::template rela<16>(view + 2, 0xff00, value >> (12 - 8)); 946 return STATUS_OK; 947 } 948 949 // R_390_PC12DBL, R_390_PLT12DBL 950 static inline Status 951 pcrela12dbl(unsigned char* view, Address value, Address address) 952 { 953 value -= address; 954 if ((value & 1) != 0) 955 return STATUS_OVERFLOW; 956 if (This::template has_overflow_signed<13>(value)) 957 return STATUS_OVERFLOW; 958 value >>= 1; 959 This::template rela<16>(view, 0x0fff, value); 960 return STATUS_OK; 961 } 962 963 // R_390_PC16DBL, R_390_PLT16DBL 964 static inline Status 965 pcrela16dbl(unsigned char* view, Address value, Address address) 966 { 967 value -= address; 968 if ((value & 1) != 0) 969 return STATUS_OVERFLOW; 970 if (This::template has_overflow_signed<17>(value)) 971 return STATUS_OVERFLOW; 972 value >>= 1; 973 This::template rela<16>(view, 0xffff, value); 974 return STATUS_OK; 975 } 976 977 // R_390_PC24DBL, R_390_PLT24DBL 978 static inline Status 979 pcrela24dbl(unsigned char* view, Address value, Address address) 980 { 981 value -= address; 982 if ((value & 1) != 0) 983 return STATUS_OVERFLOW; 984 if (This::template has_overflow_signed<25>(value)) 985 return STATUS_OVERFLOW; 986 value >>= 1; 987 // Swap doesn't take 24-bit fields well... 988 This::template rela<8>(view, 0xff, value >> 16); 989 This::template rela<16>(view + 1, 0xffff, value); 990 return STATUS_OK; 991 } 992 993 // R_390_PC32DBL, R_390_PLT32DBL, R_390_GOTPCDBL, R_390_GOTENT, R_390_GOTPLTENT 994 static inline Status 995 pcrela32dbl(unsigned char* view, Address value, Address address) 996 { 997 Address reloc = value - address; 998 if ((reloc & 1) != 0) 999 { 1000 gold_warning(_("R_390_PC32DBL target misaligned at %llx"), (long long)address); 1001 // Wait for a fix for https://sourceware.org/bugzilla/show_bug.cgi?id=18960 1002 // return STATUS_OVERFLOW; 1003 } 1004 if (This::template has_overflow_signed<33>(reloc)) 1005 return STATUS_OVERFLOW; 1006 reloc >>= 1; 1007 if (value < address && size == 32) 1008 reloc |= 0x80000000; 1009 This::template rela<32>(view, 0xffffffff, reloc); 1010 return STATUS_OK; 1011 } 1012 1013 }; 1014 1015 // Initialize the PLT section. 1016 1017 template<int size> 1018 void 1019 Output_data_plt_s390<size>::init(Layout* layout) 1020 { 1021 this->rel_ = new Reloc_section(false); 1022 layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA, 1023 elfcpp::SHF_ALLOC, this->rel_, 1024 ORDER_DYNAMIC_PLT_RELOCS, false); 1025 } 1026 1027 template<int size> 1028 void 1029 Output_data_plt_s390<size>::do_adjust_output_section(Output_section* os) 1030 { 1031 os->set_entsize(plt_entry_size); 1032 } 1033 1034 // Add an entry to the PLT. 1035 1036 template<int size> 1037 void 1038 Output_data_plt_s390<size>::add_entry(Symbol_table* symtab, Layout* layout, 1039 Symbol* gsym) 1040 { 1041 gold_assert(!gsym->has_plt_offset()); 1042 1043 unsigned int plt_index; 1044 off_t plt_offset; 1045 section_offset_type got_offset; 1046 1047 unsigned int* pcount; 1048 unsigned int offset; 1049 unsigned int reserved; 1050 Output_section_data_build* got; 1051 if (gsym->type() == elfcpp::STT_GNU_IFUNC 1052 && gsym->can_use_relative_reloc(false)) 1053 { 1054 pcount = &this->irelative_count_; 1055 offset = 0; 1056 reserved = 0; 1057 got = this->got_irelative_; 1058 } 1059 else 1060 { 1061 pcount = &this->count_; 1062 offset = 1; 1063 reserved = 3; 1064 got = this->got_plt_; 1065 } 1066 1067 if (!this->is_data_size_valid()) 1068 { 1069 // Note that when setting the PLT offset for a non-IRELATIVE 1070 // entry we skip the initial reserved PLT entry. 1071 plt_index = *pcount + offset; 1072 plt_offset = plt_index * plt_entry_size; 1073 1074 ++*pcount; 1075 1076 got_offset = (plt_index - offset + reserved) * size / 8; 1077 gold_assert(got_offset == got->current_data_size()); 1078 1079 // Every PLT entry needs a GOT entry which points back to the PLT 1080 // entry (this will be changed by the dynamic linker, normally 1081 // lazily when the function is called). 1082 got->set_current_data_size(got_offset + size / 8); 1083 } 1084 else 1085 { 1086 // FIXME: This is probably not correct for IRELATIVE relocs. 1087 1088 // For incremental updates, find an available slot. 1089 plt_offset = this->free_list_.allocate(plt_entry_size, 1090 plt_entry_size, 0); 1091 if (plt_offset == -1) 1092 gold_fallback(_("out of patch space (PLT);" 1093 " relink with --incremental-full")); 1094 1095 // The GOT and PLT entries have a 1-1 correspondance, so the GOT offset 1096 // can be calculated from the PLT index, adjusting for the three 1097 // reserved entries at the beginning of the GOT. 1098 plt_index = plt_offset / plt_entry_size - 1; 1099 got_offset = (plt_index - offset + reserved) * size / 8; 1100 } 1101 1102 gsym->set_plt_offset(plt_offset); 1103 1104 // Every PLT entry needs a reloc. 1105 this->add_relocation(symtab, layout, gsym, got_offset); 1106 1107 // Note that we don't need to save the symbol. The contents of the 1108 // PLT are independent of which symbols are used. The symbols only 1109 // appear in the relocations. 1110 } 1111 1112 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol. Return 1113 // the PLT offset. 1114 1115 template<int size> 1116 unsigned int 1117 Output_data_plt_s390<size>::add_local_ifunc_entry( 1118 Symbol_table* symtab, 1119 Layout* layout, 1120 Sized_relobj_file<size, true>* relobj, 1121 unsigned int local_sym_index) 1122 { 1123 unsigned int plt_offset = this->irelative_count_ * plt_entry_size; 1124 ++this->irelative_count_; 1125 1126 section_offset_type got_offset = this->got_irelative_->current_data_size(); 1127 1128 // Every PLT entry needs a GOT entry which points back to the PLT 1129 // entry. 1130 this->got_irelative_->set_current_data_size(got_offset + size / 8); 1131 1132 // Every PLT entry needs a reloc. 1133 Reloc_section* rela = this->rela_irelative(symtab, layout); 1134 rela->add_symbolless_local_addend(relobj, local_sym_index, 1135 elfcpp::R_390_IRELATIVE, 1136 this->got_irelative_, got_offset, 0); 1137 1138 return plt_offset; 1139 } 1140 1141 // Add the relocation for a PLT entry. 1142 1143 template<int size> 1144 void 1145 Output_data_plt_s390<size>::add_relocation(Symbol_table* symtab, 1146 Layout* layout, 1147 Symbol* gsym, 1148 unsigned int got_offset) 1149 { 1150 if (gsym->type() == elfcpp::STT_GNU_IFUNC 1151 && gsym->can_use_relative_reloc(false)) 1152 { 1153 Reloc_section* rela = this->rela_irelative(symtab, layout); 1154 rela->add_symbolless_global_addend(gsym, elfcpp::R_390_IRELATIVE, 1155 this->got_irelative_, got_offset, 0); 1156 } 1157 else 1158 { 1159 gsym->set_needs_dynsym_entry(); 1160 this->rel_->add_global(gsym, elfcpp::R_390_JMP_SLOT, this->got_plt_, 1161 got_offset, 0); 1162 } 1163 } 1164 1165 // Return where the IRELATIVE relocations should go in the PLT. These 1166 // follow the JUMP_SLOT and the TLSDESC relocations. 1167 1168 template<int size> 1169 typename Output_data_plt_s390<size>::Reloc_section* 1170 Output_data_plt_s390<size>::rela_irelative(Symbol_table* symtab, 1171 Layout* layout) 1172 { 1173 if (this->irelative_rel_ == NULL) 1174 { 1175 this->irelative_rel_ = new Reloc_section(false); 1176 layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA, 1177 elfcpp::SHF_ALLOC, this->irelative_rel_, 1178 ORDER_DYNAMIC_PLT_RELOCS, false); 1179 gold_assert(this->irelative_rel_->output_section() 1180 == this->rel_->output_section()); 1181 1182 if (parameters->doing_static_link()) 1183 { 1184 // A statically linked executable will only have a .rela.plt 1185 // section to hold R_390_IRELATIVE relocs for 1186 // STT_GNU_IFUNC symbols. The library will use these 1187 // symbols to locate the IRELATIVE relocs at program startup 1188 // time. 1189 symtab->define_in_output_data("__rela_iplt_start", NULL, 1190 Symbol_table::PREDEFINED, 1191 this->irelative_rel_, 0, 0, 1192 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, 1193 elfcpp::STV_HIDDEN, 0, false, true); 1194 symtab->define_in_output_data("__rela_iplt_end", NULL, 1195 Symbol_table::PREDEFINED, 1196 this->irelative_rel_, 0, 0, 1197 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, 1198 elfcpp::STV_HIDDEN, 0, true, true); 1199 } 1200 } 1201 return this->irelative_rel_; 1202 } 1203 1204 // Return the PLT address to use for a global symbol. 1205 1206 template<int size> 1207 uint64_t 1208 Output_data_plt_s390<size>::address_for_global(const Symbol* gsym) 1209 { 1210 uint64_t offset = 0; 1211 if (gsym->type() == elfcpp::STT_GNU_IFUNC 1212 && gsym->can_use_relative_reloc(false)) 1213 offset = (this->count_ + 1) * plt_entry_size; 1214 return this->address() + offset + gsym->plt_offset(); 1215 } 1216 1217 // Return the PLT address to use for a local symbol. These are always 1218 // IRELATIVE relocs. 1219 1220 template<int size> 1221 uint64_t 1222 Output_data_plt_s390<size>::address_for_local(const Relobj* object, 1223 unsigned int r_sym) 1224 { 1225 return (this->address() 1226 + (this->count_ + 1) * plt_entry_size 1227 + object->local_plt_offset(r_sym)); 1228 } 1229 1230 // Set the final size. 1231 template<int size> 1232 void 1233 Output_data_plt_s390<size>::set_final_data_size() 1234 { 1235 unsigned int count = this->count_ + this->irelative_count_; 1236 this->set_data_size((count + 1) * plt_entry_size); 1237 } 1238 1239 template<int size> 1240 const unsigned char 1241 Output_data_plt_s390<size>::first_plt_entry_32_abs[plt_entry_size] = 1242 { 1243 0x50, 0x10, 0xf0, 0x1c, // st %r1, 28(%r15) 1244 0x0d, 0x10, // basr %r1, %r0 1245 0x58, 0x10, 0x10, 0x12, // l %r1, 18(%r1) 1246 0xd2, 0x03, 0xf0, 0x18, 0x10, 0x04, // mvc 24(4,%r15), 4(%r1) 1247 0x58, 0x10, 0x10, 0x08, // l %r1, 8(%r1) 1248 0x07, 0xf1, // br %r1 1249 0x00, 0x00, // padding 1250 0x00, 0x00, 0x00, 0x00, // _GLOBAL_OFFSET_TABLE_ (to fill) 1251 0x00, 0x00, 0x00, 0x00, // padding 1252 }; 1253 1254 template<int size> 1255 const unsigned char 1256 Output_data_plt_s390<size>::first_plt_entry_32_pic[plt_entry_size] = 1257 { 1258 0x50, 0x10, 0xf0, 0x1c, // st %r1, 28(%r15) 1259 0x58, 0x10, 0xc0, 0x04, // l %r1, 4(%r12) 1260 0x50, 0x10, 0xf0, 0x18, // st %r1, 24(%r15) 1261 0x58, 0x10, 0xc0, 0x08, // l %r1, 8(%r12) 1262 0x07, 0xf1, // br %r1 1263 0x00, 0x00, // padding 1264 0x00, 0x00, 0x00, 0x00, // padding 1265 0x00, 0x00, 0x00, 0x00, // padding 1266 0x00, 0x00, 0x00, 0x00, // padding 1267 }; 1268 1269 template<int size> 1270 const unsigned char 1271 Output_data_plt_s390<size>::first_plt_entry_64[plt_entry_size] = 1272 { 1273 0xe3, 0x10, 0xf0, 0x38, 0x00, 0x24, // stg %r1, 56(%r15) 1274 0xc0, 0x10, 0x00, 0x00, 0x00, 0x00, // larl %r1, _GLOBAL_OFFSET_TABLE_ (to fill) 1275 0xd2, 0x07, 0xf0, 0x30, 0x10, 0x08, // mvc 48(8,%r15), 8(%r1) 1276 0xe3, 0x10, 0x10, 0x10, 0x00, 0x04, // lg %r1, 16(%r1) 1277 0x07, 0xf1, // br %r1 1278 0x07, 0x00, // nopr 1279 0x07, 0x00, // nopr 1280 0x07, 0x00, // nopr 1281 }; 1282 1283 template<int size> 1284 void 1285 Output_data_plt_s390<size>::fill_first_plt_entry( 1286 unsigned char* pov, 1287 typename elfcpp::Elf_types<size>::Elf_Addr got_address, 1288 typename elfcpp::Elf_types<size>::Elf_Addr plt_address) 1289 { 1290 if (size == 64) 1291 { 1292 memcpy(pov, first_plt_entry_64, plt_entry_size); 1293 S390_relocate_functions<size>::pcrela32dbl(pov + 8, got_address, (plt_address + 6)); 1294 } 1295 else if (!parameters->options().output_is_position_independent()) 1296 { 1297 memcpy(pov, first_plt_entry_32_abs, plt_entry_size); 1298 elfcpp::Swap<32, true>::writeval(pov + 24, got_address); 1299 } 1300 else 1301 { 1302 memcpy(pov, first_plt_entry_32_pic, plt_entry_size); 1303 } 1304 } 1305 1306 template<int size> 1307 const unsigned char 1308 Output_data_plt_s390<size>::plt_entry_32_abs[plt_entry_size] = 1309 { 1310 // first part 1311 0x0d, 0x10, // basr %r1, %r0 1312 0x58, 0x10, 0x10, 0x16, // l %r1, 22(%r1) 1313 0x58, 0x10, 0x10, 0x00, // l %r1, 0(%r1) 1314 0x07, 0xf1, // br %r1 1315 // second part 1316 0x0d, 0x10, // basr %r1, %r0 1317 0x58, 0x10, 0x10, 0x0e, // l %r1, 14(%r1) 1318 0xa7, 0xf4, 0x00, 0x00, // j first_plt_entry (to fill) 1319 0x00, 0x00, // padding 1320 0x00, 0x00, 0x00, 0x00, // _GLOBAL_OFFSET_TABLE_+sym@gotplt (to fill) 1321 0x00, 0x00, 0x00, 0x00, // offset of relocation in .rela.plt (to fill) 1322 }; 1323 1324 template<int size> 1325 const unsigned char 1326 Output_data_plt_s390<size>::plt_entry_32_pic12[plt_entry_size] = 1327 { 1328 // first part 1329 0x58, 0x10, 0xc0, 0x00, // l %r1, sym@gotplt(%r12) (to fill) 1330 0x07, 0xf1, // br %r1 1331 0x00, 0x00, // padding 1332 0x00, 0x00, 0x00, 0x00, // padding 1333 // second part 1334 0x0d, 0x10, // basr %r1, %r0 1335 0x58, 0x10, 0x10, 0x0e, // l %r1, 14(%r1) 1336 0xa7, 0xf4, 0x00, 0x00, // j first_plt_entry (to fill) 1337 0x00, 0x00, // padding 1338 0x00, 0x00, 0x00, 0x00, // padding 1339 0x00, 0x00, 0x00, 0x00, // offset of relocation in .rela.plt (to fill) 1340 }; 1341 1342 template<int size> 1343 const unsigned char 1344 Output_data_plt_s390<size>::plt_entry_32_pic16[plt_entry_size] = 1345 { 1346 // first part 1347 0xa7, 0x18, 0x00, 0x00, // lhi %r1, sym@gotplt (to fill) 1348 0x58, 0x11, 0xc0, 0x00, // l %r1, 0(%r1, %r12) 1349 0x07, 0xf1, // br %r1 1350 0x00, 0x00, // padding 1351 // second part 1352 0x0d, 0x10, // basr %r1, %r0 1353 0x58, 0x10, 0x10, 0x0e, // l %r1, 14(%r1) 1354 0xa7, 0xf4, 0x00, 0x00, // j first_plt_entry (to fill) 1355 0x00, 0x00, // padding 1356 0x00, 0x00, 0x00, 0x00, // padding 1357 0x00, 0x00, 0x00, 0x00, // offset of relocation in .rela.plt (to fill) 1358 }; 1359 1360 template<int size> 1361 const unsigned char 1362 Output_data_plt_s390<size>::plt_entry_32_pic[plt_entry_size] = 1363 { 1364 // first part 1365 0x0d, 0x10, // basr %r1, %r0 1366 0x58, 0x10, 0x10, 0x16, // l %r1, 22(%r1) 1367 0x58, 0x11, 0xc0, 0x00, // l %r1, 0(%r1, %r12) 1368 0x07, 0xf1, // br %r1 1369 // second part 1370 0x0d, 0x10, // basr %r1, %r0 1371 0x58, 0x10, 0x10, 0x0e, // l %r1, 14(%r1) 1372 0xa7, 0xf4, 0x00, 0x00, // j first_plt_entry (to fill) 1373 0x00, 0x00, // padding 1374 0x00, 0x00, 0x00, 0x00, // sym@gotplt (to fill) 1375 0x00, 0x00, 0x00, 0x00, // offset of relocation in .rela.plt (to fill) 1376 }; 1377 1378 template<int size> 1379 const unsigned char 1380 Output_data_plt_s390<size>::plt_entry_64[plt_entry_size] = 1381 { 1382 // first part 1383 0xc0, 0x10, 0x00, 0x00, 0x00, 0x00, // larl %r1, _GLOBAL_OFFSET_TABLE_+off (to fill) 1384 0xe3, 0x10, 0x10, 0x00, 0x00, 0x04, // lg %r1, 0(%r1) 1385 0x07, 0xf1, // br %r1 1386 // second part 1387 0x0d, 0x10, // basr %r1, %r0 1388 0xe3, 0x10, 0x10, 0x0c, 0x00, 0x14, // lgf %r1, 12(%r1) 1389 0xc0, 0xf4, 0x00, 0x00, 0x00, 0x00, // jg first_plt_entry (to fill) 1390 0x00, 0x00, 0x00, 0x00, // offset of relocation in .rela.plt (to fill) 1391 }; 1392 1393 template<int size> 1394 unsigned int 1395 Output_data_plt_s390<size>::fill_plt_entry( 1396 unsigned char* pov, 1397 typename elfcpp::Elf_types<size>::Elf_Addr got_address, 1398 typename elfcpp::Elf_types<size>::Elf_Addr plt_address, 1399 unsigned int got_offset, 1400 unsigned int plt_offset, 1401 unsigned int plt_rel_offset) 1402 { 1403 if (size == 64) 1404 { 1405 memcpy(pov, plt_entry_64, plt_entry_size); 1406 S390_relocate_functions<size>::pcrela32dbl(pov + 2, got_address + got_offset, plt_address + plt_offset); 1407 S390_relocate_functions<size>::pcrela32dbl(pov + 24, plt_address, plt_address + plt_offset + 22); 1408 } 1409 else 1410 { 1411 if (!parameters->options().output_is_position_independent()) 1412 { 1413 memcpy(pov, plt_entry_32_abs, plt_entry_size); 1414 elfcpp::Swap<32, true>::writeval(pov + 24, got_address + got_offset); 1415 } 1416 else 1417 { 1418 if (got_offset < 0x1000) 1419 { 1420 memcpy(pov, plt_entry_32_pic12, plt_entry_size); 1421 S390_relocate_functions<size>::rela12(pov + 2, got_offset); 1422 } 1423 else if (got_offset < 0x8000) 1424 { 1425 memcpy(pov, plt_entry_32_pic16, plt_entry_size); 1426 S390_relocate_functions<size>::rela16(pov + 2, got_offset); 1427 } 1428 else 1429 { 1430 memcpy(pov, plt_entry_32_pic, plt_entry_size); 1431 elfcpp::Swap<32, true>::writeval(pov + 24, got_offset); 1432 } 1433 } 1434 typename elfcpp::Elf_types<size>::Elf_Addr target = plt_address; 1435 if (plt_offset >= 0x10000) 1436 { 1437 // Would overflow pcrela16dbl - aim at the farthest previous jump 1438 // we can reach. 1439 if (plt_offset > 0x10000) 1440 { 1441 // Use the full range of pcrel16dbl. 1442 target = plt_address + plt_offset - 0x10000 + 18; 1443 } 1444 else 1445 { 1446 // if plt_offset is exactly 0x10000, the above would aim at 18th byte 1447 // of first_plt_entry, which doesn't have the jump back like the others. 1448 // Aim at the next entry instead. 1449 target = plt_address + plt_offset - 0xffe0 + 18; 1450 } 1451 } 1452 S390_relocate_functions<size>::pcrela16dbl(pov + 20, target, plt_address + plt_offset + 18); 1453 } 1454 elfcpp::Swap<32, true>::writeval(pov + 28, plt_rel_offset); 1455 if (size == 64) 1456 return 14; 1457 else 1458 return 12; 1459 } 1460 1461 // The .eh_frame unwind information for the PLT. 1462 1463 template<> 1464 const unsigned char 1465 Output_data_plt_s390<32>::plt_eh_frame_cie[plt_eh_frame_cie_size] = 1466 { 1467 1, // CIE version. 1468 'z', // Augmentation: augmentation size included. 1469 'R', // Augmentation: FDE encoding included. 1470 '\0', // End of augmentation string. 1471 1, // Code alignment factor. 1472 0x7c, // Data alignment factor. 1473 14, // Return address column. 1474 1, // Augmentation size. 1475 (elfcpp::DW_EH_PE_pcrel // FDE encoding. 1476 | elfcpp::DW_EH_PE_sdata4), 1477 elfcpp::DW_CFA_def_cfa, 15, 0x60, // DW_CFA_def_cfa: r15 ofs 0x60. 1478 }; 1479 1480 template<> 1481 const unsigned char 1482 Output_data_plt_s390<64>::plt_eh_frame_cie[plt_eh_frame_cie_size] = 1483 { 1484 1, // CIE version. 1485 'z', // Augmentation: augmentation size included. 1486 'R', // Augmentation: FDE encoding included. 1487 '\0', // End of augmentation string. 1488 1, // Code alignment factor. 1489 0x78, // Data alignment factor. 1490 14, // Return address column. 1491 1, // Augmentation size. 1492 (elfcpp::DW_EH_PE_pcrel // FDE encoding. 1493 | elfcpp::DW_EH_PE_sdata4), 1494 elfcpp::DW_CFA_def_cfa, 15, 0xa0, // DW_CFA_def_cfa: r15 ofs 0xa0. 1495 }; 1496 1497 template<int size> 1498 const unsigned char 1499 Output_data_plt_s390<size>::plt_eh_frame_fde[plt_eh_frame_fde_size] = 1500 { 1501 0, 0, 0, 0, // Replaced with offset to .plt. 1502 0, 0, 0, 0, // Replaced with size of .plt. 1503 0, // Augmentation size. 1504 elfcpp::DW_CFA_nop, 1505 elfcpp::DW_CFA_nop, 1506 elfcpp::DW_CFA_nop 1507 }; 1508 1509 // Write out the PLT. This uses the hand-coded instructions above, 1510 // and adjusts them as needed. 1511 1512 template<int size> 1513 void 1514 Output_data_plt_s390<size>::do_write(Output_file* of) 1515 { 1516 const off_t offset = this->offset(); 1517 const section_size_type oview_size = 1518 convert_to_section_size_type(this->data_size()); 1519 unsigned char* const oview = of->get_output_view(offset, oview_size); 1520 1521 const off_t got_file_offset = this->got_plt_->offset(); 1522 gold_assert(parameters->incremental_update() 1523 || (got_file_offset + this->got_plt_->data_size() 1524 == this->got_irelative_->offset())); 1525 const section_size_type got_size = 1526 convert_to_section_size_type(this->got_plt_->data_size() 1527 + this->got_irelative_->data_size()); 1528 unsigned char* const got_view = of->get_output_view(got_file_offset, 1529 got_size); 1530 1531 unsigned char* pov = oview; 1532 1533 // The base address of the .plt section. 1534 typename elfcpp::Elf_types<size>::Elf_Addr plt_address = this->address(); 1535 // The base address of the PLT portion of the .got section, 1536 // which is where the GOT pointer will point, and where the 1537 // three reserved GOT entries are located. 1538 typename elfcpp::Elf_types<size>::Elf_Addr got_address 1539 = this->got_plt_->address(); 1540 1541 this->fill_first_plt_entry(pov, got_address, plt_address); 1542 pov += this->get_plt_entry_size(); 1543 1544 unsigned char* got_pov = got_view; 1545 1546 const int rel_size = elfcpp::Elf_sizes<size>::rela_size; 1547 1548 unsigned int plt_offset = this->get_plt_entry_size(); 1549 unsigned int plt_rel_offset = 0; 1550 unsigned int got_offset = 3 * size / 8; 1551 const unsigned int count = this->count_ + this->irelative_count_; 1552 // The first three entries in the GOT are reserved, and are written 1553 // by Output_data_got_plt_s390::do_write. 1554 got_pov += 3 * size / 8; 1555 1556 for (unsigned int plt_index = 0; 1557 plt_index < count; 1558 ++plt_index, 1559 pov += plt_entry_size, 1560 got_pov += size / 8, 1561 plt_offset += plt_entry_size, 1562 plt_rel_offset += rel_size, 1563 got_offset += size / 8) 1564 { 1565 // Set and adjust the PLT entry itself. 1566 unsigned int lazy_offset = this->fill_plt_entry(pov, 1567 got_address, plt_address, 1568 got_offset, plt_offset, 1569 plt_rel_offset); 1570 1571 // Set the entry in the GOT. 1572 elfcpp::Swap<size, true>::writeval(got_pov, 1573 plt_address + plt_offset + lazy_offset); 1574 } 1575 1576 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size); 1577 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size); 1578 1579 of->write_output_view(offset, oview_size, oview); 1580 of->write_output_view(got_file_offset, got_size, got_view); 1581 } 1582 1583 // Get the GOT section, creating it if necessary. 1584 1585 template<int size> 1586 Output_data_got<size, true>* 1587 Target_s390<size>::got_section(Symbol_table* symtab, Layout* layout) 1588 { 1589 if (this->got_ == NULL) 1590 { 1591 gold_assert(symtab != NULL && layout != NULL); 1592 1593 // When using -z now, we can treat .got as a relro section. 1594 // Without -z now, it is modified after program startup by lazy 1595 // PLT relocations. 1596 bool is_got_relro = parameters->options().now(); 1597 Output_section_order got_order = (is_got_relro 1598 ? ORDER_RELRO_LAST 1599 : ORDER_DATA); 1600 1601 // The old GNU linker creates a .got.plt section. We just 1602 // create another set of data in the .got section. Note that we 1603 // always create a PLT if we create a GOT, although the PLT 1604 // might be empty. 1605 this->got_plt_ = new Output_data_got_plt_s390<size>(layout); 1606 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 1607 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE), 1608 this->got_plt_, got_order, is_got_relro); 1609 1610 // The first three entries are reserved. 1611 this->got_plt_->set_current_data_size(3 * size / 8); 1612 1613 // If there are any IRELATIVE relocations, they get GOT entries 1614 // in .got.plt after the jump slot entries. 1615 this->got_irelative_ = new Output_data_space(size / 8, "** GOT IRELATIVE PLT"); 1616 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 1617 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE), 1618 this->got_irelative_, 1619 got_order, is_got_relro); 1620 1621 // Unlike some targets (.e.g x86), S/390 does not use separate .got and 1622 // .got.plt sections in output. The output .got section contains both 1623 // PLT and non-PLT GOT entries. 1624 this->got_ = new Output_data_got<size, true>(); 1625 1626 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 1627 (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE), 1628 this->got_, got_order, is_got_relro); 1629 1630 // Define _GLOBAL_OFFSET_TABLE_ at the start of the GOT. 1631 this->global_offset_table_ = 1632 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL, 1633 Symbol_table::PREDEFINED, 1634 this->got_plt_, 1635 0, 0, elfcpp::STT_OBJECT, 1636 elfcpp::STB_LOCAL, 1637 elfcpp::STV_HIDDEN, 0, 1638 false, false); 1639 1640 } 1641 return this->got_; 1642 } 1643 1644 // Get the dynamic reloc section, creating it if necessary. 1645 1646 template<int size> 1647 typename Target_s390<size>::Reloc_section* 1648 Target_s390<size>::rela_dyn_section(Layout* layout) 1649 { 1650 if (this->rela_dyn_ == NULL) 1651 { 1652 gold_assert(layout != NULL); 1653 this->rela_dyn_ = new Reloc_section(parameters->options().combreloc()); 1654 layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA, 1655 elfcpp::SHF_ALLOC, this->rela_dyn_, 1656 ORDER_DYNAMIC_RELOCS, false); 1657 } 1658 return this->rela_dyn_; 1659 } 1660 1661 // Get the section to use for IRELATIVE relocs, creating it if 1662 // necessary. These go in .rela.dyn, but only after all other dynamic 1663 // relocations. They need to follow the other dynamic relocations so 1664 // that they can refer to global variables initialized by those 1665 // relocs. 1666 1667 template<int size> 1668 typename Target_s390<size>::Reloc_section* 1669 Target_s390<size>::rela_irelative_section(Layout* layout) 1670 { 1671 if (this->rela_irelative_ == NULL) 1672 { 1673 // Make sure we have already created the dynamic reloc section. 1674 this->rela_dyn_section(layout); 1675 this->rela_irelative_ = new Reloc_section(false); 1676 layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA, 1677 elfcpp::SHF_ALLOC, this->rela_irelative_, 1678 ORDER_DYNAMIC_RELOCS, false); 1679 gold_assert(this->rela_dyn_->output_section() 1680 == this->rela_irelative_->output_section()); 1681 } 1682 return this->rela_irelative_; 1683 } 1684 1685 // Write the first three reserved words of the .got.plt section. 1686 // The remainder of the section is written while writing the PLT 1687 // in Output_data_plt_s390::do_write. 1688 1689 template<int size> 1690 void 1691 Output_data_got_plt_s390<size>::do_write(Output_file* of) 1692 { 1693 // The first entry in the GOT is the address of the .dynamic section 1694 // aka the PT_DYNAMIC segment. The next two entries are reserved. 1695 // We saved space for them when we created the section in 1696 // Target_x86_64::got_section. 1697 const off_t got_file_offset = this->offset(); 1698 gold_assert(this->data_size() >= 3 * size / 8); 1699 unsigned char* const got_view = 1700 of->get_output_view(got_file_offset, 3 * size / 8); 1701 Output_section* dynamic = this->layout_->dynamic_section(); 1702 uint64_t dynamic_addr = dynamic == NULL ? 0 : dynamic->address(); 1703 elfcpp::Swap<size, true>::writeval(got_view, dynamic_addr); 1704 memset(got_view + size / 8, 0, 2 * size / 8); 1705 of->write_output_view(got_file_offset, 3 * size / 8, got_view); 1706 } 1707 1708 // Create the PLT section. 1709 1710 template<int size> 1711 void 1712 Target_s390<size>::make_plt_section(Symbol_table* symtab, Layout* layout) 1713 { 1714 if (this->plt_ == NULL) 1715 { 1716 // Create the GOT sections first. 1717 this->got_section(symtab, layout); 1718 1719 // Ensure that .rela.dyn always appears before .rela.plt This is 1720 // necessary due to how, on 32-bit S/390 and some other targets, 1721 // .rela.dyn needs to include .rela.plt in it's range. 1722 this->rela_dyn_section(layout); 1723 1724 this->plt_ = new Output_data_plt_s390<size>(layout, 1725 this->got_, this->got_plt_, this->got_irelative_); 1726 1727 // Add unwind information if requested. 1728 if (parameters->options().ld_generated_unwind_info()) 1729 this->plt_->add_eh_frame(layout); 1730 1731 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS, 1732 (elfcpp::SHF_ALLOC 1733 | elfcpp::SHF_EXECINSTR), 1734 this->plt_, ORDER_PLT, false); 1735 1736 // Make the sh_info field of .rela.plt point to .plt. 1737 Output_section* rela_plt_os = this->plt_->rela_plt()->output_section(); 1738 rela_plt_os->set_info_section(this->plt_->output_section()); 1739 } 1740 } 1741 1742 // Create a PLT entry for a global symbol. 1743 1744 template<int size> 1745 void 1746 Target_s390<size>::make_plt_entry(Symbol_table* symtab, Layout* layout, 1747 Symbol* gsym) 1748 { 1749 if (gsym->has_plt_offset()) 1750 return; 1751 1752 if (this->plt_ == NULL) 1753 this->make_plt_section(symtab, layout); 1754 1755 this->plt_->add_entry(symtab, layout, gsym); 1756 } 1757 1758 // Make a PLT entry for a local STT_GNU_IFUNC symbol. 1759 1760 template<int size> 1761 void 1762 Target_s390<size>::make_local_ifunc_plt_entry( 1763 Symbol_table* symtab, Layout* layout, 1764 Sized_relobj_file<size, true>* relobj, 1765 unsigned int local_sym_index) 1766 { 1767 if (relobj->local_has_plt_offset(local_sym_index)) 1768 return; 1769 if (this->plt_ == NULL) 1770 this->make_plt_section(symtab, layout); 1771 unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout, 1772 relobj, 1773 local_sym_index); 1774 relobj->set_local_plt_offset(local_sym_index, plt_offset); 1775 } 1776 1777 // Return the number of entries in the PLT. 1778 1779 template<int size> 1780 unsigned int 1781 Target_s390<size>::plt_entry_count() const 1782 { 1783 if (this->plt_ == NULL) 1784 return 0; 1785 return this->plt_->entry_count(); 1786 } 1787 1788 // Return the offset of the first non-reserved PLT entry. 1789 1790 template<int size> 1791 unsigned int 1792 Target_s390<size>::first_plt_entry_offset() const 1793 { 1794 return this->plt_->first_plt_entry_offset(); 1795 } 1796 1797 // Return the size of each PLT entry. 1798 1799 template<int size> 1800 unsigned int 1801 Target_s390<size>::plt_entry_size() const 1802 { 1803 return this->plt_->get_plt_entry_size(); 1804 } 1805 1806 // Create the GOT and PLT sections for an incremental update. 1807 1808 template<int size> 1809 Output_data_got_base* 1810 Target_s390<size>::init_got_plt_for_update(Symbol_table* symtab, 1811 Layout* layout, 1812 unsigned int got_count, 1813 unsigned int plt_count) 1814 { 1815 gold_assert(this->got_ == NULL); 1816 1817 // Add the three reserved entries. 1818 this->got_plt_ = new Output_data_got_plt_s390<size>(layout, (plt_count + 3) * size / 8); 1819 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 1820 (elfcpp::SHF_ALLOC 1821 | elfcpp::SHF_WRITE), 1822 this->got_plt_, ORDER_NON_RELRO_FIRST, 1823 false); 1824 1825 // If there are any IRELATIVE relocations, they get GOT entries in 1826 // .got.plt after the jump slot entries. 1827 this->got_irelative_ = new Output_data_space(0, size / 8, "** GOT IRELATIVE PLT"); 1828 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 1829 elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE, 1830 this->got_irelative_, 1831 ORDER_NON_RELRO_FIRST, false); 1832 1833 this->got_ = new Output_data_got<size, true>(got_count * size / 8); 1834 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 1835 (elfcpp::SHF_ALLOC 1836 | elfcpp::SHF_WRITE), 1837 this->got_, ORDER_RELRO_LAST, 1838 true); 1839 1840 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT. 1841 this->global_offset_table_ = 1842 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL, 1843 Symbol_table::PREDEFINED, 1844 this->got_plt_, 1845 0, 0, elfcpp::STT_OBJECT, 1846 elfcpp::STB_LOCAL, 1847 elfcpp::STV_HIDDEN, 0, 1848 false, false); 1849 1850 // Create the PLT section. 1851 this->plt_ = new Output_data_plt_s390<size>(layout, 1852 this->got_, this->got_plt_, this->got_irelative_, plt_count); 1853 1854 // Add unwind information if requested. 1855 if (parameters->options().ld_generated_unwind_info()) 1856 this->plt_->add_eh_frame(layout); 1857 1858 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS, 1859 elfcpp::SHF_ALLOC | elfcpp::SHF_EXECINSTR, 1860 this->plt_, ORDER_PLT, false); 1861 1862 // Make the sh_info field of .rela.plt point to .plt. 1863 Output_section* rela_plt_os = this->plt_->rela_plt()->output_section(); 1864 rela_plt_os->set_info_section(this->plt_->output_section()); 1865 1866 // Create the rela_dyn section. 1867 this->rela_dyn_section(layout); 1868 1869 return this->got_; 1870 } 1871 1872 // Reserve a GOT entry for a local symbol, and regenerate any 1873 // necessary dynamic relocations. 1874 1875 template<int size> 1876 void 1877 Target_s390<size>::reserve_local_got_entry( 1878 unsigned int got_index, 1879 Sized_relobj<size, true>* obj, 1880 unsigned int r_sym, 1881 unsigned int got_type) 1882 { 1883 unsigned int got_offset = got_index * size / 8; 1884 Reloc_section* rela_dyn = this->rela_dyn_section(NULL); 1885 1886 this->got_->reserve_local(got_index, obj, r_sym, got_type); 1887 switch (got_type) 1888 { 1889 case GOT_TYPE_STANDARD: 1890 if (parameters->options().output_is_position_independent()) 1891 rela_dyn->add_local_relative(obj, r_sym, elfcpp::R_390_RELATIVE, 1892 this->got_, got_offset, 0, false); 1893 break; 1894 case GOT_TYPE_TLS_OFFSET: 1895 rela_dyn->add_local(obj, r_sym, elfcpp::R_390_TLS_TPOFF, 1896 this->got_, got_offset, 0); 1897 break; 1898 case GOT_TYPE_TLS_PAIR: 1899 this->got_->reserve_slot(got_index + 1); 1900 rela_dyn->add_local(obj, r_sym, elfcpp::R_390_TLS_DTPMOD, 1901 this->got_, got_offset, 0); 1902 break; 1903 default: 1904 gold_unreachable(); 1905 } 1906 } 1907 1908 // Reserve a GOT entry for a global symbol, and regenerate any 1909 // necessary dynamic relocations. 1910 1911 template<int size> 1912 void 1913 Target_s390<size>::reserve_global_got_entry(unsigned int got_index, 1914 Symbol* gsym, 1915 unsigned int got_type) 1916 { 1917 unsigned int got_offset = got_index * size / 8; 1918 Reloc_section* rela_dyn = this->rela_dyn_section(NULL); 1919 1920 this->got_->reserve_global(got_index, gsym, got_type); 1921 switch (got_type) 1922 { 1923 case GOT_TYPE_STANDARD: 1924 if (!gsym->final_value_is_known()) 1925 { 1926 if (gsym->is_from_dynobj() 1927 || gsym->is_undefined() 1928 || gsym->is_preemptible() 1929 || gsym->type() == elfcpp::STT_GNU_IFUNC) 1930 rela_dyn->add_global(gsym, elfcpp::R_390_GLOB_DAT, 1931 this->got_, got_offset, 0); 1932 else 1933 rela_dyn->add_global_relative(gsym, elfcpp::R_390_RELATIVE, 1934 this->got_, got_offset, 0, false); 1935 } 1936 break; 1937 case GOT_TYPE_TLS_OFFSET: 1938 rela_dyn->add_global_relative(gsym, elfcpp::R_390_TLS_TPOFF, 1939 this->got_, got_offset, 0, false); 1940 break; 1941 case GOT_TYPE_TLS_PAIR: 1942 this->got_->reserve_slot(got_index + 1); 1943 rela_dyn->add_global_relative(gsym, elfcpp::R_390_TLS_DTPMOD, 1944 this->got_, got_offset, 0, false); 1945 rela_dyn->add_global_relative(gsym, elfcpp::R_390_TLS_DTPOFF, 1946 this->got_, got_offset + size / 8, 0, false); 1947 break; 1948 default: 1949 gold_unreachable(); 1950 } 1951 } 1952 1953 // Register an existing PLT entry for a global symbol. 1954 1955 template<int size> 1956 void 1957 Target_s390<size>::register_global_plt_entry(Symbol_table* symtab, 1958 Layout* layout, 1959 unsigned int plt_index, 1960 Symbol* gsym) 1961 { 1962 gold_assert(this->plt_ != NULL); 1963 gold_assert(!gsym->has_plt_offset()); 1964 1965 this->plt_->reserve_slot(plt_index); 1966 1967 gsym->set_plt_offset((plt_index + 1) * this->plt_entry_size()); 1968 1969 unsigned int got_offset = (plt_index + 3) * size / 8; 1970 this->plt_->add_relocation(symtab, layout, gsym, got_offset); 1971 } 1972 1973 // Force a COPY relocation for a given symbol. 1974 1975 template<int size> 1976 void 1977 Target_s390<size>::emit_copy_reloc( 1978 Symbol_table* symtab, Symbol* sym, Output_section* os, off_t offset) 1979 { 1980 this->copy_relocs_.emit_copy_reloc(symtab, 1981 symtab->get_sized_symbol<size>(sym), 1982 os, 1983 offset, 1984 this->rela_dyn_section(NULL)); 1985 } 1986 1987 // Create a GOT entry for the TLS module index. 1988 1989 template<int size> 1990 unsigned int 1991 Target_s390<size>::got_mod_index_entry(Symbol_table* symtab, Layout* layout, 1992 Sized_relobj_file<size, true>* object) 1993 { 1994 if (this->got_mod_index_offset_ == -1U) 1995 { 1996 gold_assert(symtab != NULL && layout != NULL && object != NULL); 1997 Reloc_section* rela_dyn = this->rela_dyn_section(layout); 1998 Output_data_got<size, true>* got = this->got_section(symtab, layout); 1999 unsigned int got_offset = got->add_constant(0); 2000 rela_dyn->add_local(object, 0, elfcpp::R_390_TLS_DTPMOD, got, 2001 got_offset, 0); 2002 got->add_constant(0); 2003 this->got_mod_index_offset_ = got_offset; 2004 } 2005 return this->got_mod_index_offset_; 2006 } 2007 2008 // Optimize the TLS relocation type based on what we know about the 2009 // symbol. IS_FINAL is true if the final address of this symbol is 2010 // known at link time. 2011 2012 template<int size> 2013 tls::Tls_optimization 2014 Target_s390<size>::optimize_tls_reloc(bool is_final, int r_type) 2015 { 2016 // If we are generating a shared library, then we can't do anything 2017 // in the linker. 2018 if (parameters->options().shared()) 2019 return tls::TLSOPT_NONE; 2020 2021 switch (r_type) 2022 { 2023 case elfcpp::R_390_TLS_GD32: 2024 case elfcpp::R_390_TLS_GD64: 2025 case elfcpp::R_390_TLS_GDCALL: 2026 // These are General-Dynamic which permits fully general TLS 2027 // access. Since we know that we are generating an executable, 2028 // we can convert this to Initial-Exec. If we also know that 2029 // this is a local symbol, we can further switch to Local-Exec. 2030 if (is_final) 2031 return tls::TLSOPT_TO_LE; 2032 return tls::TLSOPT_TO_IE; 2033 2034 case elfcpp::R_390_TLS_LDM32: 2035 case elfcpp::R_390_TLS_LDM64: 2036 case elfcpp::R_390_TLS_LDO32: 2037 case elfcpp::R_390_TLS_LDO64: 2038 case elfcpp::R_390_TLS_LDCALL: 2039 // This is Local-Dynamic, which refers to a local symbol in the 2040 // dynamic TLS block. Since we know that we generating an 2041 // executable, we can switch to Local-Exec. 2042 return tls::TLSOPT_TO_LE; 2043 2044 case elfcpp::R_390_TLS_IE32: 2045 case elfcpp::R_390_TLS_IE64: 2046 case elfcpp::R_390_TLS_GOTIE32: 2047 case elfcpp::R_390_TLS_GOTIE64: 2048 case elfcpp::R_390_TLS_LOAD: 2049 // These are Initial-Exec relocs which get the thread offset 2050 // from the GOT. If we know that we are linking against the 2051 // local symbol, we can switch to Local-Exec, which links the 2052 // thread offset into the instruction. 2053 if (is_final) 2054 return tls::TLSOPT_TO_LE; 2055 return tls::TLSOPT_NONE; 2056 2057 case elfcpp::R_390_TLS_GOTIE12: 2058 case elfcpp::R_390_TLS_IEENT: 2059 case elfcpp::R_390_TLS_GOTIE20: 2060 // These are Initial-Exec, but cannot be optimized. 2061 return tls::TLSOPT_NONE; 2062 2063 case elfcpp::R_390_TLS_LE32: 2064 case elfcpp::R_390_TLS_LE64: 2065 // When we already have Local-Exec, there is nothing further we 2066 // can do. 2067 return tls::TLSOPT_NONE; 2068 2069 default: 2070 gold_unreachable(); 2071 } 2072 } 2073 2074 // Get the Reference_flags for a particular relocation. 2075 2076 template<int size> 2077 int 2078 Target_s390<size>::Scan::get_reference_flags(unsigned int r_type) 2079 { 2080 switch (r_type) 2081 { 2082 case elfcpp::R_390_NONE: 2083 case elfcpp::R_390_GNU_VTINHERIT: 2084 case elfcpp::R_390_GNU_VTENTRY: 2085 case elfcpp::R_390_GOTPC: 2086 case elfcpp::R_390_GOTPCDBL: 2087 // No symbol reference. 2088 return 0; 2089 2090 case elfcpp::R_390_64: 2091 case elfcpp::R_390_32: 2092 case elfcpp::R_390_20: 2093 case elfcpp::R_390_16: 2094 case elfcpp::R_390_12: 2095 case elfcpp::R_390_8: 2096 return Symbol::ABSOLUTE_REF; 2097 2098 case elfcpp::R_390_PC12DBL: 2099 case elfcpp::R_390_PC16: 2100 case elfcpp::R_390_PC16DBL: 2101 case elfcpp::R_390_PC24DBL: 2102 case elfcpp::R_390_PC32: 2103 case elfcpp::R_390_PC32DBL: 2104 case elfcpp::R_390_PC64: 2105 case elfcpp::R_390_GOTOFF16: 2106 case elfcpp::R_390_GOTOFF32: 2107 case elfcpp::R_390_GOTOFF64: 2108 return Symbol::RELATIVE_REF; 2109 2110 case elfcpp::R_390_PLT12DBL: 2111 case elfcpp::R_390_PLT16DBL: 2112 case elfcpp::R_390_PLT24DBL: 2113 case elfcpp::R_390_PLT32: 2114 case elfcpp::R_390_PLT32DBL: 2115 case elfcpp::R_390_PLT64: 2116 case elfcpp::R_390_PLTOFF16: 2117 case elfcpp::R_390_PLTOFF32: 2118 case elfcpp::R_390_PLTOFF64: 2119 return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF; 2120 2121 case elfcpp::R_390_GOT12: 2122 case elfcpp::R_390_GOT16: 2123 case elfcpp::R_390_GOT20: 2124 case elfcpp::R_390_GOT32: 2125 case elfcpp::R_390_GOT64: 2126 case elfcpp::R_390_GOTENT: 2127 case elfcpp::R_390_GOTPLT12: 2128 case elfcpp::R_390_GOTPLT16: 2129 case elfcpp::R_390_GOTPLT20: 2130 case elfcpp::R_390_GOTPLT32: 2131 case elfcpp::R_390_GOTPLT64: 2132 case elfcpp::R_390_GOTPLTENT: 2133 // Absolute in GOT. 2134 return Symbol::ABSOLUTE_REF; 2135 2136 case elfcpp::R_390_TLS_GD32: // Global-dynamic 2137 case elfcpp::R_390_TLS_GD64: 2138 case elfcpp::R_390_TLS_GDCALL: 2139 case elfcpp::R_390_TLS_LDM32: // Local-dynamic 2140 case elfcpp::R_390_TLS_LDM64: 2141 case elfcpp::R_390_TLS_LDO32: 2142 case elfcpp::R_390_TLS_LDO64: 2143 case elfcpp::R_390_TLS_LDCALL: 2144 case elfcpp::R_390_TLS_IE32: // Initial-exec 2145 case elfcpp::R_390_TLS_IE64: 2146 case elfcpp::R_390_TLS_IEENT: 2147 case elfcpp::R_390_TLS_GOTIE12: 2148 case elfcpp::R_390_TLS_GOTIE20: 2149 case elfcpp::R_390_TLS_GOTIE32: 2150 case elfcpp::R_390_TLS_GOTIE64: 2151 case elfcpp::R_390_TLS_LOAD: 2152 case elfcpp::R_390_TLS_LE32: // Local-exec 2153 case elfcpp::R_390_TLS_LE64: 2154 return Symbol::TLS_REF; 2155 2156 case elfcpp::R_390_COPY: 2157 case elfcpp::R_390_GLOB_DAT: 2158 case elfcpp::R_390_JMP_SLOT: 2159 case elfcpp::R_390_RELATIVE: 2160 case elfcpp::R_390_IRELATIVE: 2161 case elfcpp::R_390_TLS_TPOFF: 2162 case elfcpp::R_390_TLS_DTPOFF: 2163 case elfcpp::R_390_TLS_DTPMOD: 2164 default: 2165 // Not expected. We will give an error later. 2166 return 0; 2167 } 2168 } 2169 2170 // Report an unsupported relocation against a local symbol. 2171 2172 template<int size> 2173 void 2174 Target_s390<size>::Scan::unsupported_reloc_local( 2175 Sized_relobj_file<size, true>* object, 2176 unsigned int r_type) 2177 { 2178 gold_error(_("%s: unsupported reloc %u against local symbol"), 2179 object->name().c_str(), r_type); 2180 } 2181 2182 // We are about to emit a dynamic relocation of type R_TYPE. If the 2183 // dynamic linker does not support it, issue an error. 2184 2185 template<int size> 2186 void 2187 Target_s390<size>::Scan::check_non_pic(Relobj* object, unsigned int r_type) 2188 { 2189 gold_assert(r_type != elfcpp::R_390_NONE); 2190 2191 if (size == 64) 2192 { 2193 switch (r_type) 2194 { 2195 // These are the relocation types supported by glibc for s390 64-bit. 2196 case elfcpp::R_390_RELATIVE: 2197 case elfcpp::R_390_IRELATIVE: 2198 case elfcpp::R_390_COPY: 2199 case elfcpp::R_390_GLOB_DAT: 2200 case elfcpp::R_390_JMP_SLOT: 2201 case elfcpp::R_390_TLS_DTPMOD: 2202 case elfcpp::R_390_TLS_DTPOFF: 2203 case elfcpp::R_390_TLS_TPOFF: 2204 case elfcpp::R_390_8: 2205 case elfcpp::R_390_16: 2206 case elfcpp::R_390_32: 2207 case elfcpp::R_390_64: 2208 case elfcpp::R_390_PC16: 2209 case elfcpp::R_390_PC16DBL: 2210 case elfcpp::R_390_PC32: 2211 case elfcpp::R_390_PC32DBL: 2212 case elfcpp::R_390_PC64: 2213 return; 2214 2215 default: 2216 break; 2217 } 2218 } 2219 else 2220 { 2221 switch (r_type) 2222 { 2223 // These are the relocation types supported by glibc for s390 32-bit. 2224 case elfcpp::R_390_RELATIVE: 2225 case elfcpp::R_390_IRELATIVE: 2226 case elfcpp::R_390_COPY: 2227 case elfcpp::R_390_GLOB_DAT: 2228 case elfcpp::R_390_JMP_SLOT: 2229 case elfcpp::R_390_TLS_DTPMOD: 2230 case elfcpp::R_390_TLS_DTPOFF: 2231 case elfcpp::R_390_TLS_TPOFF: 2232 case elfcpp::R_390_8: 2233 case elfcpp::R_390_16: 2234 case elfcpp::R_390_32: 2235 case elfcpp::R_390_PC16: 2236 case elfcpp::R_390_PC16DBL: 2237 case elfcpp::R_390_PC32: 2238 case elfcpp::R_390_PC32DBL: 2239 return; 2240 2241 default: 2242 break; 2243 } 2244 } 2245 2246 // This prevents us from issuing more than one error per reloc 2247 // section. But we can still wind up issuing more than one 2248 // error per object file. 2249 if (this->issued_non_pic_error_) 2250 return; 2251 gold_assert(parameters->options().output_is_position_independent()); 2252 object->error(_("requires unsupported dynamic reloc; " 2253 "recompile with -fPIC")); 2254 this->issued_non_pic_error_ = true; 2255 return; 2256 } 2257 2258 // Return whether we need to make a PLT entry for a relocation of the 2259 // given type against a STT_GNU_IFUNC symbol. 2260 2261 template<int size> 2262 bool 2263 Target_s390<size>::Scan::reloc_needs_plt_for_ifunc( 2264 Sized_relobj_file<size, true>* object, 2265 unsigned int r_type) 2266 { 2267 int flags = Scan::get_reference_flags(r_type); 2268 if (flags & Symbol::TLS_REF) 2269 gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"), 2270 object->name().c_str(), r_type); 2271 return flags != 0; 2272 } 2273 2274 // Scan a relocation for a local symbol. 2275 2276 template<int size> 2277 inline void 2278 Target_s390<size>::Scan::local(Symbol_table* symtab, 2279 Layout* layout, 2280 Target_s390<size>* target, 2281 Sized_relobj_file<size, true>* object, 2282 unsigned int data_shndx, 2283 Output_section* output_section, 2284 const elfcpp::Rela<size, true>& reloc, 2285 unsigned int r_type, 2286 const elfcpp::Sym<size, true>& lsym, 2287 bool is_discarded) 2288 { 2289 if (is_discarded) 2290 return; 2291 2292 // A local STT_GNU_IFUNC symbol may require a PLT entry. 2293 bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC; 2294 2295 if (is_ifunc && this->reloc_needs_plt_for_ifunc(object, r_type)) 2296 { 2297 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2298 target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym); 2299 } 2300 2301 switch (r_type) 2302 { 2303 case elfcpp::R_390_NONE: 2304 case elfcpp::R_390_GNU_VTINHERIT: 2305 case elfcpp::R_390_GNU_VTENTRY: 2306 break; 2307 2308 case elfcpp::R_390_64: 2309 // If building a shared library (or a position-independent 2310 // executable), we need to create a dynamic relocation for this 2311 // location. The relocation applied at link time will apply the 2312 // link-time value, so we flag the location with an 2313 // R_390_RELATIVE relocation so the dynamic loader can 2314 // relocate it easily. 2315 if (parameters->options().output_is_position_independent() && size == 64) 2316 { 2317 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2318 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2319 rela_dyn->add_local_relative(object, r_sym, 2320 elfcpp::R_390_RELATIVE, 2321 output_section, data_shndx, 2322 reloc.get_r_offset(), 2323 reloc.get_r_addend(), is_ifunc); 2324 } 2325 break; 2326 2327 case elfcpp::R_390_32: 2328 case elfcpp::R_390_20: 2329 case elfcpp::R_390_16: 2330 case elfcpp::R_390_12: 2331 case elfcpp::R_390_8: 2332 if (parameters->options().output_is_position_independent()) 2333 { 2334 if (size == 32 && r_type == elfcpp::R_390_32) 2335 { 2336 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2337 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2338 rela_dyn->add_local_relative(object, r_sym, 2339 elfcpp::R_390_RELATIVE, 2340 output_section, data_shndx, 2341 reloc.get_r_offset(), 2342 reloc.get_r_addend(), is_ifunc); 2343 break; 2344 } 2345 2346 check_non_pic(object, r_type); 2347 2348 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2349 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2350 if (lsym.get_st_type() != elfcpp::STT_SECTION) 2351 rela_dyn->add_local(object, r_sym, r_type, output_section, 2352 data_shndx, reloc.get_r_offset(), 2353 reloc.get_r_addend()); 2354 else 2355 { 2356 gold_assert(lsym.get_st_value() == 0); 2357 unsigned int shndx = lsym.get_st_shndx(); 2358 bool is_ordinary; 2359 shndx = object->adjust_sym_shndx(r_sym, shndx, 2360 &is_ordinary); 2361 if (!is_ordinary) 2362 object->error(_("section symbol %u has bad shndx %u"), 2363 r_sym, shndx); 2364 else 2365 rela_dyn->add_local_section(object, shndx, 2366 r_type, output_section, 2367 data_shndx, reloc.get_r_offset(), 2368 reloc.get_r_addend()); 2369 } 2370 } 2371 break; 2372 2373 case elfcpp::R_390_PC12DBL: 2374 case elfcpp::R_390_PC16: 2375 case elfcpp::R_390_PC16DBL: 2376 case elfcpp::R_390_PC24DBL: 2377 case elfcpp::R_390_PC32: 2378 case elfcpp::R_390_PC32DBL: 2379 case elfcpp::R_390_PC64: 2380 break; 2381 2382 case elfcpp::R_390_PLT12DBL: 2383 case elfcpp::R_390_PLT16DBL: 2384 case elfcpp::R_390_PLT24DBL: 2385 case elfcpp::R_390_PLT32: 2386 case elfcpp::R_390_PLT32DBL: 2387 case elfcpp::R_390_PLT64: 2388 // Since we know this is a local symbol, we can handle this as a 2389 // PC32 reloc. 2390 break; 2391 2392 case elfcpp::R_390_GOTPC: 2393 case elfcpp::R_390_GOTPCDBL: 2394 case elfcpp::R_390_GOTOFF16: 2395 case elfcpp::R_390_GOTOFF32: 2396 case elfcpp::R_390_GOTOFF64: 2397 case elfcpp::R_390_PLTOFF16: 2398 case elfcpp::R_390_PLTOFF32: 2399 case elfcpp::R_390_PLTOFF64: 2400 // We need a GOT section. 2401 target->got_section(symtab, layout); 2402 // For PLTOFF*, we'd normally want a PLT section, but since we 2403 // know this is a local symbol, no PLT is needed. 2404 break; 2405 2406 case elfcpp::R_390_GOT12: 2407 case elfcpp::R_390_GOT16: 2408 case elfcpp::R_390_GOT20: 2409 case elfcpp::R_390_GOT32: 2410 case elfcpp::R_390_GOT64: 2411 case elfcpp::R_390_GOTENT: 2412 case elfcpp::R_390_GOTPLT12: 2413 case elfcpp::R_390_GOTPLT16: 2414 case elfcpp::R_390_GOTPLT20: 2415 case elfcpp::R_390_GOTPLT32: 2416 case elfcpp::R_390_GOTPLT64: 2417 case elfcpp::R_390_GOTPLTENT: 2418 { 2419 // The symbol requires a GOT section. 2420 Output_data_got<size, true>* got = target->got_section(symtab, layout); 2421 2422 // The symbol requires a GOT entry. 2423 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2424 2425 // For a STT_GNU_IFUNC symbol we want the PLT offset. That 2426 // lets function pointers compare correctly with shared 2427 // libraries. Otherwise we would need an IRELATIVE reloc. 2428 bool is_new; 2429 if (is_ifunc) 2430 is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD); 2431 else 2432 is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD); 2433 if (is_new) 2434 { 2435 // If we are generating a shared object, we need to add a 2436 // dynamic relocation for this symbol's GOT entry. 2437 if (parameters->options().output_is_position_independent()) 2438 { 2439 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2440 unsigned int got_offset = 2441 object->local_got_offset(r_sym, GOT_TYPE_STANDARD); 2442 rela_dyn->add_local_relative(object, r_sym, 2443 elfcpp::R_390_RELATIVE, 2444 got, got_offset, 0, is_ifunc); 2445 } 2446 } 2447 // For GOTPLT*, we'd normally want a PLT section, but since 2448 // we know this is a local symbol, no PLT is needed. 2449 } 2450 break; 2451 2452 case elfcpp::R_390_COPY: 2453 case elfcpp::R_390_GLOB_DAT: 2454 case elfcpp::R_390_JMP_SLOT: 2455 case elfcpp::R_390_RELATIVE: 2456 case elfcpp::R_390_IRELATIVE: 2457 // These are outstanding tls relocs, which are unexpected when linking 2458 case elfcpp::R_390_TLS_TPOFF: 2459 case elfcpp::R_390_TLS_DTPOFF: 2460 case elfcpp::R_390_TLS_DTPMOD: 2461 gold_error(_("%s: unexpected reloc %u in object file"), 2462 object->name().c_str(), r_type); 2463 break; 2464 2465 // These are initial tls relocs, which are expected when linking 2466 case elfcpp::R_390_TLS_GD32: // Global-dynamic 2467 case elfcpp::R_390_TLS_GD64: 2468 case elfcpp::R_390_TLS_GDCALL: 2469 case elfcpp::R_390_TLS_LDM32: // Local-dynamic 2470 case elfcpp::R_390_TLS_LDM64: 2471 case elfcpp::R_390_TLS_LDO32: 2472 case elfcpp::R_390_TLS_LDO64: 2473 case elfcpp::R_390_TLS_LDCALL: 2474 case elfcpp::R_390_TLS_IE32: // Initial-exec 2475 case elfcpp::R_390_TLS_IE64: 2476 case elfcpp::R_390_TLS_IEENT: 2477 case elfcpp::R_390_TLS_GOTIE12: 2478 case elfcpp::R_390_TLS_GOTIE20: 2479 case elfcpp::R_390_TLS_GOTIE32: 2480 case elfcpp::R_390_TLS_GOTIE64: 2481 case elfcpp::R_390_TLS_LOAD: 2482 case elfcpp::R_390_TLS_LE32: // Local-exec 2483 case elfcpp::R_390_TLS_LE64: 2484 { 2485 bool output_is_shared = parameters->options().shared(); 2486 const tls::Tls_optimization optimized_type 2487 = Target_s390<size>::optimize_tls_reloc(!output_is_shared, 2488 r_type); 2489 switch (r_type) 2490 { 2491 case elfcpp::R_390_TLS_GD32: // General-dynamic 2492 case elfcpp::R_390_TLS_GD64: 2493 case elfcpp::R_390_TLS_GDCALL: 2494 if (optimized_type == tls::TLSOPT_NONE) 2495 { 2496 // Create a pair of GOT entries for the module index and 2497 // dtv-relative offset. 2498 Output_data_got<size, true>* got 2499 = target->got_section(symtab, layout); 2500 unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2501 unsigned int shndx = lsym.get_st_shndx(); 2502 bool is_ordinary; 2503 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary); 2504 if (!is_ordinary) 2505 object->error(_("local symbol %u has bad shndx %u"), 2506 r_sym, shndx); 2507 else 2508 got->add_local_pair_with_rel(object, r_sym, 2509 shndx, 2510 GOT_TYPE_TLS_PAIR, 2511 target->rela_dyn_section(layout), 2512 elfcpp::R_390_TLS_DTPMOD); 2513 } 2514 else if (optimized_type != tls::TLSOPT_TO_LE) 2515 unsupported_reloc_local(object, r_type); 2516 break; 2517 2518 case elfcpp::R_390_TLS_LDM32: // Local-dynamic 2519 case elfcpp::R_390_TLS_LDM64: 2520 case elfcpp::R_390_TLS_LDCALL: 2521 if (optimized_type == tls::TLSOPT_NONE) 2522 { 2523 // Create a GOT entry for the module index. 2524 target->got_mod_index_entry(symtab, layout, object); 2525 } 2526 else if (optimized_type != tls::TLSOPT_TO_LE) 2527 unsupported_reloc_local(object, r_type); 2528 break; 2529 2530 case elfcpp::R_390_TLS_LDO32: 2531 case elfcpp::R_390_TLS_LDO64: 2532 break; 2533 2534 case elfcpp::R_390_TLS_IE32: // Initial-exec 2535 case elfcpp::R_390_TLS_IE64: 2536 // These two involve an absolute address 2537 if (parameters->options().shared() 2538 && optimized_type == tls::TLSOPT_NONE) 2539 { 2540 if ((size == 32 && r_type == elfcpp::R_390_TLS_IE32) || 2541 (size == 64 && r_type == elfcpp::R_390_TLS_IE64)) 2542 { 2543 // We need to create a dynamic relocation. 2544 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2545 unsigned int r_sym = 2546 elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2547 rela_dyn->add_local_relative(object, r_sym, 2548 elfcpp::R_390_RELATIVE, 2549 output_section, data_shndx, 2550 reloc.get_r_offset(), 2551 reloc.get_r_addend(), false); 2552 } 2553 else 2554 { 2555 unsupported_reloc_local(object, r_type); 2556 } 2557 } 2558 // fall through 2559 case elfcpp::R_390_TLS_IEENT: 2560 case elfcpp::R_390_TLS_GOTIE12: 2561 case elfcpp::R_390_TLS_GOTIE20: 2562 case elfcpp::R_390_TLS_GOTIE32: 2563 case elfcpp::R_390_TLS_GOTIE64: 2564 case elfcpp::R_390_TLS_LOAD: 2565 layout->set_has_static_tls(); 2566 if (optimized_type == tls::TLSOPT_NONE) 2567 { 2568 if (!output_is_shared) 2569 { 2570 // We're making an executable, and the symbol is local, but 2571 // we cannot optimize to LE. Make a const GOT entry instead. 2572 Output_data_got<size, true>* got 2573 = target->got_section(symtab, layout); 2574 unsigned int r_sym 2575 = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2576 got->add_local_plt(object, r_sym, GOT_TYPE_TLS_OFFSET); 2577 } 2578 else 2579 { 2580 // Create a GOT entry for the tp-relative offset. 2581 Output_data_got<size, true>* got 2582 = target->got_section(symtab, layout); 2583 unsigned int r_sym 2584 = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2585 got->add_local_with_rel(object, r_sym, GOT_TYPE_TLS_OFFSET, 2586 target->rela_dyn_section(layout), 2587 elfcpp::R_390_TLS_TPOFF); 2588 } 2589 } 2590 else if (optimized_type != tls::TLSOPT_TO_LE) 2591 unsupported_reloc_local(object, r_type); 2592 break; 2593 2594 case elfcpp::R_390_TLS_LE32: // Local-exec 2595 case elfcpp::R_390_TLS_LE64: 2596 layout->set_has_static_tls(); 2597 if (output_is_shared) 2598 { 2599 // We need to create a dynamic relocation. 2600 if ((size == 32 && r_type == elfcpp::R_390_TLS_LE32) || 2601 (size == 64 && r_type == elfcpp::R_390_TLS_LE64)) 2602 { 2603 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2604 unsigned int r_sym 2605 = elfcpp::elf_r_sym<size>(reloc.get_r_info()); 2606 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION); 2607 rela_dyn->add_local(object, r_sym, elfcpp::R_390_TLS_TPOFF, 2608 output_section, data_shndx, 2609 reloc.get_r_offset(), 2610 reloc.get_r_addend()); 2611 } 2612 else 2613 { 2614 unsupported_reloc_local(object, r_type); 2615 } 2616 } 2617 break; 2618 2619 default: 2620 gold_unreachable(); 2621 } 2622 } 2623 break; 2624 2625 default: 2626 gold_error(_("%s: unsupported reloc %u against local symbol"), 2627 object->name().c_str(), r_type); 2628 break; 2629 } 2630 } 2631 2632 // Scan a relocation for a global symbol. 2633 2634 template<int size> 2635 inline void 2636 Target_s390<size>::Scan::global(Symbol_table* symtab, 2637 Layout* layout, 2638 Target_s390<size>* target, 2639 Sized_relobj_file<size, true>* object, 2640 unsigned int data_shndx, 2641 Output_section* output_section, 2642 const elfcpp::Rela<size, true>& reloc, 2643 unsigned int r_type, 2644 Symbol* gsym) 2645 { 2646 // A STT_GNU_IFUNC symbol may require a PLT entry. 2647 if (gsym->type() == elfcpp::STT_GNU_IFUNC 2648 && this->reloc_needs_plt_for_ifunc(object, r_type)) 2649 target->make_plt_entry(symtab, layout, gsym); 2650 2651 switch (r_type) 2652 { 2653 case elfcpp::R_390_NONE: 2654 case elfcpp::R_390_GNU_VTINHERIT: 2655 case elfcpp::R_390_GNU_VTENTRY: 2656 break; 2657 2658 case elfcpp::R_390_64: 2659 case elfcpp::R_390_32: 2660 case elfcpp::R_390_20: 2661 case elfcpp::R_390_16: 2662 case elfcpp::R_390_12: 2663 case elfcpp::R_390_8: 2664 { 2665 // Make a PLT entry if necessary. 2666 if (gsym->needs_plt_entry()) 2667 { 2668 target->make_plt_entry(symtab, layout, gsym); 2669 // Since this is not a PC-relative relocation, we may be 2670 // taking the address of a function. In that case we need to 2671 // set the entry in the dynamic symbol table to the address of 2672 // the PLT entry. 2673 if (gsym->is_from_dynobj() && !parameters->options().shared()) 2674 gsym->set_needs_dynsym_value(); 2675 } 2676 // Make a dynamic relocation if necessary. 2677 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type))) 2678 { 2679 if (!parameters->options().output_is_position_independent() 2680 && gsym->may_need_copy_reloc()) 2681 { 2682 target->copy_reloc(symtab, layout, object, 2683 data_shndx, output_section, gsym, reloc); 2684 } 2685 else if (((size == 64 && r_type == elfcpp::R_390_64) 2686 || (size == 32 && r_type == elfcpp::R_390_32)) 2687 && gsym->type() == elfcpp::STT_GNU_IFUNC 2688 && gsym->can_use_relative_reloc(false) 2689 && !gsym->is_from_dynobj() 2690 && !gsym->is_undefined() 2691 && !gsym->is_preemptible()) 2692 { 2693 // Use an IRELATIVE reloc for a locally defined 2694 // STT_GNU_IFUNC symbol. This makes a function 2695 // address in a PIE executable match the address in a 2696 // shared library that it links against. 2697 Reloc_section* rela_dyn = 2698 target->rela_irelative_section(layout); 2699 unsigned int r_type = elfcpp::R_390_IRELATIVE; 2700 rela_dyn->add_symbolless_global_addend(gsym, r_type, 2701 output_section, object, 2702 data_shndx, 2703 reloc.get_r_offset(), 2704 reloc.get_r_addend()); 2705 } 2706 else if (((size == 64 && r_type == elfcpp::R_390_64) 2707 || (size == 32 && r_type == elfcpp::R_390_32)) 2708 && gsym->can_use_relative_reloc(false)) 2709 { 2710 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2711 rela_dyn->add_global_relative(gsym, elfcpp::R_390_RELATIVE, 2712 output_section, object, 2713 data_shndx, 2714 reloc.get_r_offset(), 2715 reloc.get_r_addend(), false); 2716 } 2717 else 2718 { 2719 check_non_pic(object, r_type); 2720 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2721 rela_dyn->add_global(gsym, r_type, output_section, object, 2722 data_shndx, reloc.get_r_offset(), 2723 reloc.get_r_addend()); 2724 } 2725 } 2726 } 2727 break; 2728 2729 case elfcpp::R_390_PC12DBL: 2730 case elfcpp::R_390_PC16: 2731 case elfcpp::R_390_PC16DBL: 2732 case elfcpp::R_390_PC24DBL: 2733 case elfcpp::R_390_PC32: 2734 case elfcpp::R_390_PC32DBL: 2735 case elfcpp::R_390_PC64: 2736 { 2737 // Make a PLT entry if necessary. 2738 if (gsym->needs_plt_entry()) 2739 { 2740 target->make_plt_entry(symtab, layout, gsym); 2741 // larl is often used to take address of a function. Aim the 2742 // symbol at the PLT entry. 2743 if (gsym->is_from_dynobj() && !parameters->options().shared()) 2744 gsym->set_needs_dynsym_value(); 2745 } 2746 // Make a dynamic relocation if necessary. 2747 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type))) 2748 { 2749 if (parameters->options().output_is_executable() 2750 && gsym->may_need_copy_reloc()) 2751 { 2752 target->copy_reloc(symtab, layout, object, 2753 data_shndx, output_section, gsym, reloc); 2754 } 2755 else 2756 { 2757 check_non_pic(object, r_type); 2758 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2759 rela_dyn->add_global(gsym, r_type, output_section, object, 2760 data_shndx, reloc.get_r_offset(), 2761 reloc.get_r_addend()); 2762 } 2763 } 2764 } 2765 break; 2766 2767 case elfcpp::R_390_PLT12DBL: 2768 case elfcpp::R_390_PLT16DBL: 2769 case elfcpp::R_390_PLT24DBL: 2770 case elfcpp::R_390_PLT32: 2771 case elfcpp::R_390_PLT32DBL: 2772 case elfcpp::R_390_PLT64: 2773 // If the symbol is fully resolved, this is just a PC32 reloc. 2774 // Otherwise we need a PLT entry. 2775 if (gsym->final_value_is_known()) 2776 break; 2777 // If building a shared library, we can also skip the PLT entry 2778 // if the symbol is defined in the output file and is protected 2779 // or hidden. 2780 if (gsym->is_defined() 2781 && !gsym->is_from_dynobj() 2782 && !gsym->is_preemptible()) 2783 break; 2784 target->make_plt_entry(symtab, layout, gsym); 2785 break; 2786 2787 case elfcpp::R_390_GOTPC: 2788 case elfcpp::R_390_GOTPCDBL: 2789 case elfcpp::R_390_GOTOFF16: 2790 case elfcpp::R_390_GOTOFF32: 2791 case elfcpp::R_390_GOTOFF64: 2792 case elfcpp::R_390_PLTOFF16: 2793 case elfcpp::R_390_PLTOFF32: 2794 case elfcpp::R_390_PLTOFF64: 2795 // We need a GOT section. 2796 target->got_section(symtab, layout); 2797 // For PLTOFF*, we also need a PLT entry (but only if the 2798 // symbol is not fully resolved). 2799 if ((r_type == elfcpp::R_390_PLTOFF16 2800 || r_type == elfcpp::R_390_PLTOFF32 2801 || r_type == elfcpp::R_390_PLTOFF64) 2802 && !gsym->final_value_is_known()) 2803 target->make_plt_entry(symtab, layout, gsym); 2804 break; 2805 2806 case elfcpp::R_390_GOT12: 2807 case elfcpp::R_390_GOT16: 2808 case elfcpp::R_390_GOT20: 2809 case elfcpp::R_390_GOT32: 2810 case elfcpp::R_390_GOT64: 2811 case elfcpp::R_390_GOTENT: 2812 case elfcpp::R_390_GOTPLT12: 2813 case elfcpp::R_390_GOTPLT16: 2814 case elfcpp::R_390_GOTPLT20: 2815 case elfcpp::R_390_GOTPLT32: 2816 case elfcpp::R_390_GOTPLT64: 2817 case elfcpp::R_390_GOTPLTENT: 2818 { 2819 // The symbol requires a GOT entry. 2820 Output_data_got<size, true>* got = target->got_section(symtab, layout); 2821 2822 if (gsym->final_value_is_known()) 2823 { 2824 // For a STT_GNU_IFUNC symbol we want the PLT address. 2825 if (gsym->type() == elfcpp::STT_GNU_IFUNC) 2826 got->add_global_plt(gsym, GOT_TYPE_STANDARD); 2827 else 2828 got->add_global(gsym, GOT_TYPE_STANDARD); 2829 } 2830 else 2831 { 2832 // If this symbol is not fully resolved, we need to add a 2833 // dynamic relocation for it. 2834 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2835 2836 // Use a GLOB_DAT rather than a RELATIVE reloc if: 2837 // 2838 // 1) The symbol may be defined in some other module. 2839 // 2840 // 2) We are building a shared library and this is a 2841 // protected symbol; using GLOB_DAT means that the dynamic 2842 // linker can use the address of the PLT in the main 2843 // executable when appropriate so that function address 2844 // comparisons work. 2845 // 2846 // 3) This is a STT_GNU_IFUNC symbol in position dependent 2847 // code, again so that function address comparisons work. 2848 if (gsym->is_from_dynobj() 2849 || gsym->is_undefined() 2850 || gsym->is_preemptible() 2851 || (gsym->visibility() == elfcpp::STV_PROTECTED 2852 && parameters->options().shared()) 2853 || (gsym->type() == elfcpp::STT_GNU_IFUNC 2854 && parameters->options().output_is_position_independent())) 2855 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD, rela_dyn, 2856 elfcpp::R_390_GLOB_DAT); 2857 else 2858 { 2859 // For a STT_GNU_IFUNC symbol we want to write the PLT 2860 // offset into the GOT, so that function pointer 2861 // comparisons work correctly. 2862 bool is_new; 2863 if (gsym->type() != elfcpp::STT_GNU_IFUNC) 2864 is_new = got->add_global(gsym, GOT_TYPE_STANDARD); 2865 else 2866 { 2867 is_new = got->add_global_plt(gsym, GOT_TYPE_STANDARD); 2868 // Tell the dynamic linker to use the PLT address 2869 // when resolving relocations. 2870 if (gsym->is_from_dynobj() 2871 && !parameters->options().shared()) 2872 gsym->set_needs_dynsym_value(); 2873 } 2874 if (is_new) 2875 { 2876 unsigned int got_off = gsym->got_offset(GOT_TYPE_STANDARD); 2877 rela_dyn->add_global_relative(gsym, 2878 elfcpp::R_390_RELATIVE, 2879 got, got_off, 0, false); 2880 } 2881 } 2882 } 2883 } 2884 break; 2885 2886 case elfcpp::R_390_COPY: 2887 case elfcpp::R_390_GLOB_DAT: 2888 case elfcpp::R_390_JMP_SLOT: 2889 case elfcpp::R_390_RELATIVE: 2890 case elfcpp::R_390_IRELATIVE: 2891 // These are outstanding tls relocs, which are unexpected when linking 2892 case elfcpp::R_390_TLS_TPOFF: 2893 case elfcpp::R_390_TLS_DTPOFF: 2894 case elfcpp::R_390_TLS_DTPMOD: 2895 gold_error(_("%s: unexpected reloc %u in object file"), 2896 object->name().c_str(), r_type); 2897 break; 2898 2899 // These are initial tls relocs, which are expected for global() 2900 case elfcpp::R_390_TLS_GD32: // Global-dynamic 2901 case elfcpp::R_390_TLS_GD64: 2902 case elfcpp::R_390_TLS_GDCALL: 2903 case elfcpp::R_390_TLS_LDM32: // Local-dynamic 2904 case elfcpp::R_390_TLS_LDM64: 2905 case elfcpp::R_390_TLS_LDO32: 2906 case elfcpp::R_390_TLS_LDO64: 2907 case elfcpp::R_390_TLS_LDCALL: 2908 case elfcpp::R_390_TLS_IE32: // Initial-exec 2909 case elfcpp::R_390_TLS_IE64: 2910 case elfcpp::R_390_TLS_IEENT: 2911 case elfcpp::R_390_TLS_GOTIE12: 2912 case elfcpp::R_390_TLS_GOTIE20: 2913 case elfcpp::R_390_TLS_GOTIE32: 2914 case elfcpp::R_390_TLS_GOTIE64: 2915 case elfcpp::R_390_TLS_LOAD: 2916 case elfcpp::R_390_TLS_LE32: // Local-exec 2917 case elfcpp::R_390_TLS_LE64: 2918 { 2919 // For the optimizable Initial-Exec model, we can treat undef symbols 2920 // as final when building an executable. 2921 const bool is_final = (gsym->final_value_is_known() || 2922 ((r_type == elfcpp::R_390_TLS_IE32 || 2923 r_type == elfcpp::R_390_TLS_IE64 || 2924 r_type == elfcpp::R_390_TLS_GOTIE32 || 2925 r_type == elfcpp::R_390_TLS_GOTIE64) && 2926 gsym->is_undefined() && 2927 parameters->options().output_is_executable())); 2928 const tls::Tls_optimization optimized_type 2929 = Target_s390<size>::optimize_tls_reloc(is_final, r_type); 2930 switch (r_type) 2931 { 2932 case elfcpp::R_390_TLS_GD32: // General-dynamic 2933 case elfcpp::R_390_TLS_GD64: 2934 case elfcpp::R_390_TLS_GDCALL: 2935 if (optimized_type == tls::TLSOPT_NONE) 2936 { 2937 // Create a pair of GOT entries for the module index and 2938 // dtv-relative offset. 2939 Output_data_got<size, true>* got 2940 = target->got_section(symtab, layout); 2941 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR, 2942 target->rela_dyn_section(layout), 2943 elfcpp::R_390_TLS_DTPMOD, 2944 elfcpp::R_390_TLS_DTPOFF); 2945 } 2946 else if (optimized_type == tls::TLSOPT_TO_IE) 2947 { 2948 // Create a GOT entry for the tp-relative offset. 2949 Output_data_got<size, true>* got 2950 = target->got_section(symtab, layout); 2951 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET, 2952 target->rela_dyn_section(layout), 2953 elfcpp::R_390_TLS_TPOFF); 2954 } 2955 else if (optimized_type != tls::TLSOPT_TO_LE) 2956 unsupported_reloc_global(object, r_type, gsym); 2957 break; 2958 2959 case elfcpp::R_390_TLS_LDM32: // Local-dynamic 2960 case elfcpp::R_390_TLS_LDM64: 2961 case elfcpp::R_390_TLS_LDCALL: 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 else if (optimized_type != tls::TLSOPT_TO_LE) 2968 unsupported_reloc_global(object, r_type, gsym); 2969 break; 2970 2971 case elfcpp::R_390_TLS_LDO32: 2972 case elfcpp::R_390_TLS_LDO64: 2973 break; 2974 2975 case elfcpp::R_390_TLS_IE32: // Initial-exec 2976 case elfcpp::R_390_TLS_IE64: 2977 // These two involve an absolute address 2978 if (parameters->options().shared()) 2979 { 2980 if ((size == 32 && r_type == elfcpp::R_390_TLS_IE32) || 2981 (size == 64 && r_type == elfcpp::R_390_TLS_IE64)) 2982 { 2983 // We need to create a dynamic relocation. 2984 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 2985 rela_dyn->add_global_relative(gsym, elfcpp::R_390_RELATIVE, 2986 output_section, object, 2987 data_shndx, 2988 reloc.get_r_offset(), 2989 reloc.get_r_addend(), false); 2990 } 2991 else 2992 { 2993 unsupported_reloc_global(object, r_type, gsym); 2994 } 2995 } 2996 // fall through 2997 case elfcpp::R_390_TLS_IEENT: 2998 case elfcpp::R_390_TLS_GOTIE12: 2999 case elfcpp::R_390_TLS_GOTIE20: 3000 case elfcpp::R_390_TLS_GOTIE32: 3001 case elfcpp::R_390_TLS_GOTIE64: 3002 case elfcpp::R_390_TLS_LOAD: 3003 layout->set_has_static_tls(); 3004 if (optimized_type == tls::TLSOPT_NONE) 3005 { 3006 if (is_final && !parameters->options().shared()) 3007 { 3008 // We're making an executable, and the symbol is local, but 3009 // we cannot optimize to LE. Make a const GOT entry instead. 3010 Output_data_got<size, true>* got 3011 = target->got_section(symtab, layout); 3012 got->add_global_plt(gsym, GOT_TYPE_TLS_OFFSET); 3013 } 3014 else 3015 { 3016 // Create a GOT entry for the tp-relative offset. 3017 Output_data_got<size, true>* got 3018 = target->got_section(symtab, layout); 3019 got->add_global_with_rel(gsym, GOT_TYPE_TLS_OFFSET, 3020 target->rela_dyn_section(layout), 3021 elfcpp::R_390_TLS_TPOFF); 3022 } 3023 } 3024 else if (optimized_type != tls::TLSOPT_TO_LE) 3025 unsupported_reloc_global(object, r_type, gsym); 3026 break; 3027 3028 case elfcpp::R_390_TLS_LE32: // Local-exec 3029 case elfcpp::R_390_TLS_LE64: 3030 layout->set_has_static_tls(); 3031 if (parameters->options().shared()) 3032 { 3033 // We need to create a dynamic relocation. 3034 if ((size == 32 && r_type == elfcpp::R_390_TLS_LE32) || 3035 (size == 64 && r_type == elfcpp::R_390_TLS_LE64)) 3036 { 3037 Reloc_section* rela_dyn = target->rela_dyn_section(layout); 3038 rela_dyn->add_global(gsym, elfcpp::R_390_TLS_TPOFF, 3039 output_section, object, 3040 data_shndx, reloc.get_r_offset(), 3041 reloc.get_r_addend()); 3042 } 3043 else 3044 { 3045 unsupported_reloc_global(object, r_type, gsym); 3046 } 3047 } 3048 break; 3049 3050 default: 3051 gold_unreachable(); 3052 } 3053 } 3054 break; 3055 3056 default: 3057 gold_error(_("%s: unsupported reloc %u against global symbol %s"), 3058 object->name().c_str(), r_type, 3059 gsym->demangled_name().c_str()); 3060 break; 3061 } 3062 } 3063 3064 3065 // Report an unsupported relocation against a global symbol. 3066 3067 template<int size> 3068 void 3069 Target_s390<size>::Scan::unsupported_reloc_global( 3070 Sized_relobj_file<size, true>* object, 3071 unsigned int r_type, 3072 Symbol* gsym) 3073 { 3074 gold_error(_("%s: unsupported reloc %u against global symbol %s"), 3075 object->name().c_str(), r_type, gsym->demangled_name().c_str()); 3076 } 3077 3078 // Returns true if this relocation type could be that of a function pointer. 3079 template<int size> 3080 inline bool 3081 Target_s390<size>::Scan::possible_function_pointer_reloc(unsigned int r_type) 3082 { 3083 switch (r_type) 3084 { 3085 case elfcpp::R_390_32: 3086 case elfcpp::R_390_64: 3087 case elfcpp::R_390_PC32DBL: // could be used by larl insn 3088 case elfcpp::R_390_GOT12: 3089 case elfcpp::R_390_GOT16: 3090 case elfcpp::R_390_GOT20: 3091 case elfcpp::R_390_GOT32: 3092 case elfcpp::R_390_GOT64: 3093 case elfcpp::R_390_GOTENT: 3094 case elfcpp::R_390_GOTOFF16: 3095 case elfcpp::R_390_GOTOFF32: 3096 case elfcpp::R_390_GOTOFF64: 3097 return true; 3098 } 3099 return false; 3100 } 3101 3102 // For safe ICF, scan a relocation for a local symbol to check if it 3103 // corresponds to a function pointer being taken. In that case mark 3104 // the function whose pointer was taken as not foldable. 3105 3106 template<int size> 3107 inline bool 3108 Target_s390<size>::Scan::local_reloc_may_be_function_pointer( 3109 Symbol_table* , 3110 Layout* , 3111 Target_s390<size>* , 3112 Sized_relobj_file<size, true>* , 3113 unsigned int , 3114 Output_section* , 3115 const elfcpp::Rela<size, true>& , 3116 unsigned int r_type, 3117 const elfcpp::Sym<size, true>&) 3118 { 3119 // When building a shared library, do not fold any local symbols. 3120 return (parameters->options().shared() 3121 || possible_function_pointer_reloc(r_type)); 3122 } 3123 3124 // For safe ICF, scan a relocation for a global symbol to check if it 3125 // corresponds to a function pointer being taken. In that case mark 3126 // the function whose pointer was taken as not foldable. 3127 3128 template<int size> 3129 inline bool 3130 Target_s390<size>::Scan::global_reloc_may_be_function_pointer( 3131 Symbol_table*, 3132 Layout* , 3133 Target_s390<size>* , 3134 Sized_relobj_file<size, true>* , 3135 unsigned int , 3136 Output_section* , 3137 const elfcpp::Rela<size, true>& , 3138 unsigned int r_type, 3139 Symbol* gsym) 3140 { 3141 // When building a shared library, do not fold symbols whose visibility 3142 // is hidden, internal or protected. 3143 return ((parameters->options().shared() 3144 && (gsym->visibility() == elfcpp::STV_INTERNAL 3145 || gsym->visibility() == elfcpp::STV_PROTECTED 3146 || gsym->visibility() == elfcpp::STV_HIDDEN)) 3147 || possible_function_pointer_reloc(r_type)); 3148 } 3149 3150 template<int size> 3151 void 3152 Target_s390<size>::gc_process_relocs(Symbol_table* symtab, 3153 Layout* layout, 3154 Sized_relobj_file<size, true>* object, 3155 unsigned int data_shndx, 3156 unsigned int sh_type, 3157 const unsigned char* prelocs, 3158 size_t reloc_count, 3159 Output_section* output_section, 3160 bool needs_special_offset_handling, 3161 size_t local_symbol_count, 3162 const unsigned char* plocal_symbols) 3163 { 3164 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, true> 3165 Classify_reloc; 3166 3167 if (sh_type == elfcpp::SHT_REL) 3168 return; 3169 3170 gold::gc_process_relocs<size, true, Target_s390<size>, Scan, Classify_reloc>( 3171 symtab, 3172 layout, 3173 this, 3174 object, 3175 data_shndx, 3176 prelocs, 3177 reloc_count, 3178 output_section, 3179 needs_special_offset_handling, 3180 local_symbol_count, 3181 plocal_symbols); 3182 } 3183 3184 // Perform a relocation. 3185 3186 template<int size> 3187 inline bool 3188 Target_s390<size>::Relocate::relocate( 3189 const Relocate_info<size, true>* relinfo, 3190 unsigned int, 3191 Target_s390<size>* target, 3192 Output_section*, 3193 size_t relnum, 3194 const unsigned char* preloc, 3195 const Sized_symbol<size>* gsym, 3196 const Symbol_value<size>* psymval, 3197 unsigned char* view, 3198 typename elfcpp::Elf_types<size>::Elf_Addr address, 3199 section_size_type view_size) 3200 { 3201 if (view == NULL) 3202 return true; 3203 3204 const elfcpp::Rela<size, true> rela(preloc); 3205 unsigned int r_type = elfcpp::elf_r_type<size>(rela.get_r_info()); 3206 const Sized_relobj_file<size, true>* object = relinfo->object; 3207 3208 // Pick the value to use for symbols defined in the PLT. 3209 Symbol_value<size> symval; 3210 if (gsym != NULL 3211 && gsym->use_plt_offset(Scan::get_reference_flags(r_type))) 3212 { 3213 symval.set_output_value(target->plt_address_for_global(gsym)); 3214 psymval = &symval; 3215 } 3216 else if (gsym == NULL && psymval->is_ifunc_symbol()) 3217 { 3218 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 3219 if (object->local_has_plt_offset(r_sym)) 3220 { 3221 symval.set_output_value(target->plt_address_for_local(object, r_sym)); 3222 psymval = &symval; 3223 } 3224 } 3225 3226 const elfcpp::Elf_Xword addend = rela.get_r_addend(); 3227 3228 typename elfcpp::Elf_types<size>::Elf_Addr value = 0; 3229 3230 switch (r_type) 3231 { 3232 case elfcpp::R_390_PLT64: 3233 case elfcpp::R_390_PLT32: 3234 case elfcpp::R_390_PLT32DBL: 3235 case elfcpp::R_390_PLT24DBL: 3236 case elfcpp::R_390_PLT16DBL: 3237 case elfcpp::R_390_PLT12DBL: 3238 gold_assert(gsym == NULL 3239 || gsym->has_plt_offset() 3240 || gsym->final_value_is_known() 3241 || (gsym->is_defined() 3242 && !gsym->is_from_dynobj() 3243 && !gsym->is_preemptible())); 3244 // fallthru 3245 case elfcpp::R_390_8: 3246 case elfcpp::R_390_12: 3247 case elfcpp::R_390_16: 3248 case elfcpp::R_390_20: 3249 case elfcpp::R_390_32: 3250 case elfcpp::R_390_64: 3251 case elfcpp::R_390_PC16: 3252 case elfcpp::R_390_PC32: 3253 case elfcpp::R_390_PC64: 3254 case elfcpp::R_390_PC32DBL: 3255 case elfcpp::R_390_PC24DBL: 3256 case elfcpp::R_390_PC16DBL: 3257 case elfcpp::R_390_PC12DBL: 3258 value = psymval->value(object, addend); 3259 break; 3260 3261 case elfcpp::R_390_GOTPC: 3262 case elfcpp::R_390_GOTPCDBL: 3263 gold_assert(gsym != NULL); 3264 value = target->got_address() + addend; 3265 break; 3266 3267 case elfcpp::R_390_PLTOFF64: 3268 case elfcpp::R_390_PLTOFF32: 3269 case elfcpp::R_390_PLTOFF16: 3270 gold_assert(gsym == NULL 3271 || gsym->has_plt_offset() 3272 || gsym->final_value_is_known()); 3273 // fallthru 3274 case elfcpp::R_390_GOTOFF64: 3275 case elfcpp::R_390_GOTOFF32: 3276 case elfcpp::R_390_GOTOFF16: 3277 value = (psymval->value(object, addend) 3278 - target->got_address()); 3279 break; 3280 3281 case elfcpp::R_390_GOT12: 3282 case elfcpp::R_390_GOT16: 3283 case elfcpp::R_390_GOT20: 3284 case elfcpp::R_390_GOT32: 3285 case elfcpp::R_390_GOT64: 3286 case elfcpp::R_390_GOTENT: 3287 case elfcpp::R_390_GOTPLT12: 3288 case elfcpp::R_390_GOTPLT16: 3289 case elfcpp::R_390_GOTPLT20: 3290 case elfcpp::R_390_GOTPLT32: 3291 case elfcpp::R_390_GOTPLT64: 3292 case elfcpp::R_390_GOTPLTENT: 3293 { 3294 unsigned int got_offset = 0; 3295 if (gsym != NULL) 3296 { 3297 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD)); 3298 got_offset = gsym->got_offset(GOT_TYPE_STANDARD); 3299 } 3300 else 3301 { 3302 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 3303 gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD)); 3304 got_offset = object->local_got_offset(r_sym, GOT_TYPE_STANDARD); 3305 } 3306 value = got_offset + target->got_main_offset() + addend; 3307 } 3308 break; 3309 3310 // These are initial tls relocs, which are expected when linking 3311 case elfcpp::R_390_TLS_LOAD: 3312 case elfcpp::R_390_TLS_GDCALL: // Global-dynamic 3313 case elfcpp::R_390_TLS_GD32: 3314 case elfcpp::R_390_TLS_GD64: 3315 case elfcpp::R_390_TLS_LDCALL: // Local-dynamic 3316 case elfcpp::R_390_TLS_LDM32: 3317 case elfcpp::R_390_TLS_LDM64: 3318 case elfcpp::R_390_TLS_LDO32: 3319 case elfcpp::R_390_TLS_LDO64: 3320 case elfcpp::R_390_TLS_GOTIE12: // Initial-exec 3321 case elfcpp::R_390_TLS_GOTIE20: 3322 case elfcpp::R_390_TLS_GOTIE32: 3323 case elfcpp::R_390_TLS_GOTIE64: 3324 case elfcpp::R_390_TLS_IE32: 3325 case elfcpp::R_390_TLS_IE64: 3326 case elfcpp::R_390_TLS_IEENT: 3327 case elfcpp::R_390_TLS_LE32: // Local-exec 3328 case elfcpp::R_390_TLS_LE64: 3329 value = this->relocate_tls(relinfo, target, relnum, rela, r_type, gsym, psymval, 3330 view, view_size); 3331 break; 3332 3333 default: 3334 break; 3335 } 3336 3337 typename S390_relocate_functions<size>::Status status 3338 = S390_relocate_functions<size>::STATUS_OK; 3339 3340 switch (r_type) 3341 { 3342 case elfcpp::R_390_NONE: 3343 case elfcpp::R_390_GNU_VTINHERIT: 3344 case elfcpp::R_390_GNU_VTENTRY: 3345 case elfcpp::R_390_TLS_GDCALL: 3346 case elfcpp::R_390_TLS_LDCALL: 3347 case elfcpp::R_390_TLS_LOAD: 3348 break; 3349 3350 case elfcpp::R_390_64: 3351 case elfcpp::R_390_GOT64: 3352 case elfcpp::R_390_GOTPLT64: 3353 case elfcpp::R_390_PLTOFF64: 3354 case elfcpp::R_390_GOTOFF64: 3355 case elfcpp::R_390_TLS_GD64: 3356 case elfcpp::R_390_TLS_LDM64: 3357 case elfcpp::R_390_TLS_LDO64: 3358 case elfcpp::R_390_TLS_GOTIE64: 3359 case elfcpp::R_390_TLS_IE64: 3360 case elfcpp::R_390_TLS_LE64: 3361 Relocate_functions<size, true>::rela64(view, value, 0); 3362 break; 3363 3364 case elfcpp::R_390_32: 3365 case elfcpp::R_390_GOT32: 3366 case elfcpp::R_390_GOTPLT32: 3367 case elfcpp::R_390_PLTOFF32: 3368 case elfcpp::R_390_GOTOFF32: 3369 case elfcpp::R_390_TLS_GD32: 3370 case elfcpp::R_390_TLS_LDM32: 3371 case elfcpp::R_390_TLS_LDO32: 3372 case elfcpp::R_390_TLS_GOTIE32: 3373 case elfcpp::R_390_TLS_IE32: 3374 case elfcpp::R_390_TLS_LE32: 3375 Relocate_functions<size, true>::rela32(view, value, 0); 3376 break; 3377 3378 case elfcpp::R_390_20: 3379 case elfcpp::R_390_GOT20: 3380 case elfcpp::R_390_GOTPLT20: 3381 case elfcpp::R_390_TLS_GOTIE20: 3382 status = S390_relocate_functions<size>::rela20(view, value); 3383 break; 3384 3385 case elfcpp::R_390_16: 3386 case elfcpp::R_390_GOT16: 3387 case elfcpp::R_390_GOTPLT16: 3388 case elfcpp::R_390_PLTOFF16: 3389 case elfcpp::R_390_GOTOFF16: 3390 status = S390_relocate_functions<size>::rela16(view, value); 3391 break; 3392 3393 case elfcpp::R_390_12: 3394 case elfcpp::R_390_GOT12: 3395 case elfcpp::R_390_GOTPLT12: 3396 case elfcpp::R_390_TLS_GOTIE12: 3397 status = S390_relocate_functions<size>::rela12(view, value); 3398 break; 3399 3400 case elfcpp::R_390_8: 3401 Relocate_functions<size, true>::rela8(view, value, 0); 3402 break; 3403 3404 case elfcpp::R_390_PC16: 3405 Relocate_functions<size, true>::pcrela16(view, value, 0, 3406 address); 3407 break; 3408 3409 case elfcpp::R_390_PLT64: 3410 case elfcpp::R_390_PC64: 3411 Relocate_functions<size, true>::pcrela64(view, value, 0, address); 3412 break; 3413 3414 case elfcpp::R_390_PLT32: 3415 case elfcpp::R_390_PC32: 3416 case elfcpp::R_390_GOTPC: 3417 Relocate_functions<size, true>::pcrela32(view, value, 0, address); 3418 break; 3419 3420 case elfcpp::R_390_PLT32DBL: 3421 case elfcpp::R_390_PC32DBL: 3422 case elfcpp::R_390_GOTPCDBL: 3423 status = S390_relocate_functions<size>::pcrela32dbl(view, value, address); 3424 break; 3425 3426 case elfcpp::R_390_PLT24DBL: 3427 case elfcpp::R_390_PC24DBL: 3428 status = S390_relocate_functions<size>::pcrela24dbl(view, value, address); 3429 break; 3430 3431 case elfcpp::R_390_PLT16DBL: 3432 case elfcpp::R_390_PC16DBL: 3433 status = S390_relocate_functions<size>::pcrela16dbl(view, value, address); 3434 break; 3435 3436 case elfcpp::R_390_PLT12DBL: 3437 case elfcpp::R_390_PC12DBL: 3438 status = S390_relocate_functions<size>::pcrela12dbl(view, value, address); 3439 break; 3440 3441 case elfcpp::R_390_GOTENT: 3442 case elfcpp::R_390_GOTPLTENT: 3443 case elfcpp::R_390_TLS_IEENT: 3444 value += target->got_address(); 3445 status = S390_relocate_functions<size>::pcrela32dbl(view, value, address); 3446 break; 3447 3448 case elfcpp::R_390_COPY: 3449 case elfcpp::R_390_GLOB_DAT: 3450 case elfcpp::R_390_JMP_SLOT: 3451 case elfcpp::R_390_RELATIVE: 3452 case elfcpp::R_390_IRELATIVE: 3453 // These are outstanding tls relocs, which are unexpected when linking 3454 case elfcpp::R_390_TLS_TPOFF: 3455 case elfcpp::R_390_TLS_DTPMOD: 3456 case elfcpp::R_390_TLS_DTPOFF: 3457 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3458 _("unexpected reloc %u in object file"), 3459 r_type); 3460 break; 3461 3462 default: 3463 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3464 _("unsupported reloc %u"), 3465 r_type); 3466 break; 3467 } 3468 3469 if (status != S390_relocate_functions<size>::STATUS_OK) 3470 { 3471 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3472 _("relocation overflow")); 3473 } 3474 3475 return true; 3476 } 3477 3478 // Perform a TLS relocation. 3479 3480 template<int size> 3481 inline typename elfcpp::Elf_types<size>::Elf_Addr 3482 Target_s390<size>::Relocate::relocate_tls( 3483 const Relocate_info<size, true>* relinfo, 3484 Target_s390<size>* target, 3485 size_t relnum, 3486 const elfcpp::Rela<size, true>& rela, 3487 unsigned int r_type, 3488 const Sized_symbol<size>* gsym, 3489 const Symbol_value<size>* psymval, 3490 unsigned char* view, 3491 section_size_type view_size) 3492 { 3493 Output_segment* tls_segment = relinfo->layout->tls_segment(); 3494 3495 const Sized_relobj_file<size, true>* object = relinfo->object; 3496 const elfcpp::Elf_Xword addend = rela.get_r_addend(); 3497 elfcpp::Shdr<size, true> data_shdr(relinfo->data_shdr); 3498 bool is_allocatable = (data_shdr.get_sh_flags() & elfcpp::SHF_ALLOC) != 0; 3499 3500 typename elfcpp::Elf_types<size>::Elf_Addr value 3501 = psymval->value(relinfo->object, addend); 3502 3503 const bool is_final = (gsym == NULL 3504 ? !parameters->options().shared() 3505 : gsym->final_value_is_known()); 3506 tls::Tls_optimization optimized_type 3507 = Target_s390<size>::optimize_tls_reloc(is_final, r_type); 3508 switch (r_type) 3509 { 3510 case elfcpp::R_390_TLS_GDCALL: // Global-dynamic marker 3511 if (optimized_type == tls::TLSOPT_TO_LE) 3512 { 3513 if (tls_segment == NULL) 3514 { 3515 gold_assert(parameters->errors()->error_count() > 0 3516 || issue_undefined_symbol_error(gsym)); 3517 return 0; 3518 } 3519 this->tls_gd_to_le(relinfo, relnum, rela, view, view_size); 3520 break; 3521 } 3522 else 3523 { 3524 if (optimized_type == tls::TLSOPT_TO_IE) 3525 { 3526 this->tls_gd_to_ie(relinfo, relnum, rela, view, view_size); 3527 break; 3528 } 3529 else if (optimized_type == tls::TLSOPT_NONE) 3530 { 3531 break; 3532 } 3533 } 3534 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3535 _("unsupported reloc %u"), r_type); 3536 break; 3537 3538 case elfcpp::R_390_TLS_GD32: // Global-dynamic 3539 case elfcpp::R_390_TLS_GD64: 3540 if (optimized_type == tls::TLSOPT_TO_LE) 3541 { 3542 if (tls_segment == NULL) 3543 { 3544 gold_assert(parameters->errors()->error_count() > 0 3545 || issue_undefined_symbol_error(gsym)); 3546 return 0; 3547 } 3548 return value - tls_segment->memsz(); 3549 } 3550 else 3551 { 3552 unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE 3553 ? GOT_TYPE_TLS_OFFSET 3554 : GOT_TYPE_TLS_PAIR); 3555 if (gsym != NULL) 3556 { 3557 gold_assert(gsym->has_got_offset(got_type)); 3558 return (gsym->got_offset(got_type) 3559 + target->got_main_offset() 3560 + addend); 3561 } 3562 else 3563 { 3564 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 3565 gold_assert(object->local_has_got_offset(r_sym, got_type)); 3566 return (object->local_got_offset(r_sym, got_type) 3567 + target->got_main_offset() 3568 + addend); 3569 } 3570 } 3571 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3572 _("unsupported reloc %u"), r_type); 3573 break; 3574 3575 case elfcpp::R_390_TLS_LDCALL: // Local-dynamic marker 3576 // This is a marker relocation. If the sequence is being turned to LE, 3577 // we modify the instruction, otherwise the instruction is untouched. 3578 if (optimized_type == tls::TLSOPT_TO_LE) 3579 { 3580 if (tls_segment == NULL) 3581 { 3582 gold_assert(parameters->errors()->error_count() > 0 3583 || issue_undefined_symbol_error(gsym)); 3584 return 0; 3585 } 3586 this->tls_ld_to_le(relinfo, relnum, rela, view, view_size); 3587 break; 3588 } 3589 else if (optimized_type == tls::TLSOPT_NONE) 3590 { 3591 break; 3592 } 3593 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3594 _("unsupported reloc %u"), r_type); 3595 break; 3596 3597 case elfcpp::R_390_TLS_LDM32: // Local-dynamic module 3598 case elfcpp::R_390_TLS_LDM64: 3599 if (optimized_type == tls::TLSOPT_TO_LE) 3600 { 3601 if (tls_segment == NULL) 3602 { 3603 gold_assert(parameters->errors()->error_count() > 0 3604 || issue_undefined_symbol_error(gsym)); 3605 return 0; 3606 } 3607 // Doesn't matter what we fill it with - it's going to be unused. 3608 return 0; 3609 } 3610 else if (optimized_type == tls::TLSOPT_NONE) 3611 { 3612 // Relocate the field with the offset of the GOT entry for 3613 // the module index. 3614 return (target->got_mod_index_entry(NULL, NULL, NULL) 3615 + addend 3616 + target->got_main_offset()); 3617 } 3618 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3619 _("unsupported reloc %u"), r_type); 3620 break; 3621 3622 case elfcpp::R_390_TLS_LDO32: // Local-dynamic offset 3623 case elfcpp::R_390_TLS_LDO64: 3624 // This relocation type is used in debugging information. 3625 // In that case we need to not optimize the value. If the 3626 // section is not allocatable, then we assume we should not 3627 // optimize this reloc. 3628 if (optimized_type == tls::TLSOPT_TO_LE && is_allocatable) 3629 { 3630 if (tls_segment == NULL) 3631 { 3632 gold_assert(parameters->errors()->error_count() > 0 3633 || issue_undefined_symbol_error(gsym)); 3634 return 0; 3635 } 3636 value -= tls_segment->memsz(); 3637 } 3638 return value; 3639 3640 case elfcpp::R_390_TLS_LOAD: // Initial-exec marker 3641 // This is a marker relocation. If the sequence is being turned to LE, 3642 // we modify the instruction, otherwise the instruction is untouched. 3643 if (gsym != NULL 3644 && gsym->is_undefined() 3645 && parameters->options().output_is_executable()) 3646 { 3647 Target_s390<size>::Relocate::tls_ie_to_le(relinfo, relnum, 3648 rela, view, 3649 view_size); 3650 break; 3651 } 3652 else if (optimized_type == tls::TLSOPT_TO_LE) 3653 { 3654 if (tls_segment == NULL) 3655 { 3656 gold_assert(parameters->errors()->error_count() > 0 3657 || issue_undefined_symbol_error(gsym)); 3658 return 0; 3659 } 3660 Target_s390<size>::Relocate::tls_ie_to_le(relinfo, relnum, 3661 rela, view, 3662 view_size); 3663 break; 3664 } 3665 else if (optimized_type == tls::TLSOPT_NONE) 3666 { 3667 break; 3668 } 3669 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3670 _("unsupported reloc type %u"), 3671 r_type); 3672 break; 3673 3674 case elfcpp::R_390_TLS_GOTIE12: // Initial-exec, not optimizable 3675 case elfcpp::R_390_TLS_GOTIE20: 3676 case elfcpp::R_390_TLS_IEENT: 3677 case elfcpp::R_390_TLS_GOTIE32: // Initial-exec, optimizable 3678 case elfcpp::R_390_TLS_GOTIE64: 3679 case elfcpp::R_390_TLS_IE32: 3680 case elfcpp::R_390_TLS_IE64: 3681 if (gsym != NULL 3682 && gsym->is_undefined() 3683 && parameters->options().output_is_executable() 3684 // These three cannot be optimized to LE, no matter what 3685 && r_type != elfcpp::R_390_TLS_GOTIE12 3686 && r_type != elfcpp::R_390_TLS_GOTIE20 3687 && r_type != elfcpp::R_390_TLS_IEENT) 3688 { 3689 return value; 3690 } 3691 else if (optimized_type == tls::TLSOPT_TO_LE) 3692 { 3693 if (tls_segment == NULL) 3694 { 3695 gold_assert(parameters->errors()->error_count() > 0 3696 || issue_undefined_symbol_error(gsym)); 3697 return 0; 3698 } 3699 return value - tls_segment->memsz(); 3700 } 3701 else if (optimized_type == tls::TLSOPT_NONE) 3702 { 3703 // Relocate the field with the offset of the GOT entry for 3704 // the tp-relative offset of the symbol. 3705 unsigned int got_offset; 3706 if (gsym != NULL) 3707 { 3708 gold_assert(gsym->has_got_offset(GOT_TYPE_TLS_OFFSET)); 3709 got_offset = gsym->got_offset(GOT_TYPE_TLS_OFFSET); 3710 } 3711 else 3712 { 3713 unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info()); 3714 gold_assert(object->local_has_got_offset(r_sym, 3715 GOT_TYPE_TLS_OFFSET)); 3716 got_offset = object->local_got_offset(r_sym, GOT_TYPE_TLS_OFFSET); 3717 } 3718 got_offset += target->got_main_offset(); 3719 if (r_type == elfcpp::R_390_TLS_IE32 3720 || r_type == elfcpp::R_390_TLS_IE64) 3721 return target->got_address() + got_offset + addend; 3722 else 3723 return got_offset + addend; 3724 } 3725 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3726 _("unsupported reloc type %u"), 3727 r_type); 3728 break; 3729 3730 case elfcpp::R_390_TLS_LE32: // Local-exec 3731 case elfcpp::R_390_TLS_LE64: 3732 if (tls_segment == NULL) 3733 { 3734 gold_assert(parameters->errors()->error_count() > 0 3735 || issue_undefined_symbol_error(gsym)); 3736 return 0; 3737 } 3738 return value - tls_segment->memsz(); 3739 } 3740 return 0; 3741 } 3742 3743 // Do a relocation in which we convert a TLS General-Dynamic to an 3744 // Initial-Exec. 3745 3746 template<int size> 3747 inline void 3748 Target_s390<size>::Relocate::tls_gd_to_ie( 3749 const Relocate_info<size, true>* relinfo, 3750 size_t relnum, 3751 const elfcpp::Rela<size, true>& rela, 3752 unsigned char* view, 3753 section_size_type view_size) 3754 { 3755 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4); 3756 if (view[0] == 0x4d) 3757 { 3758 // bas, don't care about details 3759 // Change to l %r2, 0(%r2, %r12) 3760 view[0] = 0x58; 3761 view[1] = 0x22; 3762 view[2] = 0xc0; 3763 view[3] = 0x00; 3764 return; 3765 } 3766 else if (view[0] == 0xc0) 3767 { 3768 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 6); 3769 // brasl %r14, __tls_get_offset@plt 3770 if (view[1] == 0xe5) 3771 { 3772 // Change to l/lg %r2, 0(%r2, %r12) 3773 // There was a PLT32DBL reloc at the last 4 bytes, overwrite its result. 3774 if (size == 32) 3775 { 3776 // l 3777 view[0] = 0x58; 3778 view[1] = 0x22; 3779 view[2] = 0xc0; 3780 view[3] = 0x00; 3781 // nop 3782 view[4] = 0x07; 3783 view[5] = 0x07; 3784 } 3785 else 3786 { 3787 // lg 3788 view[0] = 0xe3; 3789 view[1] = 0x22; 3790 view[2] = 0xc0; 3791 view[3] = 0; 3792 view[4] = 0; 3793 view[5] = 0x04; 3794 } 3795 return; 3796 } 3797 } 3798 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3799 _("unsupported op for GD to IE")); 3800 } 3801 3802 // Do a relocation in which we convert a TLS General-Dynamic to a 3803 // Local-Exec. 3804 3805 template<int size> 3806 inline void 3807 Target_s390<size>::Relocate::tls_gd_to_le( 3808 const Relocate_info<size, true>* relinfo, 3809 size_t relnum, 3810 const elfcpp::Rela<size, true>& rela, 3811 unsigned char* view, 3812 section_size_type view_size) 3813 { 3814 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 2); 3815 if (view[0] == 0x0d) 3816 { 3817 // basr, change to nop 3818 view[0] = 0x07; 3819 view[1] = 0x07; 3820 } 3821 else if (view[0] == 0x4d) 3822 { 3823 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4); 3824 // bas, don't care about details, change to nop 3825 view[0] = 0x47; 3826 view[1] = 0; 3827 view[2] = 0; 3828 view[3] = 0; 3829 return; 3830 } 3831 else if (view[0] == 0xc0) 3832 { 3833 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 6); 3834 // brasl %r14, __tls_get_offset@plt 3835 if (view[1] == 0xe5) 3836 { 3837 // Change to nop jump. There was a PLT32DBL reloc at the last 3838 // 4 bytes, overwrite its result. 3839 view[1] = 0x04; 3840 view[2] = 0; 3841 view[3] = 0; 3842 view[4] = 0; 3843 view[5] = 0; 3844 return; 3845 } 3846 } 3847 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3848 _("unsupported op for GD to LE")); 3849 } 3850 3851 template<int size> 3852 inline void 3853 Target_s390<size>::Relocate::tls_ld_to_le( 3854 const Relocate_info<size, true>* relinfo, 3855 size_t relnum, 3856 const elfcpp::Rela<size, true>& rela, 3857 unsigned char* view, 3858 section_size_type view_size) 3859 { 3860 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4); 3861 3862 if (view[0] == 0x0d) 3863 { 3864 // basr, change to nop 3865 view[0] = 0x07; 3866 view[1] = 0x07; 3867 } 3868 else if (view[0] == 0x4d) 3869 { 3870 // bas, don't care about details, change to nop 3871 view[0] = 0x47; 3872 view[1] = 0; 3873 view[2] = 0; 3874 view[3] = 0; 3875 return; 3876 } 3877 else if (view[0] == 0xc0) 3878 { 3879 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 6); 3880 // brasl %r14, __tls_get_offset@plt 3881 if (view[1] == 0xe5) 3882 { 3883 // Change to nop jump. There was a PLT32DBL reloc at the last 3884 // 4 bytes, overwrite its result. 3885 view[1] = 0x04; 3886 view[2] = 0; 3887 view[3] = 0; 3888 view[4] = 0; 3889 view[5] = 0; 3890 return; 3891 } 3892 } 3893 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3894 _("unsupported op for LD to LE")); 3895 } 3896 3897 // Do a relocation in which we convert a TLS Initial-Exec to a 3898 // Local-Exec. 3899 3900 template<int size> 3901 inline void 3902 Target_s390<size>::Relocate::tls_ie_to_le( 3903 const Relocate_info<size, true>* relinfo, 3904 size_t relnum, 3905 const elfcpp::Rela<size, true>& rela, 3906 unsigned char* view, 3907 section_size_type view_size) 3908 { 3909 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 4); 3910 3911 if (view[0] == 0x58) 3912 { 3913 // l %rX, 0(%rY) or l %rX, 0(%rY, %r12) 3914 if ((view[2] & 0x0f) != 0 || view[3] != 0) 3915 goto err; 3916 int rx = view[1] >> 4 & 0xf; 3917 int ry = view[1] & 0xf; 3918 int rz = view[2] >> 4 & 0xf; 3919 if (rz == 0) 3920 { 3921 } 3922 else if (ry == 0) 3923 { 3924 ry = rz; 3925 } 3926 else if (rz == 12) 3927 { 3928 } 3929 else if (ry == 12) 3930 { 3931 ry = rz; 3932 } 3933 else 3934 goto err; 3935 // to lr %rX, $rY 3936 view[0] = 0x18; 3937 view[1] = rx << 4 | ry; 3938 // and insert a nop 3939 view[2] = 0x07; 3940 view[3] = 0x00; 3941 } 3942 else if (view[0] == 0xe3) 3943 { 3944 tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 6); 3945 // lg %rX, 0(%rY) or lg %rX, 0(%rY, %r12) 3946 if ((view[2] & 0x0f) != 0 || 3947 view[3] != 0 || 3948 view[4] != 0 || 3949 view[5] != 0x04) 3950 goto err; 3951 int rx = view[1] >> 4 & 0xf; 3952 int ry = view[1] & 0xf; 3953 int rz = view[2] >> 4 & 0xf; 3954 if (rz == 0) 3955 { 3956 } 3957 else if (ry == 0) 3958 { 3959 ry = rz; 3960 } 3961 else if (rz == 12) 3962 { 3963 } 3964 else if (ry == 12) 3965 { 3966 ry = rz; 3967 } 3968 else 3969 goto err; 3970 // to sllg %rX, $rY, 0 3971 view[0] = 0xeb; 3972 view[1] = rx << 4 | ry; 3973 view[2] = 0x00; 3974 view[3] = 0x00; 3975 view[4] = 0x00; 3976 view[5] = 0x0d; 3977 } 3978 else 3979 { 3980 err: 3981 gold_error_at_location(relinfo, relnum, rela.get_r_offset(), 3982 _("unsupported op for IE to LE")); 3983 } 3984 } 3985 3986 // Scan relocations for a section. 3987 3988 template<int size> 3989 void 3990 Target_s390<size>::scan_relocs(Symbol_table* symtab, 3991 Layout* layout, 3992 Sized_relobj_file<size, true>* object, 3993 unsigned int data_shndx, 3994 unsigned int sh_type, 3995 const unsigned char* prelocs, 3996 size_t reloc_count, 3997 Output_section* output_section, 3998 bool needs_special_offset_handling, 3999 size_t local_symbol_count, 4000 const unsigned char* plocal_symbols) 4001 { 4002 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, true> 4003 Classify_reloc; 4004 4005 if (sh_type == elfcpp::SHT_REL) 4006 { 4007 gold_error(_("%s: unsupported REL reloc section"), 4008 object->name().c_str()); 4009 return; 4010 } 4011 4012 gold::scan_relocs<size, true, Target_s390<size>, Scan, Classify_reloc>( 4013 symtab, 4014 layout, 4015 this, 4016 object, 4017 data_shndx, 4018 prelocs, 4019 reloc_count, 4020 output_section, 4021 needs_special_offset_handling, 4022 local_symbol_count, 4023 plocal_symbols); 4024 } 4025 4026 // Finalize the sections. 4027 4028 template<int size> 4029 void 4030 Target_s390<size>::do_finalize_sections( 4031 Layout* layout, 4032 const Input_objects*, 4033 Symbol_table* symtab) 4034 { 4035 const Reloc_section* rel_plt = (this->plt_ == NULL 4036 ? NULL 4037 : this->plt_->rela_plt()); 4038 layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt, 4039 this->rela_dyn_, true, size == 32); 4040 4041 this->layout_ = layout; 4042 4043 // Emit any relocs we saved in an attempt to avoid generating COPY 4044 // relocs. 4045 if (this->copy_relocs_.any_saved_relocs()) 4046 this->copy_relocs_.emit(this->rela_dyn_section(layout)); 4047 4048 // Set the size of the _GLOBAL_OFFSET_TABLE_ symbol to the size of 4049 // the .got section. 4050 Symbol* sym = this->global_offset_table_; 4051 if (sym != NULL) 4052 { 4053 uint64_t data_size = this->got_->current_data_size(); 4054 symtab->get_sized_symbol<size>(sym)->set_symsize(data_size); 4055 } 4056 4057 if (parameters->doing_static_link() 4058 && (this->plt_ == NULL || !this->plt_->has_irelative_section())) 4059 { 4060 // If linking statically, make sure that the __rela_iplt symbols 4061 // were defined if necessary, even if we didn't create a PLT. 4062 static const Define_symbol_in_segment syms[] = 4063 { 4064 { 4065 "__rela_iplt_start", // name 4066 elfcpp::PT_LOAD, // segment_type 4067 elfcpp::PF_W, // segment_flags_set 4068 elfcpp::PF(0), // segment_flags_clear 4069 0, // value 4070 0, // size 4071 elfcpp::STT_NOTYPE, // type 4072 elfcpp::STB_GLOBAL, // binding 4073 elfcpp::STV_HIDDEN, // visibility 4074 0, // nonvis 4075 Symbol::SEGMENT_START, // offset_from_base 4076 true // only_if_ref 4077 }, 4078 { 4079 "__rela_iplt_end", // name 4080 elfcpp::PT_LOAD, // segment_type 4081 elfcpp::PF_W, // segment_flags_set 4082 elfcpp::PF(0), // segment_flags_clear 4083 0, // value 4084 0, // size 4085 elfcpp::STT_NOTYPE, // type 4086 elfcpp::STB_GLOBAL, // binding 4087 elfcpp::STV_HIDDEN, // visibility 4088 0, // nonvis 4089 Symbol::SEGMENT_START, // offset_from_base 4090 true // only_if_ref 4091 } 4092 }; 4093 4094 symtab->define_symbols(layout, 2, syms, 4095 layout->script_options()->saw_sections_clause()); 4096 } 4097 } 4098 4099 // Scan the relocs during a relocatable link. 4100 4101 template<int size> 4102 void 4103 Target_s390<size>::scan_relocatable_relocs( 4104 Symbol_table* symtab, 4105 Layout* layout, 4106 Sized_relobj_file<size, true>* object, 4107 unsigned int data_shndx, 4108 unsigned int sh_type, 4109 const unsigned char* prelocs, 4110 size_t reloc_count, 4111 Output_section* output_section, 4112 bool needs_special_offset_handling, 4113 size_t local_symbol_count, 4114 const unsigned char* plocal_symbols, 4115 Relocatable_relocs* rr) 4116 { 4117 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, true> 4118 Classify_reloc; 4119 typedef gold::Default_scan_relocatable_relocs<Classify_reloc> 4120 Scan_relocatable_relocs; 4121 4122 gold_assert(sh_type == elfcpp::SHT_RELA); 4123 4124 gold::scan_relocatable_relocs<size, true, Scan_relocatable_relocs>( 4125 symtab, 4126 layout, 4127 object, 4128 data_shndx, 4129 prelocs, 4130 reloc_count, 4131 output_section, 4132 needs_special_offset_handling, 4133 local_symbol_count, 4134 plocal_symbols, 4135 rr); 4136 } 4137 4138 // Scan the relocs for --emit-relocs. 4139 4140 template<int size> 4141 void 4142 Target_s390<size>::emit_relocs_scan( 4143 Symbol_table* symtab, 4144 Layout* layout, 4145 Sized_relobj_file<size, true>* object, 4146 unsigned int data_shndx, 4147 unsigned int sh_type, 4148 const unsigned char* prelocs, 4149 size_t reloc_count, 4150 Output_section* output_section, 4151 bool needs_special_offset_handling, 4152 size_t local_symbol_count, 4153 const unsigned char* plocal_syms, 4154 Relocatable_relocs* rr) 4155 { 4156 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, true> 4157 Classify_reloc; 4158 typedef gold::Default_emit_relocs_strategy<Classify_reloc> 4159 Emit_relocs_strategy; 4160 4161 gold_assert(sh_type == elfcpp::SHT_RELA); 4162 4163 gold::scan_relocatable_relocs<size, true, Emit_relocs_strategy>( 4164 symtab, 4165 layout, 4166 object, 4167 data_shndx, 4168 prelocs, 4169 reloc_count, 4170 output_section, 4171 needs_special_offset_handling, 4172 local_symbol_count, 4173 plocal_syms, 4174 rr); 4175 } 4176 4177 // Relocate a section during a relocatable link. 4178 4179 template<int size> 4180 void 4181 Target_s390<size>::relocate_relocs( 4182 const Relocate_info<size, true>* relinfo, 4183 unsigned int sh_type, 4184 const unsigned char* prelocs, 4185 size_t reloc_count, 4186 Output_section* output_section, 4187 typename elfcpp::Elf_types<size>::Elf_Off offset_in_output_section, 4188 unsigned char* view, 4189 typename elfcpp::Elf_types<size>::Elf_Addr view_address, 4190 section_size_type view_size, 4191 unsigned char* reloc_view, 4192 section_size_type reloc_view_size) 4193 { 4194 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, true> 4195 Classify_reloc; 4196 4197 gold_assert(sh_type == elfcpp::SHT_RELA); 4198 4199 gold::relocate_relocs<size, true, Classify_reloc>( 4200 relinfo, 4201 prelocs, 4202 reloc_count, 4203 output_section, 4204 offset_in_output_section, 4205 view, 4206 view_address, 4207 view_size, 4208 reloc_view, 4209 reloc_view_size); 4210 } 4211 4212 // Return the offset to use for the GOT_INDX'th got entry which is 4213 // for a local tls symbol specified by OBJECT, SYMNDX. 4214 template<int size> 4215 int64_t 4216 Target_s390<size>::do_tls_offset_for_local( 4217 const Relobj*, 4218 unsigned int, 4219 unsigned int) const 4220 { 4221 // The only way we can get called is when IEENT/GOTIE12/GOTIE20 4222 // couldn't be optimised to LE. 4223 Output_segment* tls_segment = layout_->tls_segment(); 4224 return -tls_segment->memsz(); 4225 } 4226 4227 // Return the offset to use for the GOT_INDX'th got entry which is 4228 // for global tls symbol GSYM. 4229 template<int size> 4230 int64_t 4231 Target_s390<size>::do_tls_offset_for_global( 4232 Symbol*, 4233 unsigned int) const 4234 { 4235 Output_segment* tls_segment = layout_->tls_segment(); 4236 return -tls_segment->memsz(); 4237 } 4238 4239 // Return the value to use for a dynamic which requires special 4240 // treatment. This is how we support equality comparisons of function 4241 // pointers across shared library boundaries, as described in the 4242 // processor specific ABI supplement. 4243 4244 template<int size> 4245 uint64_t 4246 Target_s390<size>::do_dynsym_value(const Symbol* gsym) const 4247 { 4248 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset()); 4249 return this->plt_address_for_global(gsym); 4250 } 4251 4252 // Return a string used to fill a code section with nops to take up 4253 // the specified length. 4254 4255 template<int size> 4256 std::string 4257 Target_s390<size>::do_code_fill(section_size_type length) const 4258 { 4259 if (length & 1) 4260 gold_warning(_("S/390 code fill of odd length requested")); 4261 return std::string(length, static_cast<char>(0x07)); 4262 } 4263 4264 // Return whether SYM should be treated as a call to a non-split 4265 // function. We don't want that to be true of a larl instruction 4266 // that merely loads its address. 4267 4268 template<int size> 4269 bool 4270 Target_s390<size>::do_is_call_to_non_split(const Symbol* sym, 4271 const unsigned char* preloc, 4272 const unsigned char* view, 4273 section_size_type view_size) const 4274 { 4275 if (sym->type() != elfcpp::STT_FUNC) 4276 return false; 4277 typename Reloc_types<elfcpp::SHT_RELA, size, true>::Reloc reloc(preloc); 4278 typename elfcpp::Elf_types<size>::Elf_WXword r_info 4279 = reloc.get_r_info(); 4280 unsigned int r_type = elfcpp::elf_r_type<size>(r_info); 4281 section_offset_type offset = reloc.get_r_offset(); 4282 switch (r_type) 4283 { 4284 // PLT refs always involve calling the function. 4285 case elfcpp::R_390_PLT12DBL: 4286 case elfcpp::R_390_PLT16DBL: 4287 case elfcpp::R_390_PLT24DBL: 4288 case elfcpp::R_390_PLT32: 4289 case elfcpp::R_390_PLT32DBL: 4290 case elfcpp::R_390_PLT64: 4291 case elfcpp::R_390_PLTOFF16: 4292 case elfcpp::R_390_PLTOFF32: 4293 case elfcpp::R_390_PLTOFF64: 4294 // Could be used for calls for -msmall-exec. 4295 case elfcpp::R_390_PC16DBL: 4296 return true; 4297 4298 // Tricky case. When used in a brasl, jg, and other branch instructions, 4299 // it's a call or a sibcall. However, when used in larl, it only loads 4300 // the function's address - not a call. 4301 case elfcpp::R_390_PC32DBL: 4302 { 4303 if (offset < 2 4304 || offset + 4 > static_cast<section_offset_type>(view_size)) 4305 { 4306 // Should not happen. 4307 gold_error(_("instruction with PC32DBL not wholly within section")); 4308 return false; 4309 } 4310 4311 uint8_t op0 = view[offset-2]; 4312 uint8_t op1 = view[offset-1] & 0xf; 4313 4314 // LARL 4315 if (op0 == 0xc0 && op1 == 0) 4316 return false; 4317 4318 // Otherwise, it's either a call instruction, a branch instruction 4319 // (used as a sibcall), or a data manipulation instruction (which 4320 // has no business being used on a function, and can be ignored). 4321 return true; 4322 } 4323 4324 // Otherwise, it's probably not a call. 4325 default: 4326 return false; 4327 } 4328 } 4329 4330 // Code sequences to match below. 4331 4332 template<int size> 4333 const unsigned char 4334 Target_s390<size>::ss_code_bras_8[] = { 4335 0xa7, 0x15, 0x00, 0x06, // bras %r1, .+0xc 4336 }; 4337 4338 template<int size> 4339 const unsigned char 4340 Target_s390<size>::ss_code_l_basr[] = { 4341 0x58, 0xe0, 0x10, 0x00, // l %r14, 0(%r1) 4342 0x58, 0x10, 0x10, 0x04, // l %r1, 4(%r1) 4343 0x0d, 0xee, // basr %r14, %r14 4344 }; 4345 4346 template<int size> 4347 const unsigned char 4348 Target_s390<size>::ss_code_a_basr[] = { 4349 0x18, 0xe1, // lr %r14, %r1 4350 0x5a, 0xe0, 0x10, 0x00, // a %r14, 0(%r1) 4351 0x5a, 0x10, 0x10, 0x04, // a %r1, 4(%r1) 4352 0x0d, 0xee, // basr %r14, %r14 4353 }; 4354 4355 template<int size> 4356 const unsigned char 4357 Target_s390<size>::ss_code_larl[] = { 4358 0xc0, 0x10, // larl %r1, ... 4359 }; 4360 4361 template<int size> 4362 const unsigned char 4363 Target_s390<size>::ss_code_brasl[] = { 4364 0xc0, 0xe5, // brasl %r14, ... 4365 }; 4366 4367 template<int size> 4368 const unsigned char 4369 Target_s390<size>::ss_code_jg[] = { 4370 0xc0, 0xf4, // jg ... 4371 }; 4372 4373 template<int size> 4374 const unsigned char 4375 Target_s390<size>::ss_code_jgl[] = { 4376 0xc0, 0x44, // jgl ... 4377 }; 4378 4379 template<> 4380 bool 4381 Target_s390<32>::ss_match_st_r14(unsigned char* view, 4382 section_size_type view_size, 4383 section_offset_type *offset) const 4384 { 4385 static const unsigned char ss_code_st_r14[] = { 4386 0x50, 0xe0, 0xf0, 0x04, // st %r14, 4(%r15) 4387 }; 4388 if (!this->match_view_u(view, view_size, *offset, ss_code_st_r14, 4389 sizeof ss_code_st_r14)) 4390 return false; 4391 *offset += sizeof ss_code_st_r14; 4392 return true; 4393 } 4394 4395 template<> 4396 bool 4397 Target_s390<64>::ss_match_st_r14(unsigned char* view, 4398 section_size_type view_size, 4399 section_offset_type *offset) const 4400 { 4401 static const unsigned char ss_code_st_r14[] = { 4402 0xe3, 0xe0, 0xf0, 0x08, 0x00, 0x24 // stg %r14, 8(%r15) 4403 }; 4404 if (!this->match_view_u(view, view_size, *offset, ss_code_st_r14, 4405 sizeof ss_code_st_r14)) 4406 return false; 4407 *offset += sizeof ss_code_st_r14; 4408 return true; 4409 } 4410 4411 template<> 4412 bool 4413 Target_s390<32>::ss_match_l_r14(unsigned char* view, 4414 section_size_type view_size, 4415 section_offset_type *offset) const 4416 { 4417 static const unsigned char ss_code_l_r14[] = { 4418 0x58, 0xe0, 0xf0, 0x04, // l %r14, 4(%r15) 4419 }; 4420 if (!this->match_view_u(view, view_size, *offset, ss_code_l_r14, 4421 sizeof ss_code_l_r14)) 4422 return false; 4423 *offset += sizeof ss_code_l_r14; 4424 return true; 4425 } 4426 4427 template<> 4428 bool 4429 Target_s390<64>::ss_match_l_r14(unsigned char* view, 4430 section_size_type view_size, 4431 section_offset_type *offset) const 4432 { 4433 static const unsigned char ss_code_l_r14[] = { 4434 0xe3, 0xe0, 0xf0, 0x08, 0x00, 0x04 // lg %r14, 8(%r15) 4435 }; 4436 if (!this->match_view_u(view, view_size, *offset, ss_code_l_r14, 4437 sizeof ss_code_l_r14)) 4438 return false; 4439 *offset += sizeof ss_code_l_r14; 4440 return true; 4441 } 4442 4443 template<int size> 4444 bool 4445 Target_s390<size>::ss_match_mcount(unsigned char* view, 4446 section_size_type view_size, 4447 section_offset_type *offset) const 4448 { 4449 // Match the mcount call sequence. 4450 section_offset_type myoff = *offset; 4451 4452 // First, look for the store instruction saving %r14. 4453 if (!this->ss_match_st_r14(view, view_size, &myoff)) 4454 return false; 4455 4456 // Now, param load and the actual call. 4457 if (this->match_view_u(view, view_size, myoff, ss_code_larl, 4458 sizeof ss_code_larl)) 4459 { 4460 myoff += sizeof ss_code_larl + 4; 4461 4462 // After larl, expect a brasl. 4463 if (!this->match_view_u(view, view_size, myoff, ss_code_brasl, 4464 sizeof ss_code_brasl)) 4465 return false; 4466 myoff += sizeof ss_code_brasl + 4; 4467 } 4468 else if (size == 32 && 4469 this->match_view_u(view, view_size, myoff, ss_code_bras_8, 4470 sizeof ss_code_bras_8)) 4471 { 4472 // The bras skips over a block of 8 bytes, loading its address 4473 // to %r1. 4474 myoff += sizeof ss_code_bras_8 + 8; 4475 4476 // Now, there are two sequences used for actual load and call, 4477 // absolute and PIC. 4478 if (this->match_view_u(view, view_size, myoff, ss_code_l_basr, 4479 sizeof ss_code_l_basr)) 4480 myoff += sizeof ss_code_l_basr; 4481 else if (this->match_view_u(view, view_size, myoff, ss_code_a_basr, 4482 sizeof ss_code_a_basr)) 4483 myoff += sizeof ss_code_a_basr; 4484 else 4485 return false; 4486 } 4487 else 4488 return false; 4489 4490 // Finally, a load bringing %r14 back. 4491 if (!this->ss_match_l_r14(view, view_size, &myoff)) 4492 return false; 4493 4494 // Found it. 4495 *offset = myoff; 4496 return true; 4497 } 4498 4499 template<> 4500 bool 4501 Target_s390<32>::ss_match_ear(unsigned char* view, 4502 section_size_type view_size, 4503 section_offset_type *offset) const 4504 { 4505 static const unsigned char ss_code_ear[] = { 4506 0xb2, 0x4f, 0x00, 0x10, // ear %r1, %a0 4507 }; 4508 if (!this->match_view_u(view, view_size, *offset, ss_code_ear, 4509 sizeof ss_code_ear)) 4510 return false; 4511 *offset += sizeof ss_code_ear; 4512 return true; 4513 } 4514 4515 template<> 4516 bool 4517 Target_s390<64>::ss_match_ear(unsigned char* view, 4518 section_size_type view_size, 4519 section_offset_type *offset) const 4520 { 4521 static const unsigned char ss_code_ear[] = { 4522 0xb2, 0x4f, 0x00, 0x10, // ear %r1, %a0 4523 0xeb, 0x11, 0x00, 0x20, 0x00, 0x0d, // sllg %r1,%r1,32 4524 0xb2, 0x4f, 0x00, 0x11, // ear %r1, %a1 4525 }; 4526 if (!this->match_view_u(view, view_size, *offset, ss_code_ear, 4527 sizeof ss_code_ear)) 4528 return false; 4529 *offset += sizeof ss_code_ear; 4530 return true; 4531 } 4532 4533 template<> 4534 bool 4535 Target_s390<32>::ss_match_c(unsigned char* view, 4536 section_size_type view_size, 4537 section_offset_type *offset) const 4538 { 4539 static const unsigned char ss_code_c[] = { 4540 0x59, 0xf0, 0x10, 0x20, // c %r15, 0x20(%r1) 4541 }; 4542 if (!this->match_view_u(view, view_size, *offset, ss_code_c, 4543 sizeof ss_code_c)) 4544 return false; 4545 *offset += sizeof ss_code_c; 4546 return true; 4547 } 4548 4549 template<> 4550 bool 4551 Target_s390<64>::ss_match_c(unsigned char* view, 4552 section_size_type view_size, 4553 section_offset_type *offset) const 4554 { 4555 static const unsigned char ss_code_c[] = { 4556 0xe3, 0xf0, 0x10, 0x38, 0x00, 0x20, // cg %r15, 0x38(%r1) 4557 }; 4558 if (!this->match_view_u(view, view_size, *offset, ss_code_c, 4559 sizeof ss_code_c)) 4560 return false; 4561 *offset += sizeof ss_code_c; 4562 return true; 4563 } 4564 4565 template<> 4566 bool 4567 Target_s390<32>::ss_match_l(unsigned char* view, 4568 section_size_type view_size, 4569 section_offset_type *offset, 4570 int *guard_reg) const 4571 { 4572 // l %guard_reg, 0x20(%r1) 4573 if (convert_to_section_size_type(*offset + 4) > view_size 4574 || view[*offset] != 0x58 4575 || (view[*offset + 1] & 0xf) != 0x0 4576 || view[*offset + 2] != 0x10 4577 || view[*offset + 3] != 0x20) 4578 return false; 4579 *offset += 4; 4580 *guard_reg = view[*offset + 1] >> 4 & 0xf; 4581 return true; 4582 } 4583 4584 template<> 4585 bool 4586 Target_s390<64>::ss_match_l(unsigned char* view, 4587 section_size_type view_size, 4588 section_offset_type *offset, 4589 int *guard_reg) const 4590 { 4591 // lg %guard_reg, 0x38(%r1) 4592 if (convert_to_section_size_type(*offset + 6) > view_size 4593 || view[*offset] != 0xe3 4594 || (view[*offset + 1] & 0xf) != 0x0 4595 || view[*offset + 2] != 0x10 4596 || view[*offset + 3] != 0x38 4597 || view[*offset + 4] != 0x00 4598 || view[*offset + 5] != 0x04) 4599 return false; 4600 *offset += 6; 4601 *guard_reg = view[*offset + 1] >> 4 & 0xf; 4602 return true; 4603 } 4604 4605 template<int size> 4606 bool 4607 Target_s390<size>::ss_match_ahi(unsigned char* view, 4608 section_size_type view_size, 4609 section_offset_type *offset, 4610 int guard_reg, 4611 uint32_t *arg) const 4612 { 4613 int op = size == 32 ? 0xa : 0xb; 4614 // a[g]hi %guard_reg, <arg> 4615 if (convert_to_section_size_type(*offset + 4) > view_size 4616 || view[*offset] != 0xa7 4617 || view[*offset + 1] != (guard_reg << 4 | op) 4618 // Disallow negative size. 4619 || view[*offset + 2] & 0x80) 4620 return false; 4621 *arg = elfcpp::Swap<16, true>::readval(view + *offset + 2); 4622 *offset += 4; 4623 return true; 4624 } 4625 4626 template<int size> 4627 bool 4628 Target_s390<size>::ss_match_alfi(unsigned char* view, 4629 section_size_type view_size, 4630 section_offset_type *offset, 4631 int guard_reg, 4632 uint32_t *arg) const 4633 { 4634 int op = size == 32 ? 0xb : 0xa; 4635 // al[g]fi %guard_reg, <arg> 4636 if (convert_to_section_size_type(*offset + 6) > view_size 4637 || view[*offset] != 0xc2 4638 || view[*offset + 1] != (guard_reg << 4 | op)) 4639 return false; 4640 *arg = elfcpp::Swap<32, true>::readval(view + *offset + 2); 4641 *offset += 6; 4642 return true; 4643 } 4644 4645 template<> 4646 bool 4647 Target_s390<32>::ss_match_cr(unsigned char* view, 4648 section_size_type view_size, 4649 section_offset_type *offset, 4650 int guard_reg) const 4651 { 4652 // cr %r15, %guard_reg 4653 if (convert_to_section_size_type(*offset + 2) > view_size 4654 || view[*offset] != 0x19 4655 || view[*offset + 1] != (0xf0 | guard_reg)) 4656 return false; 4657 *offset += 2; 4658 return true; 4659 } 4660 4661 template<> 4662 bool 4663 Target_s390<64>::ss_match_cr(unsigned char* view, 4664 section_size_type view_size, 4665 section_offset_type *offset, 4666 int guard_reg) const 4667 { 4668 // cgr %r15, %guard_reg 4669 if (convert_to_section_size_type(*offset + 4) > view_size 4670 || view[*offset] != 0xb9 4671 || view[*offset + 1] != 0x20 4672 || view[*offset + 2] != 0x00 4673 || view[*offset + 3] != (0xf0 | guard_reg)) 4674 return false; 4675 *offset += 4; 4676 return true; 4677 } 4678 4679 4680 // FNOFFSET in section SHNDX in OBJECT is the start of a function 4681 // compiled with -fsplit-stack. The function calls non-split-stack 4682 // code. We have to change the function so that it always ensures 4683 // that it has enough stack space to run some random function. 4684 4685 template<int size> 4686 void 4687 Target_s390<size>::do_calls_non_split(Relobj* object, unsigned int shndx, 4688 section_offset_type fnoffset, 4689 section_size_type, 4690 const unsigned char *prelocs, 4691 size_t reloc_count, 4692 unsigned char* view, 4693 section_size_type view_size, 4694 std::string*, 4695 std::string*) const 4696 { 4697 // true if there's a conditional call to __morestack in the function, 4698 // false if there's an unconditional one. 4699 bool conditional = false; 4700 // Offset of the byte after the compare insn, if conditional. 4701 section_offset_type cmpend = 0; 4702 // Type and immediate offset of the add instruction that adds frame size 4703 // to guard. 4704 enum { 4705 SS_ADD_NONE, 4706 SS_ADD_AHI, 4707 SS_ADD_ALFI, 4708 } fsadd_type = SS_ADD_NONE; 4709 section_offset_type fsadd_offset = 0; 4710 uint32_t fsadd_frame_size = 0; 4711 // Register used for loading guard. Usually r1, but can also be r0 or r2-r5. 4712 int guard_reg; 4713 // Offset of the conditional jump. 4714 section_offset_type jump_offset = 0; 4715 // Section view and offset of param block. 4716 section_offset_type param_offset = 0; 4717 unsigned char *param_view = 0; 4718 section_size_type param_view_size = 0; 4719 // Current position in function. 4720 section_offset_type curoffset = fnoffset; 4721 // And the position of split-stack prologue. 4722 section_offset_type ssoffset; 4723 // Frame size. 4724 typename elfcpp::Elf_types<size>::Elf_Addr frame_size; 4725 // Relocation parsing. 4726 typedef typename Reloc_types<elfcpp::SHT_RELA, size, true>::Reloc Reltype; 4727 const int reloc_size = Reloc_types<elfcpp::SHT_RELA, size, true>::reloc_size; 4728 const unsigned char *pr = prelocs; 4729 4730 // If the function was compiled with -pg, the profiling code may come before 4731 // the split-stack prologue. Skip it. 4732 4733 this->ss_match_mcount(view, view_size, &curoffset); 4734 ssoffset = curoffset; 4735 4736 // First, figure out if there's a conditional call by looking for the 4737 // extract-tp, add, cmp sequence. 4738 4739 if (this->ss_match_ear(view, view_size, &curoffset)) 4740 { 4741 // Found extract-tp, now look for an add and compare. 4742 conditional = true; 4743 if (this->ss_match_c(view, view_size, &curoffset)) 4744 { 4745 // Found a direct compare of stack pointer with the guard, 4746 // we're done here. 4747 } 4748 else if (this->ss_match_l(view, view_size, &curoffset, &guard_reg)) 4749 { 4750 // Found a load of guard to register, look for an add and compare. 4751 if (this->ss_match_ahi(view, view_size, &curoffset, guard_reg, 4752 &fsadd_frame_size)) 4753 { 4754 fsadd_type = SS_ADD_AHI; 4755 fsadd_offset = curoffset - 2; 4756 } 4757 else if (this->ss_match_alfi(view, view_size, &curoffset, guard_reg, 4758 &fsadd_frame_size)) 4759 { 4760 fsadd_type = SS_ADD_ALFI; 4761 fsadd_offset = curoffset - 4; 4762 } 4763 else 4764 { 4765 goto bad; 4766 } 4767 // Now, there has to be a compare. 4768 if (!this->ss_match_cr(view, view_size, &curoffset, guard_reg)) 4769 goto bad; 4770 } 4771 else 4772 { 4773 goto bad; 4774 } 4775 cmpend = curoffset; 4776 } 4777 4778 // Second, look for the call. 4779 if (!this->match_view_u(view, view_size, curoffset, ss_code_larl, 4780 sizeof ss_code_larl)) 4781 goto bad; 4782 curoffset += sizeof ss_code_larl; 4783 4784 // Find out larl's operand. It should be a local symbol in .rodata 4785 // section. 4786 for (size_t i = 0; i < reloc_count; ++i, pr += reloc_size) 4787 { 4788 Reltype reloc(pr); 4789 if (static_cast<section_offset_type>(reloc.get_r_offset()) 4790 == curoffset) 4791 { 4792 typename elfcpp::Elf_types<size>::Elf_WXword r_info 4793 = reloc.get_r_info(); 4794 unsigned int r_sym = elfcpp::elf_r_sym<size>(r_info); 4795 unsigned int r_type = elfcpp::elf_r_type<size>(r_info); 4796 if (r_type != elfcpp::R_390_PC32DBL) 4797 goto bad; 4798 if (r_sym >= object->local_symbol_count()) 4799 goto bad; 4800 Sized_relobj_file<size, true> *object_sized = 4801 static_cast<Sized_relobj_file<size, true> *>(object); 4802 const Symbol_value<size>* sym = object_sized->local_symbol(r_sym); 4803 bool param_shndx_ordinary; 4804 const unsigned int param_shndx = 4805 sym->input_shndx(¶m_shndx_ordinary); 4806 if (!param_shndx_ordinary) 4807 goto bad; 4808 param_offset = sym->input_value() + reloc.get_r_addend() - 2 4809 - object->output_section(param_shndx)->address() 4810 - object->output_section_offset(param_shndx); 4811 param_view = object->get_output_view(param_shndx, 4812 ¶m_view_size); 4813 break; 4814 } 4815 } 4816 4817 if (!param_view) 4818 goto bad; 4819 4820 curoffset += 4; 4821 4822 // Now, there has to be a jump to __morestack. 4823 jump_offset = curoffset; 4824 4825 if (this->match_view_u(view, view_size, curoffset, 4826 conditional ? ss_code_jgl : ss_code_jg, 4827 sizeof ss_code_jg)) 4828 curoffset += sizeof ss_code_jg; 4829 else 4830 goto bad; 4831 4832 curoffset += 4; 4833 4834 // Read the frame size. 4835 if (convert_to_section_size_type(param_offset + size / 8) > param_view_size) 4836 goto bad; 4837 frame_size = elfcpp::Swap<size, true>::readval(param_view + param_offset); 4838 4839 // Sanity check. 4840 if (fsadd_type != SS_ADD_NONE && fsadd_frame_size != frame_size) 4841 goto bad; 4842 4843 // Bump the frame size. 4844 frame_size += parameters->options().split_stack_adjust_size(); 4845 4846 // Store it to the param block. 4847 elfcpp::Swap<size, true>::writeval(param_view + param_offset, frame_size); 4848 4849 if (!conditional) 4850 { 4851 // If the call was already unconditional, we're done. 4852 } 4853 else if (frame_size <= 0xffffffff && fsadd_type == SS_ADD_ALFI) 4854 { 4855 // Using alfi to add the frame size, and it still fits. Adjust it. 4856 elfcpp::Swap_unaligned<32, true>::writeval(view + fsadd_offset, 4857 frame_size); 4858 } 4859 else 4860 { 4861 // We were either relying on the backoff area, or used ahi to load 4862 // frame size. This won't fly, as our new frame size is too large. 4863 // Convert the sequence to unconditional by nopping out the comparison, 4864 // and rewiring the jump. 4865 this->set_view_to_nop(view, view_size, ssoffset, cmpend - ssoffset); 4866 4867 // The jump is jgl, we'll mutate it to jg. 4868 view[jump_offset+1] = 0xf4; 4869 } 4870 4871 return; 4872 4873 bad: 4874 if (!object->has_no_split_stack()) 4875 object->error(_("failed to match split-stack sequence at " 4876 "section %u offset %0zx"), 4877 shndx, static_cast<size_t>(fnoffset)); 4878 } 4879 4880 // Relocate section data. 4881 4882 template<int size> 4883 void 4884 Target_s390<size>::relocate_section( 4885 const Relocate_info<size, true>* relinfo, 4886 unsigned int sh_type, 4887 const unsigned char* prelocs, 4888 size_t reloc_count, 4889 Output_section* output_section, 4890 bool needs_special_offset_handling, 4891 unsigned char* view, 4892 typename elfcpp::Elf_types<size>::Elf_Addr address, 4893 section_size_type view_size, 4894 const Reloc_symbol_changes* reloc_symbol_changes) 4895 { 4896 typedef gold::Default_classify_reloc<elfcpp::SHT_RELA, size, true> 4897 Classify_reloc; 4898 4899 gold_assert(sh_type == elfcpp::SHT_RELA); 4900 4901 gold::relocate_section<size, true, Target_s390<size>, Relocate, 4902 gold::Default_comdat_behavior, Classify_reloc>( 4903 relinfo, 4904 this, 4905 prelocs, 4906 reloc_count, 4907 output_section, 4908 needs_special_offset_handling, 4909 view, 4910 address, 4911 view_size, 4912 reloc_symbol_changes); 4913 } 4914 4915 // Apply an incremental relocation. Incremental relocations always refer 4916 // to global symbols. 4917 4918 template<int size> 4919 void 4920 Target_s390<size>::apply_relocation( 4921 const Relocate_info<size, true>* relinfo, 4922 typename elfcpp::Elf_types<size>::Elf_Addr r_offset, 4923 unsigned int r_type, 4924 typename elfcpp::Elf_types<size>::Elf_Swxword r_addend, 4925 const Symbol* gsym, 4926 unsigned char* view, 4927 typename elfcpp::Elf_types<size>::Elf_Addr address, 4928 section_size_type view_size) 4929 { 4930 gold::apply_relocation<size, true, Target_s390<size>, 4931 typename Target_s390<size>::Relocate>( 4932 relinfo, 4933 this, 4934 r_offset, 4935 r_type, 4936 r_addend, 4937 gsym, 4938 view, 4939 address, 4940 view_size); 4941 } 4942 4943 // The selector for s390 object files. 4944 4945 template<int size> 4946 class Target_selector_s390 : public Target_selector 4947 { 4948 public: 4949 Target_selector_s390() 4950 : Target_selector(elfcpp::EM_S390, size, true, 4951 (size == 64 ? "elf64-s390" : "elf32-s390"), 4952 (size == 64 ? "elf64_s390" : "elf32_s390")) 4953 { } 4954 4955 virtual Target* 4956 do_instantiate_target() 4957 { return new Target_s390<size>(); } 4958 }; 4959 4960 Target_selector_s390<32> target_selector_s390; 4961 Target_selector_s390<64> target_selector_s390x; 4962 4963 } // End anonymous namespace. 4964