1 // i386.cc -- i386 target support for gold. 2 3 // Copyright (C) 2006-2014 Free Software Foundation, Inc. 4 // Written by Ian Lance Taylor <iant (at) google.com>. 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 "i386.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 "freebsd.h" 42 #include "nacl.h" 43 #include "gc.h" 44 45 namespace 46 { 47 48 using namespace gold; 49 50 // A class to handle the .got.plt section. 51 52 class Output_data_got_plt_i386 : public Output_section_data_build 53 { 54 public: 55 Output_data_got_plt_i386(Layout* layout) 56 : Output_section_data_build(4), 57 layout_(layout) 58 { } 59 60 protected: 61 // Write out the PLT data. 62 void 63 do_write(Output_file*); 64 65 // Write to a map file. 66 void 67 do_print_to_mapfile(Mapfile* mapfile) const 68 { mapfile->print_output_data(this, "** GOT PLT"); } 69 70 private: 71 // A pointer to the Layout class, so that we can find the .dynamic 72 // section when we write out the GOT PLT section. 73 Layout* layout_; 74 }; 75 76 // A class to handle the PLT data. 77 // This is an abstract base class that handles most of the linker details 78 // but does not know the actual contents of PLT entries. The derived 79 // classes below fill in those details. 80 81 class Output_data_plt_i386 : public Output_section_data 82 { 83 public: 84 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, false> Reloc_section; 85 86 Output_data_plt_i386(Layout*, uint64_t addralign, 87 Output_data_got_plt_i386*, Output_data_space*); 88 89 // Add an entry to the PLT. 90 void 91 add_entry(Symbol_table*, Layout*, Symbol* gsym); 92 93 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol. 94 unsigned int 95 add_local_ifunc_entry(Symbol_table*, Layout*, 96 Sized_relobj_file<32, false>* relobj, 97 unsigned int local_sym_index); 98 99 // Return the .rel.plt section data. 100 Reloc_section* 101 rel_plt() const 102 { return this->rel_; } 103 104 // Return where the TLS_DESC relocations should go. 105 Reloc_section* 106 rel_tls_desc(Layout*); 107 108 // Return where the IRELATIVE relocations should go. 109 Reloc_section* 110 rel_irelative(Symbol_table*, Layout*); 111 112 // Return whether we created a section for IRELATIVE relocations. 113 bool 114 has_irelative_section() const 115 { return this->irelative_rel_ != NULL; } 116 117 // Return the number of PLT entries. 118 unsigned int 119 entry_count() const 120 { return this->count_ + this->irelative_count_; } 121 122 // Return the offset of the first non-reserved PLT entry. 123 unsigned int 124 first_plt_entry_offset() 125 { return this->get_plt_entry_size(); } 126 127 // Return the size of a PLT entry. 128 unsigned int 129 get_plt_entry_size() const 130 { return this->do_get_plt_entry_size(); } 131 132 // Return the PLT address to use for a global symbol. 133 uint64_t 134 address_for_global(const Symbol*); 135 136 // Return the PLT address to use for a local symbol. 137 uint64_t 138 address_for_local(const Relobj*, unsigned int symndx); 139 140 // Add .eh_frame information for the PLT. 141 void 142 add_eh_frame(Layout* layout) 143 { this->do_add_eh_frame(layout); } 144 145 protected: 146 // Fill the first PLT entry, given the pointer to the PLT section data 147 // and the runtime address of the GOT. 148 void 149 fill_first_plt_entry(unsigned char* pov, 150 elfcpp::Elf_types<32>::Elf_Addr got_address) 151 { this->do_fill_first_plt_entry(pov, got_address); } 152 153 // Fill a normal PLT entry, given the pointer to the entry's data in the 154 // section, the runtime address of the GOT, the offset into the GOT of 155 // the corresponding slot, the offset into the relocation section of the 156 // corresponding reloc, and the offset of this entry within the whole 157 // PLT. Return the offset from this PLT entry's runtime address that 158 // should be used to compute the initial value of the GOT slot. 159 unsigned int 160 fill_plt_entry(unsigned char* pov, 161 elfcpp::Elf_types<32>::Elf_Addr got_address, 162 unsigned int got_offset, 163 unsigned int plt_offset, 164 unsigned int plt_rel_offset) 165 { 166 return this->do_fill_plt_entry(pov, got_address, got_offset, 167 plt_offset, plt_rel_offset); 168 } 169 170 virtual unsigned int 171 do_get_plt_entry_size() const = 0; 172 173 virtual void 174 do_fill_first_plt_entry(unsigned char* pov, 175 elfcpp::Elf_types<32>::Elf_Addr got_address) = 0; 176 177 virtual unsigned int 178 do_fill_plt_entry(unsigned char* pov, 179 elfcpp::Elf_types<32>::Elf_Addr got_address, 180 unsigned int got_offset, 181 unsigned int plt_offset, 182 unsigned int plt_rel_offset) = 0; 183 184 virtual void 185 do_add_eh_frame(Layout*) = 0; 186 187 void 188 do_adjust_output_section(Output_section* os); 189 190 // Write to a map file. 191 void 192 do_print_to_mapfile(Mapfile* mapfile) const 193 { mapfile->print_output_data(this, _("** PLT")); } 194 195 // The .eh_frame unwind information for the PLT. 196 // The CIE is common across variants of the PLT format. 197 static const int plt_eh_frame_cie_size = 16; 198 static const unsigned char plt_eh_frame_cie[plt_eh_frame_cie_size]; 199 200 private: 201 // Set the final size. 202 void 203 set_final_data_size() 204 { 205 this->set_data_size((this->count_ + this->irelative_count_ + 1) 206 * this->get_plt_entry_size()); 207 } 208 209 // Write out the PLT data. 210 void 211 do_write(Output_file*); 212 213 // We keep a list of global STT_GNU_IFUNC symbols, each with its 214 // offset in the GOT. 215 struct Global_ifunc 216 { 217 Symbol* sym; 218 unsigned int got_offset; 219 }; 220 221 // We keep a list of local STT_GNU_IFUNC symbols, each with its 222 // offset in the GOT. 223 struct Local_ifunc 224 { 225 Sized_relobj_file<32, false>* object; 226 unsigned int local_sym_index; 227 unsigned int got_offset; 228 }; 229 230 // The reloc section. 231 Reloc_section* rel_; 232 // The TLS_DESC relocations, if necessary. These must follow the 233 // regular PLT relocs. 234 Reloc_section* tls_desc_rel_; 235 // The IRELATIVE relocations, if necessary. These must follow the 236 // regular relocatoins and the TLS_DESC relocations. 237 Reloc_section* irelative_rel_; 238 // The .got.plt section. 239 Output_data_got_plt_i386* got_plt_; 240 // The part of the .got.plt section used for IRELATIVE relocs. 241 Output_data_space* got_irelative_; 242 // The number of PLT entries. 243 unsigned int count_; 244 // Number of PLT entries with R_386_IRELATIVE relocs. These follow 245 // the regular PLT entries. 246 unsigned int irelative_count_; 247 // Global STT_GNU_IFUNC symbols. 248 std::vector<Global_ifunc> global_ifuncs_; 249 // Local STT_GNU_IFUNC symbols. 250 std::vector<Local_ifunc> local_ifuncs_; 251 }; 252 253 // This is an abstract class for the standard PLT layout. 254 // The derived classes below handle the actual PLT contents 255 // for the executable (non-PIC) and shared-library (PIC) cases. 256 // The unwind information is uniform across those two, so it's here. 257 258 class Output_data_plt_i386_standard : public Output_data_plt_i386 259 { 260 public: 261 Output_data_plt_i386_standard(Layout* layout, 262 Output_data_got_plt_i386* got_plt, 263 Output_data_space* got_irelative) 264 : Output_data_plt_i386(layout, plt_entry_size, got_plt, got_irelative) 265 { } 266 267 protected: 268 virtual unsigned int 269 do_get_plt_entry_size() const 270 { return plt_entry_size; } 271 272 virtual void 273 do_add_eh_frame(Layout* layout) 274 { 275 layout->add_eh_frame_for_plt(this, plt_eh_frame_cie, plt_eh_frame_cie_size, 276 plt_eh_frame_fde, plt_eh_frame_fde_size); 277 } 278 279 // The size of an entry in the PLT. 280 static const int plt_entry_size = 16; 281 282 // The .eh_frame unwind information for the PLT. 283 static const int plt_eh_frame_fde_size = 32; 284 static const unsigned char plt_eh_frame_fde[plt_eh_frame_fde_size]; 285 }; 286 287 // Actually fill the PLT contents for an executable (non-PIC). 288 289 class Output_data_plt_i386_exec : public Output_data_plt_i386_standard 290 { 291 public: 292 Output_data_plt_i386_exec(Layout* layout, 293 Output_data_got_plt_i386* got_plt, 294 Output_data_space* got_irelative) 295 : Output_data_plt_i386_standard(layout, got_plt, got_irelative) 296 { } 297 298 protected: 299 virtual void 300 do_fill_first_plt_entry(unsigned char* pov, 301 elfcpp::Elf_types<32>::Elf_Addr got_address); 302 303 virtual unsigned int 304 do_fill_plt_entry(unsigned char* pov, 305 elfcpp::Elf_types<32>::Elf_Addr got_address, 306 unsigned int got_offset, 307 unsigned int plt_offset, 308 unsigned int plt_rel_offset); 309 310 private: 311 // The first entry in the PLT for an executable. 312 static const unsigned char first_plt_entry[plt_entry_size]; 313 314 // Other entries in the PLT for an executable. 315 static const unsigned char plt_entry[plt_entry_size]; 316 }; 317 318 // Actually fill the PLT contents for a shared library (PIC). 319 320 class Output_data_plt_i386_dyn : public Output_data_plt_i386_standard 321 { 322 public: 323 Output_data_plt_i386_dyn(Layout* layout, 324 Output_data_got_plt_i386* got_plt, 325 Output_data_space* got_irelative) 326 : Output_data_plt_i386_standard(layout, got_plt, got_irelative) 327 { } 328 329 protected: 330 virtual void 331 do_fill_first_plt_entry(unsigned char* pov, elfcpp::Elf_types<32>::Elf_Addr); 332 333 virtual unsigned int 334 do_fill_plt_entry(unsigned char* pov, 335 elfcpp::Elf_types<32>::Elf_Addr, 336 unsigned int got_offset, 337 unsigned int plt_offset, 338 unsigned int plt_rel_offset); 339 340 private: 341 // The first entry in the PLT for a shared object. 342 static const unsigned char first_plt_entry[plt_entry_size]; 343 344 // Other entries in the PLT for a shared object. 345 static const unsigned char plt_entry[plt_entry_size]; 346 }; 347 348 // The i386 target class. 349 // TLS info comes from 350 // http://people.redhat.com/drepper/tls.pdf 351 // http://www.lsd.ic.unicamp.br/~oliva/writeups/TLS/RFC-TLSDESC-x86.txt 352 353 class Target_i386 : public Sized_target<32, false> 354 { 355 public: 356 typedef Output_data_reloc<elfcpp::SHT_REL, true, 32, false> Reloc_section; 357 358 Target_i386(const Target::Target_info* info = &i386_info) 359 : Sized_target<32, false>(info), 360 got_(NULL), plt_(NULL), got_plt_(NULL), got_irelative_(NULL), 361 got_tlsdesc_(NULL), global_offset_table_(NULL), rel_dyn_(NULL), 362 rel_irelative_(NULL), copy_relocs_(elfcpp::R_386_COPY), 363 got_mod_index_offset_(-1U), tls_base_symbol_defined_(false) 364 { } 365 366 // Process the relocations to determine unreferenced sections for 367 // garbage collection. 368 void 369 gc_process_relocs(Symbol_table* symtab, 370 Layout* layout, 371 Sized_relobj_file<32, false>* object, 372 unsigned int data_shndx, 373 unsigned int sh_type, 374 const unsigned char* prelocs, 375 size_t reloc_count, 376 Output_section* output_section, 377 bool needs_special_offset_handling, 378 size_t local_symbol_count, 379 const unsigned char* plocal_symbols); 380 381 // Scan the relocations to look for symbol adjustments. 382 void 383 scan_relocs(Symbol_table* symtab, 384 Layout* layout, 385 Sized_relobj_file<32, false>* object, 386 unsigned int data_shndx, 387 unsigned int sh_type, 388 const unsigned char* prelocs, 389 size_t reloc_count, 390 Output_section* output_section, 391 bool needs_special_offset_handling, 392 size_t local_symbol_count, 393 const unsigned char* plocal_symbols); 394 395 // Finalize the sections. 396 void 397 do_finalize_sections(Layout*, const Input_objects*, Symbol_table*); 398 399 // Return the value to use for a dynamic which requires special 400 // treatment. 401 uint64_t 402 do_dynsym_value(const Symbol*) const; 403 404 // Relocate a section. 405 void 406 relocate_section(const Relocate_info<32, false>*, 407 unsigned int sh_type, 408 const unsigned char* prelocs, 409 size_t reloc_count, 410 Output_section* output_section, 411 bool needs_special_offset_handling, 412 unsigned char* view, 413 elfcpp::Elf_types<32>::Elf_Addr view_address, 414 section_size_type view_size, 415 const Reloc_symbol_changes*); 416 417 // Scan the relocs during a relocatable link. 418 void 419 scan_relocatable_relocs(Symbol_table* symtab, 420 Layout* layout, 421 Sized_relobj_file<32, false>* object, 422 unsigned int data_shndx, 423 unsigned int sh_type, 424 const unsigned char* prelocs, 425 size_t reloc_count, 426 Output_section* output_section, 427 bool needs_special_offset_handling, 428 size_t local_symbol_count, 429 const unsigned char* plocal_symbols, 430 Relocatable_relocs*); 431 432 // Emit relocations for a section. 433 void 434 relocate_relocs(const Relocate_info<32, false>*, 435 unsigned int sh_type, 436 const unsigned char* prelocs, 437 size_t reloc_count, 438 Output_section* output_section, 439 elfcpp::Elf_types<32>::Elf_Off offset_in_output_section, 440 const Relocatable_relocs*, 441 unsigned char* view, 442 elfcpp::Elf_types<32>::Elf_Addr view_address, 443 section_size_type view_size, 444 unsigned char* reloc_view, 445 section_size_type reloc_view_size); 446 447 // Return a string used to fill a code section with nops. 448 std::string 449 do_code_fill(section_size_type length) const; 450 451 // Return whether SYM is defined by the ABI. 452 bool 453 do_is_defined_by_abi(const Symbol* sym) const 454 { return strcmp(sym->name(), "___tls_get_addr") == 0; } 455 456 // Return whether a symbol name implies a local label. The UnixWare 457 // 2.1 cc generates temporary symbols that start with .X, so we 458 // recognize them here. FIXME: do other SVR4 compilers also use .X?. 459 // If so, we should move the .X recognition into 460 // Target::do_is_local_label_name. 461 bool 462 do_is_local_label_name(const char* name) const 463 { 464 if (name[0] == '.' && name[1] == 'X') 465 return true; 466 return Target::do_is_local_label_name(name); 467 } 468 469 // Return the PLT address to use for a global symbol. 470 uint64_t 471 do_plt_address_for_global(const Symbol* gsym) const 472 { return this->plt_section()->address_for_global(gsym); } 473 474 uint64_t 475 do_plt_address_for_local(const Relobj* relobj, unsigned int symndx) const 476 { return this->plt_section()->address_for_local(relobj, symndx); } 477 478 // We can tell whether we take the address of a function. 479 inline bool 480 do_can_check_for_function_pointers() const 481 { return true; } 482 483 // Return the base for a DW_EH_PE_datarel encoding. 484 uint64_t 485 do_ehframe_datarel_base() const; 486 487 // Return whether SYM is call to a non-split function. 488 bool 489 do_is_call_to_non_split(const Symbol* sym, unsigned int) const; 490 491 // Adjust -fsplit-stack code which calls non-split-stack code. 492 void 493 do_calls_non_split(Relobj* object, unsigned int shndx, 494 section_offset_type fnoffset, section_size_type fnsize, 495 unsigned char* view, section_size_type view_size, 496 std::string* from, std::string* to) const; 497 498 // Return the size of the GOT section. 499 section_size_type 500 got_size() const 501 { 502 gold_assert(this->got_ != NULL); 503 return this->got_->data_size(); 504 } 505 506 // Return the number of entries in the GOT. 507 unsigned int 508 got_entry_count() const 509 { 510 if (this->got_ == NULL) 511 return 0; 512 return this->got_size() / 4; 513 } 514 515 // Return the number of entries in the PLT. 516 unsigned int 517 plt_entry_count() const; 518 519 // Return the offset of the first non-reserved PLT entry. 520 unsigned int 521 first_plt_entry_offset() const; 522 523 // Return the size of each PLT entry. 524 unsigned int 525 plt_entry_size() const; 526 527 protected: 528 // Instantiate the plt_ member. 529 // This chooses the right PLT flavor for an executable or a shared object. 530 Output_data_plt_i386* 531 make_data_plt(Layout* layout, 532 Output_data_got_plt_i386* got_plt, 533 Output_data_space* got_irelative, 534 bool dyn) 535 { return this->do_make_data_plt(layout, got_plt, got_irelative, dyn); } 536 537 virtual Output_data_plt_i386* 538 do_make_data_plt(Layout* layout, 539 Output_data_got_plt_i386* got_plt, 540 Output_data_space* got_irelative, 541 bool dyn) 542 { 543 if (dyn) 544 return new Output_data_plt_i386_dyn(layout, got_plt, got_irelative); 545 else 546 return new Output_data_plt_i386_exec(layout, got_plt, got_irelative); 547 } 548 549 private: 550 // The class which scans relocations. 551 struct Scan 552 { 553 static inline int 554 555 get_reference_flags(unsigned int r_type); 556 557 inline void 558 local(Symbol_table* symtab, Layout* layout, Target_i386* target, 559 Sized_relobj_file<32, false>* object, 560 unsigned int data_shndx, 561 Output_section* output_section, 562 const elfcpp::Rel<32, false>& reloc, unsigned int r_type, 563 const elfcpp::Sym<32, false>& lsym, 564 bool is_discarded); 565 566 inline void 567 global(Symbol_table* symtab, Layout* layout, Target_i386* target, 568 Sized_relobj_file<32, false>* object, 569 unsigned int data_shndx, 570 Output_section* output_section, 571 const elfcpp::Rel<32, false>& reloc, unsigned int r_type, 572 Symbol* gsym); 573 574 inline bool 575 local_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout, 576 Target_i386* target, 577 Sized_relobj_file<32, false>* object, 578 unsigned int data_shndx, 579 Output_section* output_section, 580 const elfcpp::Rel<32, false>& reloc, 581 unsigned int r_type, 582 const elfcpp::Sym<32, false>& lsym); 583 584 inline bool 585 global_reloc_may_be_function_pointer(Symbol_table* symtab, Layout* layout, 586 Target_i386* target, 587 Sized_relobj_file<32, false>* object, 588 unsigned int data_shndx, 589 Output_section* output_section, 590 const elfcpp::Rel<32, false>& reloc, 591 unsigned int r_type, 592 Symbol* gsym); 593 594 inline bool 595 possible_function_pointer_reloc(unsigned int r_type); 596 597 bool 598 reloc_needs_plt_for_ifunc(Sized_relobj_file<32, false>*, 599 unsigned int r_type); 600 601 static void 602 unsupported_reloc_local(Sized_relobj_file<32, false>*, unsigned int r_type); 603 604 static void 605 unsupported_reloc_global(Sized_relobj_file<32, false>*, unsigned int r_type, 606 Symbol*); 607 }; 608 609 // The class which implements relocation. 610 class Relocate 611 { 612 public: 613 Relocate() 614 : skip_call_tls_get_addr_(false), 615 local_dynamic_type_(LOCAL_DYNAMIC_NONE) 616 { } 617 618 ~Relocate() 619 { 620 if (this->skip_call_tls_get_addr_) 621 { 622 // FIXME: This needs to specify the location somehow. 623 gold_error(_("missing expected TLS relocation")); 624 } 625 } 626 627 // Return whether the static relocation needs to be applied. 628 inline bool 629 should_apply_static_reloc(const Sized_symbol<32>* gsym, 630 unsigned int r_type, 631 bool is_32bit, 632 Output_section* output_section); 633 634 // Do a relocation. Return false if the caller should not issue 635 // any warnings about this relocation. 636 inline bool 637 relocate(const Relocate_info<32, false>*, Target_i386*, Output_section*, 638 size_t relnum, const elfcpp::Rel<32, false>&, 639 unsigned int r_type, const Sized_symbol<32>*, 640 const Symbol_value<32>*, 641 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr, 642 section_size_type); 643 644 private: 645 // Do a TLS relocation. 646 inline void 647 relocate_tls(const Relocate_info<32, false>*, Target_i386* target, 648 size_t relnum, const elfcpp::Rel<32, false>&, 649 unsigned int r_type, const Sized_symbol<32>*, 650 const Symbol_value<32>*, 651 unsigned char*, elfcpp::Elf_types<32>::Elf_Addr, 652 section_size_type); 653 654 // Do a TLS General-Dynamic to Initial-Exec transition. 655 inline void 656 tls_gd_to_ie(const Relocate_info<32, false>*, size_t relnum, 657 Output_segment* tls_segment, 658 const elfcpp::Rel<32, false>&, unsigned int r_type, 659 elfcpp::Elf_types<32>::Elf_Addr value, 660 unsigned char* view, 661 section_size_type view_size); 662 663 // Do a TLS General-Dynamic to Local-Exec transition. 664 inline void 665 tls_gd_to_le(const Relocate_info<32, false>*, size_t relnum, 666 Output_segment* tls_segment, 667 const elfcpp::Rel<32, false>&, unsigned int r_type, 668 elfcpp::Elf_types<32>::Elf_Addr value, 669 unsigned char* view, 670 section_size_type view_size); 671 672 // Do a TLS_GOTDESC or TLS_DESC_CALL General-Dynamic to Initial-Exec 673 // transition. 674 inline void 675 tls_desc_gd_to_ie(const Relocate_info<32, false>*, size_t relnum, 676 Output_segment* tls_segment, 677 const elfcpp::Rel<32, false>&, unsigned int r_type, 678 elfcpp::Elf_types<32>::Elf_Addr value, 679 unsigned char* view, 680 section_size_type view_size); 681 682 // Do a TLS_GOTDESC or TLS_DESC_CALL General-Dynamic to Local-Exec 683 // transition. 684 inline void 685 tls_desc_gd_to_le(const Relocate_info<32, false>*, size_t relnum, 686 Output_segment* tls_segment, 687 const elfcpp::Rel<32, false>&, unsigned int r_type, 688 elfcpp::Elf_types<32>::Elf_Addr value, 689 unsigned char* view, 690 section_size_type view_size); 691 692 // Do a TLS Local-Dynamic to Local-Exec transition. 693 inline void 694 tls_ld_to_le(const Relocate_info<32, false>*, size_t relnum, 695 Output_segment* tls_segment, 696 const elfcpp::Rel<32, false>&, unsigned int r_type, 697 elfcpp::Elf_types<32>::Elf_Addr value, 698 unsigned char* view, 699 section_size_type view_size); 700 701 // Do a TLS Initial-Exec to Local-Exec transition. 702 static inline void 703 tls_ie_to_le(const Relocate_info<32, false>*, size_t relnum, 704 Output_segment* tls_segment, 705 const elfcpp::Rel<32, false>&, unsigned int r_type, 706 elfcpp::Elf_types<32>::Elf_Addr value, 707 unsigned char* view, 708 section_size_type view_size); 709 710 // We need to keep track of which type of local dynamic relocation 711 // we have seen, so that we can optimize R_386_TLS_LDO_32 correctly. 712 enum Local_dynamic_type 713 { 714 LOCAL_DYNAMIC_NONE, 715 LOCAL_DYNAMIC_SUN, 716 LOCAL_DYNAMIC_GNU 717 }; 718 719 // This is set if we should skip the next reloc, which should be a 720 // PLT32 reloc against ___tls_get_addr. 721 bool skip_call_tls_get_addr_; 722 // The type of local dynamic relocation we have seen in the section 723 // being relocated, if any. 724 Local_dynamic_type local_dynamic_type_; 725 }; 726 727 // A class which returns the size required for a relocation type, 728 // used while scanning relocs during a relocatable link. 729 class Relocatable_size_for_reloc 730 { 731 public: 732 unsigned int 733 get_size_for_reloc(unsigned int, Relobj*); 734 }; 735 736 // Adjust TLS relocation type based on the options and whether this 737 // is a local symbol. 738 static tls::Tls_optimization 739 optimize_tls_reloc(bool is_final, int r_type); 740 741 // Check if relocation against this symbol is a candidate for 742 // conversion from 743 // mov foo@GOT(%reg), %reg 744 // to 745 // lea foo@GOTOFF(%reg), %reg. 746 static bool 747 can_convert_mov_to_lea(const Symbol* gsym) 748 { 749 gold_assert(gsym != NULL); 750 return (gsym->type() != elfcpp::STT_GNU_IFUNC 751 && !gsym->is_undefined () 752 && !gsym->is_from_dynobj() 753 && !gsym->is_preemptible() 754 && (!parameters->options().shared() 755 || (gsym->visibility() != elfcpp::STV_DEFAULT 756 && gsym->visibility() != elfcpp::STV_PROTECTED) 757 || parameters->options().Bsymbolic()) 758 && strcmp(gsym->name(), "_DYNAMIC") != 0); 759 } 760 761 // Get the GOT section, creating it if necessary. 762 Output_data_got<32, false>* 763 got_section(Symbol_table*, Layout*); 764 765 // Get the GOT PLT section. 766 Output_data_got_plt_i386* 767 got_plt_section() const 768 { 769 gold_assert(this->got_plt_ != NULL); 770 return this->got_plt_; 771 } 772 773 // Get the GOT section for TLSDESC entries. 774 Output_data_got<32, false>* 775 got_tlsdesc_section() const 776 { 777 gold_assert(this->got_tlsdesc_ != NULL); 778 return this->got_tlsdesc_; 779 } 780 781 // Create the PLT section. 782 void 783 make_plt_section(Symbol_table* symtab, Layout* layout); 784 785 // Create a PLT entry for a global symbol. 786 void 787 make_plt_entry(Symbol_table*, Layout*, Symbol*); 788 789 // Create a PLT entry for a local STT_GNU_IFUNC symbol. 790 void 791 make_local_ifunc_plt_entry(Symbol_table*, Layout*, 792 Sized_relobj_file<32, false>* relobj, 793 unsigned int local_sym_index); 794 795 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment. 796 void 797 define_tls_base_symbol(Symbol_table*, Layout*); 798 799 // Create a GOT entry for the TLS module index. 800 unsigned int 801 got_mod_index_entry(Symbol_table* symtab, Layout* layout, 802 Sized_relobj_file<32, false>* object); 803 804 // Get the PLT section. 805 Output_data_plt_i386* 806 plt_section() const 807 { 808 gold_assert(this->plt_ != NULL); 809 return this->plt_; 810 } 811 812 // Get the dynamic reloc section, creating it if necessary. 813 Reloc_section* 814 rel_dyn_section(Layout*); 815 816 // Get the section to use for TLS_DESC relocations. 817 Reloc_section* 818 rel_tls_desc_section(Layout*) const; 819 820 // Get the section to use for IRELATIVE relocations. 821 Reloc_section* 822 rel_irelative_section(Layout*); 823 824 // Add a potential copy relocation. 825 void 826 copy_reloc(Symbol_table* symtab, Layout* layout, 827 Sized_relobj_file<32, false>* object, 828 unsigned int shndx, Output_section* output_section, 829 Symbol* sym, const elfcpp::Rel<32, false>& reloc) 830 { 831 this->copy_relocs_.copy_reloc(symtab, layout, 832 symtab->get_sized_symbol<32>(sym), 833 object, shndx, output_section, reloc, 834 this->rel_dyn_section(layout)); 835 } 836 837 // Information about this specific target which we pass to the 838 // general Target structure. 839 static const Target::Target_info i386_info; 840 841 // The types of GOT entries needed for this platform. 842 // These values are exposed to the ABI in an incremental link. 843 // Do not renumber existing values without changing the version 844 // number of the .gnu_incremental_inputs section. 845 enum Got_type 846 { 847 GOT_TYPE_STANDARD = 0, // GOT entry for a regular symbol 848 GOT_TYPE_TLS_NOFFSET = 1, // GOT entry for negative TLS offset 849 GOT_TYPE_TLS_OFFSET = 2, // GOT entry for positive TLS offset 850 GOT_TYPE_TLS_PAIR = 3, // GOT entry for TLS module/offset pair 851 GOT_TYPE_TLS_DESC = 4 // GOT entry for TLS_DESC pair 852 }; 853 854 // The GOT section. 855 Output_data_got<32, false>* got_; 856 // The PLT section. 857 Output_data_plt_i386* plt_; 858 // The GOT PLT section. 859 Output_data_got_plt_i386* got_plt_; 860 // The GOT section for IRELATIVE relocations. 861 Output_data_space* got_irelative_; 862 // The GOT section for TLSDESC relocations. 863 Output_data_got<32, false>* got_tlsdesc_; 864 // The _GLOBAL_OFFSET_TABLE_ symbol. 865 Symbol* global_offset_table_; 866 // The dynamic reloc section. 867 Reloc_section* rel_dyn_; 868 // The section to use for IRELATIVE relocs. 869 Reloc_section* rel_irelative_; 870 // Relocs saved to avoid a COPY reloc. 871 Copy_relocs<elfcpp::SHT_REL, 32, false> copy_relocs_; 872 // Offset of the GOT entry for the TLS module index. 873 unsigned int got_mod_index_offset_; 874 // True if the _TLS_MODULE_BASE_ symbol has been defined. 875 bool tls_base_symbol_defined_; 876 }; 877 878 const Target::Target_info Target_i386::i386_info = 879 { 880 32, // size 881 false, // is_big_endian 882 elfcpp::EM_386, // machine_code 883 false, // has_make_symbol 884 false, // has_resolve 885 true, // has_code_fill 886 true, // is_default_stack_executable 887 true, // can_icf_inline_merge_sections 888 '\0', // wrap_char 889 "/usr/lib/libc.so.1", // dynamic_linker 890 0x08048000, // default_text_segment_address 891 0x1000, // abi_pagesize (overridable by -z max-page-size) 892 0x1000, // common_pagesize (overridable by -z common-page-size) 893 false, // isolate_execinstr 894 0, // rosegment_gap 895 elfcpp::SHN_UNDEF, // small_common_shndx 896 elfcpp::SHN_UNDEF, // large_common_shndx 897 0, // small_common_section_flags 898 0, // large_common_section_flags 899 NULL, // attributes_section 900 NULL, // attributes_vendor 901 "_start" // entry_symbol_name 902 }; 903 904 // Get the GOT section, creating it if necessary. 905 906 Output_data_got<32, false>* 907 Target_i386::got_section(Symbol_table* symtab, Layout* layout) 908 { 909 if (this->got_ == NULL) 910 { 911 gold_assert(symtab != NULL && layout != NULL); 912 913 this->got_ = new Output_data_got<32, false>(); 914 915 // When using -z now, we can treat .got.plt as a relro section. 916 // Without -z now, it is modified after program startup by lazy 917 // PLT relocations. 918 bool is_got_plt_relro = parameters->options().now(); 919 Output_section_order got_order = (is_got_plt_relro 920 ? ORDER_RELRO 921 : ORDER_RELRO_LAST); 922 Output_section_order got_plt_order = (is_got_plt_relro 923 ? ORDER_RELRO 924 : ORDER_NON_RELRO_FIRST); 925 926 layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, 927 (elfcpp::SHF_ALLOC 928 | elfcpp::SHF_WRITE), 929 this->got_, got_order, true); 930 931 this->got_plt_ = new Output_data_got_plt_i386(layout); 932 layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS, 933 (elfcpp::SHF_ALLOC 934 | elfcpp::SHF_WRITE), 935 this->got_plt_, got_plt_order, 936 is_got_plt_relro); 937 938 // The first three entries are reserved. 939 this->got_plt_->set_current_data_size(3 * 4); 940 941 if (!is_got_plt_relro) 942 { 943 // Those bytes can go into the relro segment. 944 layout->increase_relro(3 * 4); 945 } 946 947 // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT. 948 this->global_offset_table_ = 949 symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL, 950 Symbol_table::PREDEFINED, 951 this->got_plt_, 952 0, 0, elfcpp::STT_OBJECT, 953 elfcpp::STB_LOCAL, 954 elfcpp::STV_HIDDEN, 0, 955 false, false); 956 957 // If there are any IRELATIVE relocations, they get GOT entries 958 // in .got.plt after the jump slot relocations. 959 this->got_irelative_ = new Output_data_space(4, "** GOT IRELATIVE PLT"); 960 layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS, 961 (elfcpp::SHF_ALLOC 962 | elfcpp::SHF_WRITE), 963 this->got_irelative_, 964 got_plt_order, is_got_plt_relro); 965 966 // If there are any TLSDESC relocations, they get GOT entries in 967 // .got.plt after the jump slot entries. 968 this->got_tlsdesc_ = new Output_data_got<32, false>(); 969 layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS, 970 (elfcpp::SHF_ALLOC 971 | elfcpp::SHF_WRITE), 972 this->got_tlsdesc_, 973 got_plt_order, is_got_plt_relro); 974 } 975 976 return this->got_; 977 } 978 979 // Get the dynamic reloc section, creating it if necessary. 980 981 Target_i386::Reloc_section* 982 Target_i386::rel_dyn_section(Layout* layout) 983 { 984 if (this->rel_dyn_ == NULL) 985 { 986 gold_assert(layout != NULL); 987 this->rel_dyn_ = new Reloc_section(parameters->options().combreloc()); 988 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL, 989 elfcpp::SHF_ALLOC, this->rel_dyn_, 990 ORDER_DYNAMIC_RELOCS, false); 991 } 992 return this->rel_dyn_; 993 } 994 995 // Get the section to use for IRELATIVE relocs, creating it if 996 // necessary. These go in .rel.dyn, but only after all other dynamic 997 // relocations. They need to follow the other dynamic relocations so 998 // that they can refer to global variables initialized by those 999 // relocs. 1000 1001 Target_i386::Reloc_section* 1002 Target_i386::rel_irelative_section(Layout* layout) 1003 { 1004 if (this->rel_irelative_ == NULL) 1005 { 1006 // Make sure we have already create the dynamic reloc section. 1007 this->rel_dyn_section(layout); 1008 this->rel_irelative_ = new Reloc_section(false); 1009 layout->add_output_section_data(".rel.dyn", elfcpp::SHT_REL, 1010 elfcpp::SHF_ALLOC, this->rel_irelative_, 1011 ORDER_DYNAMIC_RELOCS, false); 1012 gold_assert(this->rel_dyn_->output_section() 1013 == this->rel_irelative_->output_section()); 1014 } 1015 return this->rel_irelative_; 1016 } 1017 1018 // Write the first three reserved words of the .got.plt section. 1019 // The remainder of the section is written while writing the PLT 1020 // in Output_data_plt_i386::do_write. 1021 1022 void 1023 Output_data_got_plt_i386::do_write(Output_file* of) 1024 { 1025 // The first entry in the GOT is the address of the .dynamic section 1026 // aka the PT_DYNAMIC segment. The next two entries are reserved. 1027 // We saved space for them when we created the section in 1028 // Target_i386::got_section. 1029 const off_t got_file_offset = this->offset(); 1030 gold_assert(this->data_size() >= 12); 1031 unsigned char* const got_view = of->get_output_view(got_file_offset, 12); 1032 Output_section* dynamic = this->layout_->dynamic_section(); 1033 uint32_t dynamic_addr = dynamic == NULL ? 0 : dynamic->address(); 1034 elfcpp::Swap<32, false>::writeval(got_view, dynamic_addr); 1035 memset(got_view + 4, 0, 8); 1036 of->write_output_view(got_file_offset, 12, got_view); 1037 } 1038 1039 // Create the PLT section. The ordinary .got section is an argument, 1040 // since we need to refer to the start. We also create our own .got 1041 // section just for PLT entries. 1042 1043 Output_data_plt_i386::Output_data_plt_i386(Layout* layout, 1044 uint64_t addralign, 1045 Output_data_got_plt_i386* got_plt, 1046 Output_data_space* got_irelative) 1047 : Output_section_data(addralign), 1048 tls_desc_rel_(NULL), irelative_rel_(NULL), got_plt_(got_plt), 1049 got_irelative_(got_irelative), count_(0), irelative_count_(0), 1050 global_ifuncs_(), local_ifuncs_() 1051 { 1052 this->rel_ = new Reloc_section(false); 1053 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL, 1054 elfcpp::SHF_ALLOC, this->rel_, 1055 ORDER_DYNAMIC_PLT_RELOCS, false); 1056 } 1057 1058 void 1059 Output_data_plt_i386::do_adjust_output_section(Output_section* os) 1060 { 1061 // UnixWare sets the entsize of .plt to 4, and so does the old GNU 1062 // linker, and so do we. 1063 os->set_entsize(4); 1064 } 1065 1066 // Add an entry to the PLT. 1067 1068 void 1069 Output_data_plt_i386::add_entry(Symbol_table* symtab, Layout* layout, 1070 Symbol* gsym) 1071 { 1072 gold_assert(!gsym->has_plt_offset()); 1073 1074 // Every PLT entry needs a reloc. 1075 if (gsym->type() == elfcpp::STT_GNU_IFUNC 1076 && gsym->can_use_relative_reloc(false)) 1077 { 1078 gsym->set_plt_offset(this->irelative_count_ * this->get_plt_entry_size()); 1079 ++this->irelative_count_; 1080 section_offset_type got_offset = 1081 this->got_irelative_->current_data_size(); 1082 this->got_irelative_->set_current_data_size(got_offset + 4); 1083 Reloc_section* rel = this->rel_irelative(symtab, layout); 1084 rel->add_symbolless_global_addend(gsym, elfcpp::R_386_IRELATIVE, 1085 this->got_irelative_, got_offset); 1086 struct Global_ifunc gi; 1087 gi.sym = gsym; 1088 gi.got_offset = got_offset; 1089 this->global_ifuncs_.push_back(gi); 1090 } 1091 else 1092 { 1093 // When setting the PLT offset we skip the initial reserved PLT 1094 // entry. 1095 gsym->set_plt_offset((this->count_ + 1) * this->get_plt_entry_size()); 1096 1097 ++this->count_; 1098 1099 section_offset_type got_offset = this->got_plt_->current_data_size(); 1100 1101 // Every PLT entry needs a GOT entry which points back to the 1102 // PLT entry (this will be changed by the dynamic linker, 1103 // normally lazily when the function is called). 1104 this->got_plt_->set_current_data_size(got_offset + 4); 1105 1106 gsym->set_needs_dynsym_entry(); 1107 this->rel_->add_global(gsym, elfcpp::R_386_JUMP_SLOT, this->got_plt_, 1108 got_offset); 1109 } 1110 1111 // Note that we don't need to save the symbol. The contents of the 1112 // PLT are independent of which symbols are used. The symbols only 1113 // appear in the relocations. 1114 } 1115 1116 // Add an entry to the PLT for a local STT_GNU_IFUNC symbol. Return 1117 // the PLT offset. 1118 1119 unsigned int 1120 Output_data_plt_i386::add_local_ifunc_entry( 1121 Symbol_table* symtab, 1122 Layout* layout, 1123 Sized_relobj_file<32, false>* relobj, 1124 unsigned int local_sym_index) 1125 { 1126 unsigned int plt_offset = this->irelative_count_ * this->get_plt_entry_size(); 1127 ++this->irelative_count_; 1128 1129 section_offset_type got_offset = this->got_irelative_->current_data_size(); 1130 1131 // Every PLT entry needs a GOT entry which points back to the PLT 1132 // entry. 1133 this->got_irelative_->set_current_data_size(got_offset + 4); 1134 1135 // Every PLT entry needs a reloc. 1136 Reloc_section* rel = this->rel_irelative(symtab, layout); 1137 rel->add_symbolless_local_addend(relobj, local_sym_index, 1138 elfcpp::R_386_IRELATIVE, 1139 this->got_irelative_, got_offset); 1140 1141 struct Local_ifunc li; 1142 li.object = relobj; 1143 li.local_sym_index = local_sym_index; 1144 li.got_offset = got_offset; 1145 this->local_ifuncs_.push_back(li); 1146 1147 return plt_offset; 1148 } 1149 1150 // Return where the TLS_DESC relocations should go, creating it if 1151 // necessary. These follow the JUMP_SLOT relocations. 1152 1153 Output_data_plt_i386::Reloc_section* 1154 Output_data_plt_i386::rel_tls_desc(Layout* layout) 1155 { 1156 if (this->tls_desc_rel_ == NULL) 1157 { 1158 this->tls_desc_rel_ = new Reloc_section(false); 1159 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL, 1160 elfcpp::SHF_ALLOC, this->tls_desc_rel_, 1161 ORDER_DYNAMIC_PLT_RELOCS, false); 1162 gold_assert(this->tls_desc_rel_->output_section() 1163 == this->rel_->output_section()); 1164 } 1165 return this->tls_desc_rel_; 1166 } 1167 1168 // Return where the IRELATIVE relocations should go in the PLT. These 1169 // follow the JUMP_SLOT and TLS_DESC relocations. 1170 1171 Output_data_plt_i386::Reloc_section* 1172 Output_data_plt_i386::rel_irelative(Symbol_table* symtab, Layout* layout) 1173 { 1174 if (this->irelative_rel_ == NULL) 1175 { 1176 // Make sure we have a place for the TLS_DESC relocations, in 1177 // case we see any later on. 1178 this->rel_tls_desc(layout); 1179 this->irelative_rel_ = new Reloc_section(false); 1180 layout->add_output_section_data(".rel.plt", elfcpp::SHT_REL, 1181 elfcpp::SHF_ALLOC, this->irelative_rel_, 1182 ORDER_DYNAMIC_PLT_RELOCS, false); 1183 gold_assert(this->irelative_rel_->output_section() 1184 == this->rel_->output_section()); 1185 1186 if (parameters->doing_static_link()) 1187 { 1188 // A statically linked executable will only have a .rel.plt 1189 // section to hold R_386_IRELATIVE relocs for STT_GNU_IFUNC 1190 // symbols. The library will use these symbols to locate 1191 // the IRELATIVE relocs at program startup time. 1192 symtab->define_in_output_data("__rel_iplt_start", NULL, 1193 Symbol_table::PREDEFINED, 1194 this->irelative_rel_, 0, 0, 1195 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, 1196 elfcpp::STV_HIDDEN, 0, false, true); 1197 symtab->define_in_output_data("__rel_iplt_end", NULL, 1198 Symbol_table::PREDEFINED, 1199 this->irelative_rel_, 0, 0, 1200 elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, 1201 elfcpp::STV_HIDDEN, 0, true, true); 1202 } 1203 } 1204 return this->irelative_rel_; 1205 } 1206 1207 // Return the PLT address to use for a global symbol. 1208 1209 uint64_t 1210 Output_data_plt_i386::address_for_global(const Symbol* gsym) 1211 { 1212 uint64_t offset = 0; 1213 if (gsym->type() == elfcpp::STT_GNU_IFUNC 1214 && gsym->can_use_relative_reloc(false)) 1215 offset = (this->count_ + 1) * this->get_plt_entry_size(); 1216 return this->address() + offset + gsym->plt_offset(); 1217 } 1218 1219 // Return the PLT address to use for a local symbol. These are always 1220 // IRELATIVE relocs. 1221 1222 uint64_t 1223 Output_data_plt_i386::address_for_local(const Relobj* object, 1224 unsigned int r_sym) 1225 { 1226 return (this->address() 1227 + (this->count_ + 1) * this->get_plt_entry_size() 1228 + object->local_plt_offset(r_sym)); 1229 } 1230 1231 // The first entry in the PLT for an executable. 1232 1233 const unsigned char Output_data_plt_i386_exec::first_plt_entry[plt_entry_size] = 1234 { 1235 0xff, 0x35, // pushl contents of memory address 1236 0, 0, 0, 0, // replaced with address of .got + 4 1237 0xff, 0x25, // jmp indirect 1238 0, 0, 0, 0, // replaced with address of .got + 8 1239 0, 0, 0, 0 // unused 1240 }; 1241 1242 void 1243 Output_data_plt_i386_exec::do_fill_first_plt_entry( 1244 unsigned char* pov, 1245 elfcpp::Elf_types<32>::Elf_Addr got_address) 1246 { 1247 memcpy(pov, first_plt_entry, plt_entry_size); 1248 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 4); 1249 elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 8); 1250 } 1251 1252 // The first entry in the PLT for a shared object. 1253 1254 const unsigned char Output_data_plt_i386_dyn::first_plt_entry[plt_entry_size] = 1255 { 1256 0xff, 0xb3, 4, 0, 0, 0, // pushl 4(%ebx) 1257 0xff, 0xa3, 8, 0, 0, 0, // jmp *8(%ebx) 1258 0, 0, 0, 0 // unused 1259 }; 1260 1261 void 1262 Output_data_plt_i386_dyn::do_fill_first_plt_entry( 1263 unsigned char* pov, 1264 elfcpp::Elf_types<32>::Elf_Addr) 1265 { 1266 memcpy(pov, first_plt_entry, plt_entry_size); 1267 } 1268 1269 // Subsequent entries in the PLT for an executable. 1270 1271 const unsigned char Output_data_plt_i386_exec::plt_entry[plt_entry_size] = 1272 { 1273 0xff, 0x25, // jmp indirect 1274 0, 0, 0, 0, // replaced with address of symbol in .got 1275 0x68, // pushl immediate 1276 0, 0, 0, 0, // replaced with offset into relocation table 1277 0xe9, // jmp relative 1278 0, 0, 0, 0 // replaced with offset to start of .plt 1279 }; 1280 1281 unsigned int 1282 Output_data_plt_i386_exec::do_fill_plt_entry( 1283 unsigned char* pov, 1284 elfcpp::Elf_types<32>::Elf_Addr got_address, 1285 unsigned int got_offset, 1286 unsigned int plt_offset, 1287 unsigned int plt_rel_offset) 1288 { 1289 memcpy(pov, plt_entry, plt_entry_size); 1290 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, 1291 got_address + got_offset); 1292 elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_rel_offset); 1293 elfcpp::Swap<32, false>::writeval(pov + 12, - (plt_offset + 12 + 4)); 1294 return 6; 1295 } 1296 1297 // Subsequent entries in the PLT for a shared object. 1298 1299 const unsigned char Output_data_plt_i386_dyn::plt_entry[plt_entry_size] = 1300 { 1301 0xff, 0xa3, // jmp *offset(%ebx) 1302 0, 0, 0, 0, // replaced with offset of symbol in .got 1303 0x68, // pushl immediate 1304 0, 0, 0, 0, // replaced with offset into relocation table 1305 0xe9, // jmp relative 1306 0, 0, 0, 0 // replaced with offset to start of .plt 1307 }; 1308 1309 unsigned int 1310 Output_data_plt_i386_dyn::do_fill_plt_entry(unsigned char* pov, 1311 elfcpp::Elf_types<32>::Elf_Addr, 1312 unsigned int got_offset, 1313 unsigned int plt_offset, 1314 unsigned int plt_rel_offset) 1315 { 1316 memcpy(pov, plt_entry, plt_entry_size); 1317 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset); 1318 elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_rel_offset); 1319 elfcpp::Swap<32, false>::writeval(pov + 12, - (plt_offset + 12 + 4)); 1320 return 6; 1321 } 1322 1323 // The .eh_frame unwind information for the PLT. 1324 1325 const unsigned char 1326 Output_data_plt_i386::plt_eh_frame_cie[plt_eh_frame_cie_size] = 1327 { 1328 1, // CIE version. 1329 'z', // Augmentation: augmentation size included. 1330 'R', // Augmentation: FDE encoding included. 1331 '\0', // End of augmentation string. 1332 1, // Code alignment factor. 1333 0x7c, // Data alignment factor. 1334 8, // Return address column. 1335 1, // Augmentation size. 1336 (elfcpp::DW_EH_PE_pcrel // FDE encoding. 1337 | elfcpp::DW_EH_PE_sdata4), 1338 elfcpp::DW_CFA_def_cfa, 4, 4, // DW_CFA_def_cfa: r4 (esp) ofs 4. 1339 elfcpp::DW_CFA_offset + 8, 1, // DW_CFA_offset: r8 (eip) at cfa-4. 1340 elfcpp::DW_CFA_nop, // Align to 16 bytes. 1341 elfcpp::DW_CFA_nop 1342 }; 1343 1344 const unsigned char 1345 Output_data_plt_i386_standard::plt_eh_frame_fde[plt_eh_frame_fde_size] = 1346 { 1347 0, 0, 0, 0, // Replaced with offset to .plt. 1348 0, 0, 0, 0, // Replaced with size of .plt. 1349 0, // Augmentation size. 1350 elfcpp::DW_CFA_def_cfa_offset, 8, // DW_CFA_def_cfa_offset: 8. 1351 elfcpp::DW_CFA_advance_loc + 6, // Advance 6 to __PLT__ + 6. 1352 elfcpp::DW_CFA_def_cfa_offset, 12, // DW_CFA_def_cfa_offset: 12. 1353 elfcpp::DW_CFA_advance_loc + 10, // Advance 10 to __PLT__ + 16. 1354 elfcpp::DW_CFA_def_cfa_expression, // DW_CFA_def_cfa_expression. 1355 11, // Block length. 1356 elfcpp::DW_OP_breg4, 4, // Push %esp + 4. 1357 elfcpp::DW_OP_breg8, 0, // Push %eip. 1358 elfcpp::DW_OP_lit15, // Push 0xf. 1359 elfcpp::DW_OP_and, // & (%eip & 0xf). 1360 elfcpp::DW_OP_lit11, // Push 0xb. 1361 elfcpp::DW_OP_ge, // >= ((%eip & 0xf) >= 0xb) 1362 elfcpp::DW_OP_lit2, // Push 2. 1363 elfcpp::DW_OP_shl, // << (((%eip & 0xf) >= 0xb) << 2) 1364 elfcpp::DW_OP_plus, // + ((((%eip&0xf)>=0xb)<<2)+%esp+4 1365 elfcpp::DW_CFA_nop, // Align to 32 bytes. 1366 elfcpp::DW_CFA_nop, 1367 elfcpp::DW_CFA_nop, 1368 elfcpp::DW_CFA_nop 1369 }; 1370 1371 // Write out the PLT. This uses the hand-coded instructions above, 1372 // and adjusts them as needed. This is all specified by the i386 ELF 1373 // Processor Supplement. 1374 1375 void 1376 Output_data_plt_i386::do_write(Output_file* of) 1377 { 1378 const off_t offset = this->offset(); 1379 const section_size_type oview_size = 1380 convert_to_section_size_type(this->data_size()); 1381 unsigned char* const oview = of->get_output_view(offset, oview_size); 1382 1383 const off_t got_file_offset = this->got_plt_->offset(); 1384 gold_assert(parameters->incremental_update() 1385 || (got_file_offset + this->got_plt_->data_size() 1386 == this->got_irelative_->offset())); 1387 const section_size_type got_size = 1388 convert_to_section_size_type(this->got_plt_->data_size() 1389 + this->got_irelative_->data_size()); 1390 1391 unsigned char* const got_view = of->get_output_view(got_file_offset, 1392 got_size); 1393 1394 unsigned char* pov = oview; 1395 1396 elfcpp::Elf_types<32>::Elf_Addr plt_address = this->address(); 1397 elfcpp::Elf_types<32>::Elf_Addr got_address = this->got_plt_->address(); 1398 1399 this->fill_first_plt_entry(pov, got_address); 1400 pov += this->get_plt_entry_size(); 1401 1402 // The first three entries in the GOT are reserved, and are written 1403 // by Output_data_got_plt_i386::do_write. 1404 unsigned char* got_pov = got_view + 12; 1405 1406 const int rel_size = elfcpp::Elf_sizes<32>::rel_size; 1407 1408 unsigned int plt_offset = this->get_plt_entry_size(); 1409 unsigned int plt_rel_offset = 0; 1410 unsigned int got_offset = 12; 1411 const unsigned int count = this->count_ + this->irelative_count_; 1412 for (unsigned int i = 0; 1413 i < count; 1414 ++i, 1415 pov += this->get_plt_entry_size(), 1416 got_pov += 4, 1417 plt_offset += this->get_plt_entry_size(), 1418 plt_rel_offset += rel_size, 1419 got_offset += 4) 1420 { 1421 // Set and adjust the PLT entry itself. 1422 unsigned int lazy_offset = this->fill_plt_entry(pov, 1423 got_address, 1424 got_offset, 1425 plt_offset, 1426 plt_rel_offset); 1427 1428 // Set the entry in the GOT. 1429 elfcpp::Swap<32, false>::writeval(got_pov, 1430 plt_address + plt_offset + lazy_offset); 1431 } 1432 1433 // If any STT_GNU_IFUNC symbols have PLT entries, we need to change 1434 // the GOT to point to the actual symbol value, rather than point to 1435 // the PLT entry. That will let the dynamic linker call the right 1436 // function when resolving IRELATIVE relocations. 1437 unsigned char* got_irelative_view = got_view + this->got_plt_->data_size(); 1438 for (std::vector<Global_ifunc>::const_iterator p = 1439 this->global_ifuncs_.begin(); 1440 p != this->global_ifuncs_.end(); 1441 ++p) 1442 { 1443 const Sized_symbol<32>* ssym = 1444 static_cast<const Sized_symbol<32>*>(p->sym); 1445 elfcpp::Swap<32, false>::writeval(got_irelative_view + p->got_offset, 1446 ssym->value()); 1447 } 1448 1449 for (std::vector<Local_ifunc>::const_iterator p = 1450 this->local_ifuncs_.begin(); 1451 p != this->local_ifuncs_.end(); 1452 ++p) 1453 { 1454 const Symbol_value<32>* psymval = 1455 p->object->local_symbol(p->local_sym_index); 1456 elfcpp::Swap<32, false>::writeval(got_irelative_view + p->got_offset, 1457 psymval->value(p->object, 0)); 1458 } 1459 1460 gold_assert(static_cast<section_size_type>(pov - oview) == oview_size); 1461 gold_assert(static_cast<section_size_type>(got_pov - got_view) == got_size); 1462 1463 of->write_output_view(offset, oview_size, oview); 1464 of->write_output_view(got_file_offset, got_size, got_view); 1465 } 1466 1467 // Create the PLT section. 1468 1469 void 1470 Target_i386::make_plt_section(Symbol_table* symtab, Layout* layout) 1471 { 1472 if (this->plt_ == NULL) 1473 { 1474 // Create the GOT sections first. 1475 this->got_section(symtab, layout); 1476 1477 const bool dyn = parameters->options().output_is_position_independent(); 1478 this->plt_ = this->make_data_plt(layout, 1479 this->got_plt_, 1480 this->got_irelative_, 1481 dyn); 1482 1483 // Add unwind information if requested. 1484 if (parameters->options().ld_generated_unwind_info()) 1485 this->plt_->add_eh_frame(layout); 1486 1487 layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS, 1488 (elfcpp::SHF_ALLOC 1489 | elfcpp::SHF_EXECINSTR), 1490 this->plt_, ORDER_PLT, false); 1491 1492 // Make the sh_info field of .rel.plt point to .plt. 1493 Output_section* rel_plt_os = this->plt_->rel_plt()->output_section(); 1494 rel_plt_os->set_info_section(this->plt_->output_section()); 1495 } 1496 } 1497 1498 // Create a PLT entry for a global symbol. 1499 1500 void 1501 Target_i386::make_plt_entry(Symbol_table* symtab, Layout* layout, Symbol* gsym) 1502 { 1503 if (gsym->has_plt_offset()) 1504 return; 1505 if (this->plt_ == NULL) 1506 this->make_plt_section(symtab, layout); 1507 this->plt_->add_entry(symtab, layout, gsym); 1508 } 1509 1510 // Make a PLT entry for a local STT_GNU_IFUNC symbol. 1511 1512 void 1513 Target_i386::make_local_ifunc_plt_entry(Symbol_table* symtab, Layout* layout, 1514 Sized_relobj_file<32, false>* relobj, 1515 unsigned int local_sym_index) 1516 { 1517 if (relobj->local_has_plt_offset(local_sym_index)) 1518 return; 1519 if (this->plt_ == NULL) 1520 this->make_plt_section(symtab, layout); 1521 unsigned int plt_offset = this->plt_->add_local_ifunc_entry(symtab, layout, 1522 relobj, 1523 local_sym_index); 1524 relobj->set_local_plt_offset(local_sym_index, plt_offset); 1525 } 1526 1527 // Return the number of entries in the PLT. 1528 1529 unsigned int 1530 Target_i386::plt_entry_count() const 1531 { 1532 if (this->plt_ == NULL) 1533 return 0; 1534 return this->plt_->entry_count(); 1535 } 1536 1537 // Return the offset of the first non-reserved PLT entry. 1538 1539 unsigned int 1540 Target_i386::first_plt_entry_offset() const 1541 { 1542 return this->plt_->first_plt_entry_offset(); 1543 } 1544 1545 // Return the size of each PLT entry. 1546 1547 unsigned int 1548 Target_i386::plt_entry_size() const 1549 { 1550 return this->plt_->get_plt_entry_size(); 1551 } 1552 1553 // Get the section to use for TLS_DESC relocations. 1554 1555 Target_i386::Reloc_section* 1556 Target_i386::rel_tls_desc_section(Layout* layout) const 1557 { 1558 return this->plt_section()->rel_tls_desc(layout); 1559 } 1560 1561 // Define the _TLS_MODULE_BASE_ symbol in the TLS segment. 1562 1563 void 1564 Target_i386::define_tls_base_symbol(Symbol_table* symtab, Layout* layout) 1565 { 1566 if (this->tls_base_symbol_defined_) 1567 return; 1568 1569 Output_segment* tls_segment = layout->tls_segment(); 1570 if (tls_segment != NULL) 1571 { 1572 bool is_exec = parameters->options().output_is_executable(); 1573 symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL, 1574 Symbol_table::PREDEFINED, 1575 tls_segment, 0, 0, 1576 elfcpp::STT_TLS, 1577 elfcpp::STB_LOCAL, 1578 elfcpp::STV_HIDDEN, 0, 1579 (is_exec 1580 ? Symbol::SEGMENT_END 1581 : Symbol::SEGMENT_START), 1582 true); 1583 } 1584 this->tls_base_symbol_defined_ = true; 1585 } 1586 1587 // Create a GOT entry for the TLS module index. 1588 1589 unsigned int 1590 Target_i386::got_mod_index_entry(Symbol_table* symtab, Layout* layout, 1591 Sized_relobj_file<32, false>* object) 1592 { 1593 if (this->got_mod_index_offset_ == -1U) 1594 { 1595 gold_assert(symtab != NULL && layout != NULL && object != NULL); 1596 Reloc_section* rel_dyn = this->rel_dyn_section(layout); 1597 Output_data_got<32, false>* got = this->got_section(symtab, layout); 1598 unsigned int got_offset = got->add_constant(0); 1599 rel_dyn->add_local(object, 0, elfcpp::R_386_TLS_DTPMOD32, got, 1600 got_offset); 1601 got->add_constant(0); 1602 this->got_mod_index_offset_ = got_offset; 1603 } 1604 return this->got_mod_index_offset_; 1605 } 1606 1607 // Optimize the TLS relocation type based on what we know about the 1608 // symbol. IS_FINAL is true if the final address of this symbol is 1609 // known at link time. 1610 1611 tls::Tls_optimization 1612 Target_i386::optimize_tls_reloc(bool is_final, int r_type) 1613 { 1614 // If we are generating a shared library, then we can't do anything 1615 // in the linker. 1616 if (parameters->options().shared()) 1617 return tls::TLSOPT_NONE; 1618 1619 switch (r_type) 1620 { 1621 case elfcpp::R_386_TLS_GD: 1622 case elfcpp::R_386_TLS_GOTDESC: 1623 case elfcpp::R_386_TLS_DESC_CALL: 1624 // These are General-Dynamic which permits fully general TLS 1625 // access. Since we know that we are generating an executable, 1626 // we can convert this to Initial-Exec. If we also know that 1627 // this is a local symbol, we can further switch to Local-Exec. 1628 if (is_final) 1629 return tls::TLSOPT_TO_LE; 1630 return tls::TLSOPT_TO_IE; 1631 1632 case elfcpp::R_386_TLS_LDM: 1633 // This is Local-Dynamic, which refers to a local symbol in the 1634 // dynamic TLS block. Since we know that we generating an 1635 // executable, we can switch to Local-Exec. 1636 return tls::TLSOPT_TO_LE; 1637 1638 case elfcpp::R_386_TLS_LDO_32: 1639 // Another type of Local-Dynamic relocation. 1640 return tls::TLSOPT_TO_LE; 1641 1642 case elfcpp::R_386_TLS_IE: 1643 case elfcpp::R_386_TLS_GOTIE: 1644 case elfcpp::R_386_TLS_IE_32: 1645 // These are Initial-Exec relocs which get the thread offset 1646 // from the GOT. If we know that we are linking against the 1647 // local symbol, we can switch to Local-Exec, which links the 1648 // thread offset into the instruction. 1649 if (is_final) 1650 return tls::TLSOPT_TO_LE; 1651 return tls::TLSOPT_NONE; 1652 1653 case elfcpp::R_386_TLS_LE: 1654 case elfcpp::R_386_TLS_LE_32: 1655 // When we already have Local-Exec, there is nothing further we 1656 // can do. 1657 return tls::TLSOPT_NONE; 1658 1659 default: 1660 gold_unreachable(); 1661 } 1662 } 1663 1664 // Get the Reference_flags for a particular relocation. 1665 1666 int 1667 Target_i386::Scan::get_reference_flags(unsigned int r_type) 1668 { 1669 switch (r_type) 1670 { 1671 case elfcpp::R_386_NONE: 1672 case elfcpp::R_386_GNU_VTINHERIT: 1673 case elfcpp::R_386_GNU_VTENTRY: 1674 case elfcpp::R_386_GOTPC: 1675 // No symbol reference. 1676 return 0; 1677 1678 case elfcpp::R_386_32: 1679 case elfcpp::R_386_16: 1680 case elfcpp::R_386_8: 1681 return Symbol::ABSOLUTE_REF; 1682 1683 case elfcpp::R_386_PC32: 1684 case elfcpp::R_386_PC16: 1685 case elfcpp::R_386_PC8: 1686 case elfcpp::R_386_GOTOFF: 1687 return Symbol::RELATIVE_REF; 1688 1689 case elfcpp::R_386_PLT32: 1690 return Symbol::FUNCTION_CALL | Symbol::RELATIVE_REF; 1691 1692 case elfcpp::R_386_GOT32: 1693 // Absolute in GOT. 1694 return Symbol::ABSOLUTE_REF; 1695 1696 case elfcpp::R_386_TLS_GD: // Global-dynamic 1697 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url) 1698 case elfcpp::R_386_TLS_DESC_CALL: 1699 case elfcpp::R_386_TLS_LDM: // Local-dynamic 1700 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 1701 case elfcpp::R_386_TLS_IE: // Initial-exec 1702 case elfcpp::R_386_TLS_IE_32: 1703 case elfcpp::R_386_TLS_GOTIE: 1704 case elfcpp::R_386_TLS_LE: // Local-exec 1705 case elfcpp::R_386_TLS_LE_32: 1706 return Symbol::TLS_REF; 1707 1708 case elfcpp::R_386_COPY: 1709 case elfcpp::R_386_GLOB_DAT: 1710 case elfcpp::R_386_JUMP_SLOT: 1711 case elfcpp::R_386_RELATIVE: 1712 case elfcpp::R_386_IRELATIVE: 1713 case elfcpp::R_386_TLS_TPOFF: 1714 case elfcpp::R_386_TLS_DTPMOD32: 1715 case elfcpp::R_386_TLS_DTPOFF32: 1716 case elfcpp::R_386_TLS_TPOFF32: 1717 case elfcpp::R_386_TLS_DESC: 1718 case elfcpp::R_386_32PLT: 1719 case elfcpp::R_386_TLS_GD_32: 1720 case elfcpp::R_386_TLS_GD_PUSH: 1721 case elfcpp::R_386_TLS_GD_CALL: 1722 case elfcpp::R_386_TLS_GD_POP: 1723 case elfcpp::R_386_TLS_LDM_32: 1724 case elfcpp::R_386_TLS_LDM_PUSH: 1725 case elfcpp::R_386_TLS_LDM_CALL: 1726 case elfcpp::R_386_TLS_LDM_POP: 1727 case elfcpp::R_386_USED_BY_INTEL_200: 1728 default: 1729 // Not expected. We will give an error later. 1730 return 0; 1731 } 1732 } 1733 1734 // Report an unsupported relocation against a local symbol. 1735 1736 void 1737 Target_i386::Scan::unsupported_reloc_local(Sized_relobj_file<32, false>* object, 1738 unsigned int r_type) 1739 { 1740 gold_error(_("%s: unsupported reloc %u against local symbol"), 1741 object->name().c_str(), r_type); 1742 } 1743 1744 // Return whether we need to make a PLT entry for a relocation of a 1745 // given type against a STT_GNU_IFUNC symbol. 1746 1747 bool 1748 Target_i386::Scan::reloc_needs_plt_for_ifunc( 1749 Sized_relobj_file<32, false>* object, 1750 unsigned int r_type) 1751 { 1752 int flags = Scan::get_reference_flags(r_type); 1753 if (flags & Symbol::TLS_REF) 1754 gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"), 1755 object->name().c_str(), r_type); 1756 return flags != 0; 1757 } 1758 1759 // Scan a relocation for a local symbol. 1760 1761 inline void 1762 Target_i386::Scan::local(Symbol_table* symtab, 1763 Layout* layout, 1764 Target_i386* target, 1765 Sized_relobj_file<32, false>* object, 1766 unsigned int data_shndx, 1767 Output_section* output_section, 1768 const elfcpp::Rel<32, false>& reloc, 1769 unsigned int r_type, 1770 const elfcpp::Sym<32, false>& lsym, 1771 bool is_discarded) 1772 { 1773 if (is_discarded) 1774 return; 1775 1776 // A local STT_GNU_IFUNC symbol may require a PLT entry. 1777 if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC 1778 && this->reloc_needs_plt_for_ifunc(object, r_type)) 1779 { 1780 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 1781 target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym); 1782 } 1783 1784 switch (r_type) 1785 { 1786 case elfcpp::R_386_NONE: 1787 case elfcpp::R_386_GNU_VTINHERIT: 1788 case elfcpp::R_386_GNU_VTENTRY: 1789 break; 1790 1791 case elfcpp::R_386_32: 1792 // If building a shared library (or a position-independent 1793 // executable), we need to create a dynamic relocation for 1794 // this location. The relocation applied at link time will 1795 // apply the link-time value, so we flag the location with 1796 // an R_386_RELATIVE relocation so the dynamic loader can 1797 // relocate it easily. 1798 if (parameters->options().output_is_position_independent()) 1799 { 1800 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 1801 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 1802 rel_dyn->add_local_relative(object, r_sym, elfcpp::R_386_RELATIVE, 1803 output_section, data_shndx, 1804 reloc.get_r_offset()); 1805 } 1806 break; 1807 1808 case elfcpp::R_386_16: 1809 case elfcpp::R_386_8: 1810 // If building a shared library (or a position-independent 1811 // executable), we need to create a dynamic relocation for 1812 // this location. Because the addend needs to remain in the 1813 // data section, we need to be careful not to apply this 1814 // relocation statically. 1815 if (parameters->options().output_is_position_independent()) 1816 { 1817 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 1818 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 1819 if (lsym.get_st_type() != elfcpp::STT_SECTION) 1820 rel_dyn->add_local(object, r_sym, r_type, output_section, 1821 data_shndx, reloc.get_r_offset()); 1822 else 1823 { 1824 gold_assert(lsym.get_st_value() == 0); 1825 unsigned int shndx = lsym.get_st_shndx(); 1826 bool is_ordinary; 1827 shndx = object->adjust_sym_shndx(r_sym, shndx, 1828 &is_ordinary); 1829 if (!is_ordinary) 1830 object->error(_("section symbol %u has bad shndx %u"), 1831 r_sym, shndx); 1832 else 1833 rel_dyn->add_local_section(object, shndx, 1834 r_type, output_section, 1835 data_shndx, reloc.get_r_offset()); 1836 } 1837 } 1838 break; 1839 1840 case elfcpp::R_386_PC32: 1841 case elfcpp::R_386_PC16: 1842 case elfcpp::R_386_PC8: 1843 break; 1844 1845 case elfcpp::R_386_PLT32: 1846 // Since we know this is a local symbol, we can handle this as a 1847 // PC32 reloc. 1848 break; 1849 1850 case elfcpp::R_386_GOTOFF: 1851 case elfcpp::R_386_GOTPC: 1852 // We need a GOT section. 1853 target->got_section(symtab, layout); 1854 break; 1855 1856 case elfcpp::R_386_GOT32: 1857 { 1858 // We need GOT section. 1859 Output_data_got<32, false>* got = target->got_section(symtab, layout); 1860 1861 // If the relocation symbol isn't IFUNC, 1862 // and is local, then we will convert 1863 // mov foo@GOT(%reg), %reg 1864 // to 1865 // lea foo@GOTOFF(%reg), %reg 1866 // in Relocate::relocate. 1867 if (reloc.get_r_offset() >= 2 1868 && lsym.get_st_type() != elfcpp::STT_GNU_IFUNC) 1869 { 1870 section_size_type stype; 1871 const unsigned char* view = object->section_contents(data_shndx, 1872 &stype, true); 1873 if (view[reloc.get_r_offset() - 2] == 0x8b) 1874 break; 1875 } 1876 1877 // Otherwise, the symbol requires a GOT entry. 1878 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 1879 1880 // For a STT_GNU_IFUNC symbol we want the PLT offset. That 1881 // lets function pointers compare correctly with shared 1882 // libraries. Otherwise we would need an IRELATIVE reloc. 1883 bool is_new; 1884 if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC) 1885 is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD); 1886 else 1887 is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD); 1888 if (is_new) 1889 { 1890 // If we are generating a shared object, we need to add a 1891 // dynamic RELATIVE relocation for this symbol's GOT entry. 1892 if (parameters->options().output_is_position_independent()) 1893 { 1894 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 1895 unsigned int got_offset = 1896 object->local_got_offset(r_sym, GOT_TYPE_STANDARD); 1897 rel_dyn->add_local_relative(object, r_sym, 1898 elfcpp::R_386_RELATIVE, 1899 got, got_offset); 1900 } 1901 } 1902 } 1903 break; 1904 1905 // These are relocations which should only be seen by the 1906 // dynamic linker, and should never be seen here. 1907 case elfcpp::R_386_COPY: 1908 case elfcpp::R_386_GLOB_DAT: 1909 case elfcpp::R_386_JUMP_SLOT: 1910 case elfcpp::R_386_RELATIVE: 1911 case elfcpp::R_386_IRELATIVE: 1912 case elfcpp::R_386_TLS_TPOFF: 1913 case elfcpp::R_386_TLS_DTPMOD32: 1914 case elfcpp::R_386_TLS_DTPOFF32: 1915 case elfcpp::R_386_TLS_TPOFF32: 1916 case elfcpp::R_386_TLS_DESC: 1917 gold_error(_("%s: unexpected reloc %u in object file"), 1918 object->name().c_str(), r_type); 1919 break; 1920 1921 // These are initial TLS relocs, which are expected when 1922 // linking. 1923 case elfcpp::R_386_TLS_GD: // Global-dynamic 1924 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url) 1925 case elfcpp::R_386_TLS_DESC_CALL: 1926 case elfcpp::R_386_TLS_LDM: // Local-dynamic 1927 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 1928 case elfcpp::R_386_TLS_IE: // Initial-exec 1929 case elfcpp::R_386_TLS_IE_32: 1930 case elfcpp::R_386_TLS_GOTIE: 1931 case elfcpp::R_386_TLS_LE: // Local-exec 1932 case elfcpp::R_386_TLS_LE_32: 1933 { 1934 bool output_is_shared = parameters->options().shared(); 1935 const tls::Tls_optimization optimized_type 1936 = Target_i386::optimize_tls_reloc(!output_is_shared, r_type); 1937 switch (r_type) 1938 { 1939 case elfcpp::R_386_TLS_GD: // Global-dynamic 1940 if (optimized_type == tls::TLSOPT_NONE) 1941 { 1942 // Create a pair of GOT entries for the module index and 1943 // dtv-relative offset. 1944 Output_data_got<32, false>* got 1945 = target->got_section(symtab, layout); 1946 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 1947 unsigned int shndx = lsym.get_st_shndx(); 1948 bool is_ordinary; 1949 shndx = object->adjust_sym_shndx(r_sym, shndx, &is_ordinary); 1950 if (!is_ordinary) 1951 object->error(_("local symbol %u has bad shndx %u"), 1952 r_sym, shndx); 1953 else 1954 got->add_local_pair_with_rel(object, r_sym, shndx, 1955 GOT_TYPE_TLS_PAIR, 1956 target->rel_dyn_section(layout), 1957 elfcpp::R_386_TLS_DTPMOD32); 1958 } 1959 else if (optimized_type != tls::TLSOPT_TO_LE) 1960 unsupported_reloc_local(object, r_type); 1961 break; 1962 1963 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva) 1964 target->define_tls_base_symbol(symtab, layout); 1965 if (optimized_type == tls::TLSOPT_NONE) 1966 { 1967 // Create a double GOT entry with an R_386_TLS_DESC 1968 // reloc. The R_386_TLS_DESC reloc is resolved 1969 // lazily, so the GOT entry needs to be in an area in 1970 // .got.plt, not .got. Call got_section to make sure 1971 // the section has been created. 1972 target->got_section(symtab, layout); 1973 Output_data_got<32, false>* got = target->got_tlsdesc_section(); 1974 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 1975 if (!object->local_has_got_offset(r_sym, GOT_TYPE_TLS_DESC)) 1976 { 1977 unsigned int got_offset = got->add_constant(0); 1978 // The local symbol value is stored in the second 1979 // GOT entry. 1980 got->add_local(object, r_sym, GOT_TYPE_TLS_DESC); 1981 // That set the GOT offset of the local symbol to 1982 // point to the second entry, but we want it to 1983 // point to the first. 1984 object->set_local_got_offset(r_sym, GOT_TYPE_TLS_DESC, 1985 got_offset); 1986 Reloc_section* rt = target->rel_tls_desc_section(layout); 1987 rt->add_absolute(elfcpp::R_386_TLS_DESC, got, got_offset); 1988 } 1989 } 1990 else if (optimized_type != tls::TLSOPT_TO_LE) 1991 unsupported_reloc_local(object, r_type); 1992 break; 1993 1994 case elfcpp::R_386_TLS_DESC_CALL: 1995 break; 1996 1997 case elfcpp::R_386_TLS_LDM: // Local-dynamic 1998 if (optimized_type == tls::TLSOPT_NONE) 1999 { 2000 // Create a GOT entry for the module index. 2001 target->got_mod_index_entry(symtab, layout, object); 2002 } 2003 else if (optimized_type != tls::TLSOPT_TO_LE) 2004 unsupported_reloc_local(object, r_type); 2005 break; 2006 2007 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 2008 break; 2009 2010 case elfcpp::R_386_TLS_IE: // Initial-exec 2011 case elfcpp::R_386_TLS_IE_32: 2012 case elfcpp::R_386_TLS_GOTIE: 2013 layout->set_has_static_tls(); 2014 if (optimized_type == tls::TLSOPT_NONE) 2015 { 2016 // For the R_386_TLS_IE relocation, we need to create a 2017 // dynamic relocation when building a shared library. 2018 if (r_type == elfcpp::R_386_TLS_IE 2019 && parameters->options().shared()) 2020 { 2021 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2022 unsigned int r_sym 2023 = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 2024 rel_dyn->add_local_relative(object, r_sym, 2025 elfcpp::R_386_RELATIVE, 2026 output_section, data_shndx, 2027 reloc.get_r_offset()); 2028 } 2029 // Create a GOT entry for the tp-relative offset. 2030 Output_data_got<32, false>* got 2031 = target->got_section(symtab, layout); 2032 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 2033 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_IE_32 2034 ? elfcpp::R_386_TLS_TPOFF32 2035 : elfcpp::R_386_TLS_TPOFF); 2036 unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32 2037 ? GOT_TYPE_TLS_OFFSET 2038 : GOT_TYPE_TLS_NOFFSET); 2039 got->add_local_with_rel(object, r_sym, got_type, 2040 target->rel_dyn_section(layout), 2041 dyn_r_type); 2042 } 2043 else if (optimized_type != tls::TLSOPT_TO_LE) 2044 unsupported_reloc_local(object, r_type); 2045 break; 2046 2047 case elfcpp::R_386_TLS_LE: // Local-exec 2048 case elfcpp::R_386_TLS_LE_32: 2049 layout->set_has_static_tls(); 2050 if (output_is_shared) 2051 { 2052 // We need to create a dynamic relocation. 2053 gold_assert(lsym.get_st_type() != elfcpp::STT_SECTION); 2054 unsigned int r_sym = elfcpp::elf_r_sym<32>(reloc.get_r_info()); 2055 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_LE_32 2056 ? elfcpp::R_386_TLS_TPOFF32 2057 : elfcpp::R_386_TLS_TPOFF); 2058 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2059 rel_dyn->add_local(object, r_sym, dyn_r_type, output_section, 2060 data_shndx, reloc.get_r_offset()); 2061 } 2062 break; 2063 2064 default: 2065 gold_unreachable(); 2066 } 2067 } 2068 break; 2069 2070 case elfcpp::R_386_32PLT: 2071 case elfcpp::R_386_TLS_GD_32: 2072 case elfcpp::R_386_TLS_GD_PUSH: 2073 case elfcpp::R_386_TLS_GD_CALL: 2074 case elfcpp::R_386_TLS_GD_POP: 2075 case elfcpp::R_386_TLS_LDM_32: 2076 case elfcpp::R_386_TLS_LDM_PUSH: 2077 case elfcpp::R_386_TLS_LDM_CALL: 2078 case elfcpp::R_386_TLS_LDM_POP: 2079 case elfcpp::R_386_USED_BY_INTEL_200: 2080 default: 2081 unsupported_reloc_local(object, r_type); 2082 break; 2083 } 2084 } 2085 2086 // Report an unsupported relocation against a global symbol. 2087 2088 void 2089 Target_i386::Scan::unsupported_reloc_global( 2090 Sized_relobj_file<32, false>* object, 2091 unsigned int r_type, 2092 Symbol* gsym) 2093 { 2094 gold_error(_("%s: unsupported reloc %u against global symbol %s"), 2095 object->name().c_str(), r_type, gsym->demangled_name().c_str()); 2096 } 2097 2098 inline bool 2099 Target_i386::Scan::possible_function_pointer_reloc(unsigned int r_type) 2100 { 2101 switch (r_type) 2102 { 2103 case elfcpp::R_386_32: 2104 case elfcpp::R_386_16: 2105 case elfcpp::R_386_8: 2106 case elfcpp::R_386_GOTOFF: 2107 case elfcpp::R_386_GOT32: 2108 { 2109 return true; 2110 } 2111 default: 2112 return false; 2113 } 2114 return false; 2115 } 2116 2117 inline bool 2118 Target_i386::Scan::local_reloc_may_be_function_pointer( 2119 Symbol_table* , 2120 Layout* , 2121 Target_i386* , 2122 Sized_relobj_file<32, false>* , 2123 unsigned int , 2124 Output_section* , 2125 const elfcpp::Rel<32, false>& , 2126 unsigned int r_type, 2127 const elfcpp::Sym<32, false>&) 2128 { 2129 return possible_function_pointer_reloc(r_type); 2130 } 2131 2132 inline bool 2133 Target_i386::Scan::global_reloc_may_be_function_pointer( 2134 Symbol_table* , 2135 Layout* , 2136 Target_i386* , 2137 Sized_relobj_file<32, false>* , 2138 unsigned int , 2139 Output_section* , 2140 const elfcpp::Rel<32, false>& , 2141 unsigned int r_type, 2142 Symbol*) 2143 { 2144 return possible_function_pointer_reloc(r_type); 2145 } 2146 2147 // Scan a relocation for a global symbol. 2148 2149 inline void 2150 Target_i386::Scan::global(Symbol_table* symtab, 2151 Layout* layout, 2152 Target_i386* target, 2153 Sized_relobj_file<32, false>* object, 2154 unsigned int data_shndx, 2155 Output_section* output_section, 2156 const elfcpp::Rel<32, false>& reloc, 2157 unsigned int r_type, 2158 Symbol* gsym) 2159 { 2160 // A STT_GNU_IFUNC symbol may require a PLT entry. 2161 if (gsym->type() == elfcpp::STT_GNU_IFUNC 2162 && this->reloc_needs_plt_for_ifunc(object, r_type)) 2163 target->make_plt_entry(symtab, layout, gsym); 2164 2165 switch (r_type) 2166 { 2167 case elfcpp::R_386_NONE: 2168 case elfcpp::R_386_GNU_VTINHERIT: 2169 case elfcpp::R_386_GNU_VTENTRY: 2170 break; 2171 2172 case elfcpp::R_386_32: 2173 case elfcpp::R_386_16: 2174 case elfcpp::R_386_8: 2175 { 2176 // Make a PLT entry if necessary. 2177 if (gsym->needs_plt_entry()) 2178 { 2179 target->make_plt_entry(symtab, layout, gsym); 2180 // Since this is not a PC-relative relocation, we may be 2181 // taking the address of a function. In that case we need to 2182 // set the entry in the dynamic symbol table to the address of 2183 // the PLT entry. 2184 if (gsym->is_from_dynobj() && !parameters->options().shared()) 2185 gsym->set_needs_dynsym_value(); 2186 } 2187 // Make a dynamic relocation if necessary. 2188 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type))) 2189 { 2190 if (!parameters->options().output_is_position_independent() 2191 && gsym->may_need_copy_reloc()) 2192 { 2193 target->copy_reloc(symtab, layout, object, 2194 data_shndx, output_section, gsym, reloc); 2195 } 2196 else if (r_type == elfcpp::R_386_32 2197 && gsym->type() == elfcpp::STT_GNU_IFUNC 2198 && gsym->can_use_relative_reloc(false) 2199 && !gsym->is_from_dynobj() 2200 && !gsym->is_undefined() 2201 && !gsym->is_preemptible()) 2202 { 2203 // Use an IRELATIVE reloc for a locally defined 2204 // STT_GNU_IFUNC symbol. This makes a function 2205 // address in a PIE executable match the address in a 2206 // shared library that it links against. 2207 Reloc_section* rel_dyn = target->rel_irelative_section(layout); 2208 rel_dyn->add_symbolless_global_addend(gsym, 2209 elfcpp::R_386_IRELATIVE, 2210 output_section, 2211 object, data_shndx, 2212 reloc.get_r_offset()); 2213 } 2214 else if (r_type == elfcpp::R_386_32 2215 && gsym->can_use_relative_reloc(false)) 2216 { 2217 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2218 rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE, 2219 output_section, object, 2220 data_shndx, reloc.get_r_offset()); 2221 } 2222 else 2223 { 2224 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2225 rel_dyn->add_global(gsym, r_type, output_section, object, 2226 data_shndx, reloc.get_r_offset()); 2227 } 2228 } 2229 } 2230 break; 2231 2232 case elfcpp::R_386_PC32: 2233 case elfcpp::R_386_PC16: 2234 case elfcpp::R_386_PC8: 2235 { 2236 // Make a PLT entry if necessary. 2237 if (gsym->needs_plt_entry()) 2238 { 2239 // These relocations are used for function calls only in 2240 // non-PIC code. For a 32-bit relocation in a shared library, 2241 // we'll need a text relocation anyway, so we can skip the 2242 // PLT entry and let the dynamic linker bind the call directly 2243 // to the target. For smaller relocations, we should use a 2244 // PLT entry to ensure that the call can reach. 2245 if (!parameters->options().shared() 2246 || r_type != elfcpp::R_386_PC32) 2247 target->make_plt_entry(symtab, layout, gsym); 2248 } 2249 // Make a dynamic relocation if necessary. 2250 if (gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type))) 2251 { 2252 if (parameters->options().output_is_executable() 2253 && gsym->may_need_copy_reloc()) 2254 { 2255 target->copy_reloc(symtab, layout, object, 2256 data_shndx, output_section, gsym, reloc); 2257 } 2258 else 2259 { 2260 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2261 rel_dyn->add_global(gsym, r_type, output_section, object, 2262 data_shndx, reloc.get_r_offset()); 2263 } 2264 } 2265 } 2266 break; 2267 2268 case elfcpp::R_386_GOT32: 2269 { 2270 // The symbol requires a GOT section. 2271 Output_data_got<32, false>* got = target->got_section(symtab, layout); 2272 2273 // If we convert this from 2274 // mov foo@GOT(%reg), %reg 2275 // to 2276 // lea foo@GOTOFF(%reg), %reg 2277 // in Relocate::relocate, then there is nothing to do here. 2278 if (reloc.get_r_offset() >= 2 2279 && Target_i386::can_convert_mov_to_lea(gsym)) 2280 { 2281 section_size_type stype; 2282 const unsigned char* view = object->section_contents(data_shndx, 2283 &stype, true); 2284 if (view[reloc.get_r_offset() - 2] == 0x8b) 2285 break; 2286 } 2287 2288 if (gsym->final_value_is_known()) 2289 { 2290 // For a STT_GNU_IFUNC symbol we want the PLT address. 2291 if (gsym->type() == elfcpp::STT_GNU_IFUNC) 2292 got->add_global_plt(gsym, GOT_TYPE_STANDARD); 2293 else 2294 got->add_global(gsym, GOT_TYPE_STANDARD); 2295 } 2296 else 2297 { 2298 // If this symbol is not fully resolved, we need to add a 2299 // GOT entry with a dynamic relocation. 2300 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2301 2302 // Use a GLOB_DAT rather than a RELATIVE reloc if: 2303 // 2304 // 1) The symbol may be defined in some other module. 2305 // 2306 // 2) We are building a shared library and this is a 2307 // protected symbol; using GLOB_DAT means that the dynamic 2308 // linker can use the address of the PLT in the main 2309 // executable when appropriate so that function address 2310 // comparisons work. 2311 // 2312 // 3) This is a STT_GNU_IFUNC symbol in position dependent 2313 // code, again so that function address comparisons work. 2314 if (gsym->is_from_dynobj() 2315 || gsym->is_undefined() 2316 || gsym->is_preemptible() 2317 || (gsym->visibility() == elfcpp::STV_PROTECTED 2318 && parameters->options().shared()) 2319 || (gsym->type() == elfcpp::STT_GNU_IFUNC 2320 && parameters->options().output_is_position_independent())) 2321 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD, 2322 rel_dyn, elfcpp::R_386_GLOB_DAT); 2323 else 2324 { 2325 // For a STT_GNU_IFUNC symbol we want to write the PLT 2326 // offset into the GOT, so that function pointer 2327 // comparisons work correctly. 2328 bool is_new; 2329 if (gsym->type() != elfcpp::STT_GNU_IFUNC) 2330 is_new = got->add_global(gsym, GOT_TYPE_STANDARD); 2331 else 2332 { 2333 is_new = got->add_global_plt(gsym, GOT_TYPE_STANDARD); 2334 // Tell the dynamic linker to use the PLT address 2335 // when resolving relocations. 2336 if (gsym->is_from_dynobj() 2337 && !parameters->options().shared()) 2338 gsym->set_needs_dynsym_value(); 2339 } 2340 if (is_new) 2341 { 2342 unsigned int got_off = gsym->got_offset(GOT_TYPE_STANDARD); 2343 rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE, 2344 got, got_off); 2345 } 2346 } 2347 } 2348 } 2349 break; 2350 2351 case elfcpp::R_386_PLT32: 2352 // If the symbol is fully resolved, this is just a PC32 reloc. 2353 // Otherwise we need a PLT entry. 2354 if (gsym->final_value_is_known()) 2355 break; 2356 // If building a shared library, we can also skip the PLT entry 2357 // if the symbol is defined in the output file and is protected 2358 // or hidden. 2359 if (gsym->is_defined() 2360 && !gsym->is_from_dynobj() 2361 && !gsym->is_preemptible()) 2362 break; 2363 target->make_plt_entry(symtab, layout, gsym); 2364 break; 2365 2366 case elfcpp::R_386_GOTOFF: 2367 case elfcpp::R_386_GOTPC: 2368 // We need a GOT section. 2369 target->got_section(symtab, layout); 2370 break; 2371 2372 // These are relocations which should only be seen by the 2373 // dynamic linker, and should never be seen here. 2374 case elfcpp::R_386_COPY: 2375 case elfcpp::R_386_GLOB_DAT: 2376 case elfcpp::R_386_JUMP_SLOT: 2377 case elfcpp::R_386_RELATIVE: 2378 case elfcpp::R_386_IRELATIVE: 2379 case elfcpp::R_386_TLS_TPOFF: 2380 case elfcpp::R_386_TLS_DTPMOD32: 2381 case elfcpp::R_386_TLS_DTPOFF32: 2382 case elfcpp::R_386_TLS_TPOFF32: 2383 case elfcpp::R_386_TLS_DESC: 2384 gold_error(_("%s: unexpected reloc %u in object file"), 2385 object->name().c_str(), r_type); 2386 break; 2387 2388 // These are initial tls relocs, which are expected when 2389 // linking. 2390 case elfcpp::R_386_TLS_GD: // Global-dynamic 2391 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url) 2392 case elfcpp::R_386_TLS_DESC_CALL: 2393 case elfcpp::R_386_TLS_LDM: // Local-dynamic 2394 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 2395 case elfcpp::R_386_TLS_IE: // Initial-exec 2396 case elfcpp::R_386_TLS_IE_32: 2397 case elfcpp::R_386_TLS_GOTIE: 2398 case elfcpp::R_386_TLS_LE: // Local-exec 2399 case elfcpp::R_386_TLS_LE_32: 2400 { 2401 const bool is_final = gsym->final_value_is_known(); 2402 const tls::Tls_optimization optimized_type 2403 = Target_i386::optimize_tls_reloc(is_final, r_type); 2404 switch (r_type) 2405 { 2406 case elfcpp::R_386_TLS_GD: // Global-dynamic 2407 if (optimized_type == tls::TLSOPT_NONE) 2408 { 2409 // Create a pair of GOT entries for the module index and 2410 // dtv-relative offset. 2411 Output_data_got<32, false>* got 2412 = target->got_section(symtab, layout); 2413 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_PAIR, 2414 target->rel_dyn_section(layout), 2415 elfcpp::R_386_TLS_DTPMOD32, 2416 elfcpp::R_386_TLS_DTPOFF32); 2417 } 2418 else if (optimized_type == tls::TLSOPT_TO_IE) 2419 { 2420 // Create a GOT entry for the tp-relative offset. 2421 Output_data_got<32, false>* got 2422 = target->got_section(symtab, layout); 2423 got->add_global_with_rel(gsym, GOT_TYPE_TLS_NOFFSET, 2424 target->rel_dyn_section(layout), 2425 elfcpp::R_386_TLS_TPOFF); 2426 } 2427 else if (optimized_type != tls::TLSOPT_TO_LE) 2428 unsupported_reloc_global(object, r_type, gsym); 2429 break; 2430 2431 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (~oliva url) 2432 target->define_tls_base_symbol(symtab, layout); 2433 if (optimized_type == tls::TLSOPT_NONE) 2434 { 2435 // Create a double GOT entry with an R_386_TLS_DESC 2436 // reloc. The R_386_TLS_DESC reloc is resolved 2437 // lazily, so the GOT entry needs to be in an area in 2438 // .got.plt, not .got. Call got_section to make sure 2439 // the section has been created. 2440 target->got_section(symtab, layout); 2441 Output_data_got<32, false>* got = target->got_tlsdesc_section(); 2442 Reloc_section* rt = target->rel_tls_desc_section(layout); 2443 got->add_global_pair_with_rel(gsym, GOT_TYPE_TLS_DESC, rt, 2444 elfcpp::R_386_TLS_DESC, 0); 2445 } 2446 else if (optimized_type == tls::TLSOPT_TO_IE) 2447 { 2448 // Create a GOT entry for the tp-relative offset. 2449 Output_data_got<32, false>* got 2450 = target->got_section(symtab, layout); 2451 got->add_global_with_rel(gsym, GOT_TYPE_TLS_NOFFSET, 2452 target->rel_dyn_section(layout), 2453 elfcpp::R_386_TLS_TPOFF); 2454 } 2455 else if (optimized_type != tls::TLSOPT_TO_LE) 2456 unsupported_reloc_global(object, r_type, gsym); 2457 break; 2458 2459 case elfcpp::R_386_TLS_DESC_CALL: 2460 break; 2461 2462 case elfcpp::R_386_TLS_LDM: // Local-dynamic 2463 if (optimized_type == tls::TLSOPT_NONE) 2464 { 2465 // Create a GOT entry for the module index. 2466 target->got_mod_index_entry(symtab, layout, object); 2467 } 2468 else if (optimized_type != tls::TLSOPT_TO_LE) 2469 unsupported_reloc_global(object, r_type, gsym); 2470 break; 2471 2472 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 2473 break; 2474 2475 case elfcpp::R_386_TLS_IE: // Initial-exec 2476 case elfcpp::R_386_TLS_IE_32: 2477 case elfcpp::R_386_TLS_GOTIE: 2478 layout->set_has_static_tls(); 2479 if (optimized_type == tls::TLSOPT_NONE) 2480 { 2481 // For the R_386_TLS_IE relocation, we need to create a 2482 // dynamic relocation when building a shared library. 2483 if (r_type == elfcpp::R_386_TLS_IE 2484 && parameters->options().shared()) 2485 { 2486 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2487 rel_dyn->add_global_relative(gsym, elfcpp::R_386_RELATIVE, 2488 output_section, object, 2489 data_shndx, 2490 reloc.get_r_offset()); 2491 } 2492 // Create a GOT entry for the tp-relative offset. 2493 Output_data_got<32, false>* got 2494 = target->got_section(symtab, layout); 2495 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_IE_32 2496 ? elfcpp::R_386_TLS_TPOFF32 2497 : elfcpp::R_386_TLS_TPOFF); 2498 unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32 2499 ? GOT_TYPE_TLS_OFFSET 2500 : GOT_TYPE_TLS_NOFFSET); 2501 got->add_global_with_rel(gsym, got_type, 2502 target->rel_dyn_section(layout), 2503 dyn_r_type); 2504 } 2505 else if (optimized_type != tls::TLSOPT_TO_LE) 2506 unsupported_reloc_global(object, r_type, gsym); 2507 break; 2508 2509 case elfcpp::R_386_TLS_LE: // Local-exec 2510 case elfcpp::R_386_TLS_LE_32: 2511 layout->set_has_static_tls(); 2512 if (parameters->options().shared()) 2513 { 2514 // We need to create a dynamic relocation. 2515 unsigned int dyn_r_type = (r_type == elfcpp::R_386_TLS_LE_32 2516 ? elfcpp::R_386_TLS_TPOFF32 2517 : elfcpp::R_386_TLS_TPOFF); 2518 Reloc_section* rel_dyn = target->rel_dyn_section(layout); 2519 rel_dyn->add_global(gsym, dyn_r_type, output_section, object, 2520 data_shndx, reloc.get_r_offset()); 2521 } 2522 break; 2523 2524 default: 2525 gold_unreachable(); 2526 } 2527 } 2528 break; 2529 2530 case elfcpp::R_386_32PLT: 2531 case elfcpp::R_386_TLS_GD_32: 2532 case elfcpp::R_386_TLS_GD_PUSH: 2533 case elfcpp::R_386_TLS_GD_CALL: 2534 case elfcpp::R_386_TLS_GD_POP: 2535 case elfcpp::R_386_TLS_LDM_32: 2536 case elfcpp::R_386_TLS_LDM_PUSH: 2537 case elfcpp::R_386_TLS_LDM_CALL: 2538 case elfcpp::R_386_TLS_LDM_POP: 2539 case elfcpp::R_386_USED_BY_INTEL_200: 2540 default: 2541 unsupported_reloc_global(object, r_type, gsym); 2542 break; 2543 } 2544 } 2545 2546 // Process relocations for gc. 2547 2548 void 2549 Target_i386::gc_process_relocs(Symbol_table* symtab, 2550 Layout* layout, 2551 Sized_relobj_file<32, false>* object, 2552 unsigned int data_shndx, 2553 unsigned int, 2554 const unsigned char* prelocs, 2555 size_t reloc_count, 2556 Output_section* output_section, 2557 bool needs_special_offset_handling, 2558 size_t local_symbol_count, 2559 const unsigned char* plocal_symbols) 2560 { 2561 gold::gc_process_relocs<32, false, Target_i386, elfcpp::SHT_REL, 2562 Target_i386::Scan, 2563 Target_i386::Relocatable_size_for_reloc>( 2564 symtab, 2565 layout, 2566 this, 2567 object, 2568 data_shndx, 2569 prelocs, 2570 reloc_count, 2571 output_section, 2572 needs_special_offset_handling, 2573 local_symbol_count, 2574 plocal_symbols); 2575 } 2576 2577 // Scan relocations for a section. 2578 2579 void 2580 Target_i386::scan_relocs(Symbol_table* symtab, 2581 Layout* layout, 2582 Sized_relobj_file<32, false>* object, 2583 unsigned int data_shndx, 2584 unsigned int sh_type, 2585 const unsigned char* prelocs, 2586 size_t reloc_count, 2587 Output_section* output_section, 2588 bool needs_special_offset_handling, 2589 size_t local_symbol_count, 2590 const unsigned char* plocal_symbols) 2591 { 2592 if (sh_type == elfcpp::SHT_RELA) 2593 { 2594 gold_error(_("%s: unsupported RELA reloc section"), 2595 object->name().c_str()); 2596 return; 2597 } 2598 2599 gold::scan_relocs<32, false, Target_i386, elfcpp::SHT_REL, 2600 Target_i386::Scan>( 2601 symtab, 2602 layout, 2603 this, 2604 object, 2605 data_shndx, 2606 prelocs, 2607 reloc_count, 2608 output_section, 2609 needs_special_offset_handling, 2610 local_symbol_count, 2611 plocal_symbols); 2612 } 2613 2614 // Finalize the sections. 2615 2616 void 2617 Target_i386::do_finalize_sections( 2618 Layout* layout, 2619 const Input_objects*, 2620 Symbol_table* symtab) 2621 { 2622 const Reloc_section* rel_plt = (this->plt_ == NULL 2623 ? NULL 2624 : this->plt_->rel_plt()); 2625 layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt, 2626 this->rel_dyn_, true, false); 2627 2628 // Emit any relocs we saved in an attempt to avoid generating COPY 2629 // relocs. 2630 if (this->copy_relocs_.any_saved_relocs()) 2631 this->copy_relocs_.emit(this->rel_dyn_section(layout)); 2632 2633 // Set the size of the _GLOBAL_OFFSET_TABLE_ symbol to the size of 2634 // the .got.plt section. 2635 Symbol* sym = this->global_offset_table_; 2636 if (sym != NULL) 2637 { 2638 uint32_t data_size = this->got_plt_->current_data_size(); 2639 symtab->get_sized_symbol<32>(sym)->set_symsize(data_size); 2640 } 2641 2642 if (parameters->doing_static_link() 2643 && (this->plt_ == NULL || !this->plt_->has_irelative_section())) 2644 { 2645 // If linking statically, make sure that the __rel_iplt symbols 2646 // were defined if necessary, even if we didn't create a PLT. 2647 static const Define_symbol_in_segment syms[] = 2648 { 2649 { 2650 "__rel_iplt_start", // name 2651 elfcpp::PT_LOAD, // segment_type 2652 elfcpp::PF_W, // segment_flags_set 2653 elfcpp::PF(0), // segment_flags_clear 2654 0, // value 2655 0, // size 2656 elfcpp::STT_NOTYPE, // type 2657 elfcpp::STB_GLOBAL, // binding 2658 elfcpp::STV_HIDDEN, // visibility 2659 0, // nonvis 2660 Symbol::SEGMENT_START, // offset_from_base 2661 true // only_if_ref 2662 }, 2663 { 2664 "__rel_iplt_end", // name 2665 elfcpp::PT_LOAD, // segment_type 2666 elfcpp::PF_W, // segment_flags_set 2667 elfcpp::PF(0), // segment_flags_clear 2668 0, // value 2669 0, // size 2670 elfcpp::STT_NOTYPE, // type 2671 elfcpp::STB_GLOBAL, // binding 2672 elfcpp::STV_HIDDEN, // visibility 2673 0, // nonvis 2674 Symbol::SEGMENT_START, // offset_from_base 2675 true // only_if_ref 2676 } 2677 }; 2678 2679 symtab->define_symbols(layout, 2, syms, 2680 layout->script_options()->saw_sections_clause()); 2681 } 2682 } 2683 2684 // Return whether a direct absolute static relocation needs to be applied. 2685 // In cases where Scan::local() or Scan::global() has created 2686 // a dynamic relocation other than R_386_RELATIVE, the addend 2687 // of the relocation is carried in the data, and we must not 2688 // apply the static relocation. 2689 2690 inline bool 2691 Target_i386::Relocate::should_apply_static_reloc(const Sized_symbol<32>* gsym, 2692 unsigned int r_type, 2693 bool is_32bit, 2694 Output_section* output_section) 2695 { 2696 // If the output section is not allocated, then we didn't call 2697 // scan_relocs, we didn't create a dynamic reloc, and we must apply 2698 // the reloc here. 2699 if ((output_section->flags() & elfcpp::SHF_ALLOC) == 0) 2700 return true; 2701 2702 int ref_flags = Scan::get_reference_flags(r_type); 2703 2704 // For local symbols, we will have created a non-RELATIVE dynamic 2705 // relocation only if (a) the output is position independent, 2706 // (b) the relocation is absolute (not pc- or segment-relative), and 2707 // (c) the relocation is not 32 bits wide. 2708 if (gsym == NULL) 2709 return !(parameters->options().output_is_position_independent() 2710 && (ref_flags & Symbol::ABSOLUTE_REF) 2711 && !is_32bit); 2712 2713 // For global symbols, we use the same helper routines used in the 2714 // scan pass. If we did not create a dynamic relocation, or if we 2715 // created a RELATIVE dynamic relocation, we should apply the static 2716 // relocation. 2717 bool has_dyn = gsym->needs_dynamic_reloc(ref_flags); 2718 bool is_rel = (ref_flags & Symbol::ABSOLUTE_REF) 2719 && gsym->can_use_relative_reloc(ref_flags 2720 & Symbol::FUNCTION_CALL); 2721 return !has_dyn || is_rel; 2722 } 2723 2724 // Perform a relocation. 2725 2726 inline bool 2727 Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, 2728 Target_i386* target, 2729 Output_section* output_section, 2730 size_t relnum, 2731 const elfcpp::Rel<32, false>& rel, 2732 unsigned int r_type, 2733 const Sized_symbol<32>* gsym, 2734 const Symbol_value<32>* psymval, 2735 unsigned char* view, 2736 elfcpp::Elf_types<32>::Elf_Addr address, 2737 section_size_type view_size) 2738 { 2739 if (this->skip_call_tls_get_addr_) 2740 { 2741 if ((r_type != elfcpp::R_386_PLT32 2742 && r_type != elfcpp::R_386_PC32) 2743 || gsym == NULL 2744 || strcmp(gsym->name(), "___tls_get_addr") != 0) 2745 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 2746 _("missing expected TLS relocation")); 2747 else 2748 { 2749 this->skip_call_tls_get_addr_ = false; 2750 return false; 2751 } 2752 } 2753 2754 if (view == NULL) 2755 return true; 2756 2757 const Sized_relobj_file<32, false>* object = relinfo->object; 2758 2759 // Pick the value to use for symbols defined in shared objects. 2760 Symbol_value<32> symval; 2761 if (gsym != NULL 2762 && gsym->type() == elfcpp::STT_GNU_IFUNC 2763 && r_type == elfcpp::R_386_32 2764 && gsym->needs_dynamic_reloc(Scan::get_reference_flags(r_type)) 2765 && gsym->can_use_relative_reloc(false) 2766 && !gsym->is_from_dynobj() 2767 && !gsym->is_undefined() 2768 && !gsym->is_preemptible()) 2769 { 2770 // In this case we are generating a R_386_IRELATIVE reloc. We 2771 // want to use the real value of the symbol, not the PLT offset. 2772 } 2773 else if (gsym != NULL 2774 && gsym->use_plt_offset(Scan::get_reference_flags(r_type))) 2775 { 2776 symval.set_output_value(target->plt_address_for_global(gsym)); 2777 psymval = &symval; 2778 } 2779 else if (gsym == NULL && psymval->is_ifunc_symbol()) 2780 { 2781 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info()); 2782 if (object->local_has_plt_offset(r_sym)) 2783 { 2784 symval.set_output_value(target->plt_address_for_local(object, r_sym)); 2785 psymval = &symval; 2786 } 2787 } 2788 2789 switch (r_type) 2790 { 2791 case elfcpp::R_386_NONE: 2792 case elfcpp::R_386_GNU_VTINHERIT: 2793 case elfcpp::R_386_GNU_VTENTRY: 2794 break; 2795 2796 case elfcpp::R_386_32: 2797 if (should_apply_static_reloc(gsym, r_type, true, output_section)) 2798 Relocate_functions<32, false>::rel32(view, object, psymval); 2799 break; 2800 2801 case elfcpp::R_386_PC32: 2802 if (should_apply_static_reloc(gsym, r_type, true, output_section)) 2803 Relocate_functions<32, false>::pcrel32(view, object, psymval, address); 2804 break; 2805 2806 case elfcpp::R_386_16: 2807 if (should_apply_static_reloc(gsym, r_type, false, output_section)) 2808 Relocate_functions<32, false>::rel16(view, object, psymval); 2809 break; 2810 2811 case elfcpp::R_386_PC16: 2812 if (should_apply_static_reloc(gsym, r_type, false, output_section)) 2813 Relocate_functions<32, false>::pcrel16(view, object, psymval, address); 2814 break; 2815 2816 case elfcpp::R_386_8: 2817 if (should_apply_static_reloc(gsym, r_type, false, output_section)) 2818 Relocate_functions<32, false>::rel8(view, object, psymval); 2819 break; 2820 2821 case elfcpp::R_386_PC8: 2822 if (should_apply_static_reloc(gsym, r_type, false, output_section)) 2823 Relocate_functions<32, false>::pcrel8(view, object, psymval, address); 2824 break; 2825 2826 case elfcpp::R_386_PLT32: 2827 gold_assert(gsym == NULL 2828 || gsym->has_plt_offset() 2829 || gsym->final_value_is_known() 2830 || (gsym->is_defined() 2831 && !gsym->is_from_dynobj() 2832 && !gsym->is_preemptible())); 2833 Relocate_functions<32, false>::pcrel32(view, object, psymval, address); 2834 break; 2835 2836 case elfcpp::R_386_GOT32: 2837 // Convert 2838 // mov foo@GOT(%reg), %reg 2839 // to 2840 // lea foo@GOTOFF(%reg), %reg 2841 // if possible. 2842 if (rel.get_r_offset() >= 2 2843 && view[-2] == 0x8b 2844 && ((gsym == NULL && !psymval->is_ifunc_symbol()) 2845 || (gsym != NULL 2846 && Target_i386::can_convert_mov_to_lea(gsym)))) 2847 { 2848 view[-2] = 0x8d; 2849 elfcpp::Elf_types<32>::Elf_Addr value; 2850 value = (psymval->value(object, 0) 2851 - target->got_plt_section()->address()); 2852 Relocate_functions<32, false>::rel32(view, value); 2853 } 2854 else 2855 { 2856 // The GOT pointer points to the end of the GOT section. 2857 // We need to subtract the size of the GOT section to get 2858 // the actual offset to use in the relocation. 2859 unsigned int got_offset = 0; 2860 if (gsym != NULL) 2861 { 2862 gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD)); 2863 got_offset = (gsym->got_offset(GOT_TYPE_STANDARD) 2864 - target->got_size()); 2865 } 2866 else 2867 { 2868 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info()); 2869 gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD)); 2870 got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD) 2871 - target->got_size()); 2872 } 2873 Relocate_functions<32, false>::rel32(view, got_offset); 2874 } 2875 break; 2876 2877 case elfcpp::R_386_GOTOFF: 2878 { 2879 elfcpp::Elf_types<32>::Elf_Addr value; 2880 value = (psymval->value(object, 0) 2881 - target->got_plt_section()->address()); 2882 Relocate_functions<32, false>::rel32(view, value); 2883 } 2884 break; 2885 2886 case elfcpp::R_386_GOTPC: 2887 { 2888 elfcpp::Elf_types<32>::Elf_Addr value; 2889 value = target->got_plt_section()->address(); 2890 Relocate_functions<32, false>::pcrel32(view, value, address); 2891 } 2892 break; 2893 2894 case elfcpp::R_386_COPY: 2895 case elfcpp::R_386_GLOB_DAT: 2896 case elfcpp::R_386_JUMP_SLOT: 2897 case elfcpp::R_386_RELATIVE: 2898 case elfcpp::R_386_IRELATIVE: 2899 // These are outstanding tls relocs, which are unexpected when 2900 // linking. 2901 case elfcpp::R_386_TLS_TPOFF: 2902 case elfcpp::R_386_TLS_DTPMOD32: 2903 case elfcpp::R_386_TLS_DTPOFF32: 2904 case elfcpp::R_386_TLS_TPOFF32: 2905 case elfcpp::R_386_TLS_DESC: 2906 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 2907 _("unexpected reloc %u in object file"), 2908 r_type); 2909 break; 2910 2911 // These are initial tls relocs, which are expected when 2912 // linking. 2913 case elfcpp::R_386_TLS_GD: // Global-dynamic 2914 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url) 2915 case elfcpp::R_386_TLS_DESC_CALL: 2916 case elfcpp::R_386_TLS_LDM: // Local-dynamic 2917 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 2918 case elfcpp::R_386_TLS_IE: // Initial-exec 2919 case elfcpp::R_386_TLS_IE_32: 2920 case elfcpp::R_386_TLS_GOTIE: 2921 case elfcpp::R_386_TLS_LE: // Local-exec 2922 case elfcpp::R_386_TLS_LE_32: 2923 this->relocate_tls(relinfo, target, relnum, rel, r_type, gsym, psymval, 2924 view, address, view_size); 2925 break; 2926 2927 case elfcpp::R_386_32PLT: 2928 case elfcpp::R_386_TLS_GD_32: 2929 case elfcpp::R_386_TLS_GD_PUSH: 2930 case elfcpp::R_386_TLS_GD_CALL: 2931 case elfcpp::R_386_TLS_GD_POP: 2932 case elfcpp::R_386_TLS_LDM_32: 2933 case elfcpp::R_386_TLS_LDM_PUSH: 2934 case elfcpp::R_386_TLS_LDM_CALL: 2935 case elfcpp::R_386_TLS_LDM_POP: 2936 case elfcpp::R_386_USED_BY_INTEL_200: 2937 default: 2938 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 2939 _("unsupported reloc %u"), 2940 r_type); 2941 break; 2942 } 2943 2944 return true; 2945 } 2946 2947 // Perform a TLS relocation. 2948 2949 inline void 2950 Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo, 2951 Target_i386* target, 2952 size_t relnum, 2953 const elfcpp::Rel<32, false>& rel, 2954 unsigned int r_type, 2955 const Sized_symbol<32>* gsym, 2956 const Symbol_value<32>* psymval, 2957 unsigned char* view, 2958 elfcpp::Elf_types<32>::Elf_Addr, 2959 section_size_type view_size) 2960 { 2961 Output_segment* tls_segment = relinfo->layout->tls_segment(); 2962 2963 const Sized_relobj_file<32, false>* object = relinfo->object; 2964 2965 elfcpp::Elf_types<32>::Elf_Addr value = psymval->value(object, 0); 2966 2967 const bool is_final = (gsym == NULL 2968 ? !parameters->options().shared() 2969 : gsym->final_value_is_known()); 2970 const tls::Tls_optimization optimized_type 2971 = Target_i386::optimize_tls_reloc(is_final, r_type); 2972 switch (r_type) 2973 { 2974 case elfcpp::R_386_TLS_GD: // Global-dynamic 2975 if (optimized_type == tls::TLSOPT_TO_LE) 2976 { 2977 if (tls_segment == NULL) 2978 { 2979 gold_assert(parameters->errors()->error_count() > 0 2980 || issue_undefined_symbol_error(gsym)); 2981 return; 2982 } 2983 this->tls_gd_to_le(relinfo, relnum, tls_segment, 2984 rel, r_type, value, view, 2985 view_size); 2986 break; 2987 } 2988 else 2989 { 2990 unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE 2991 ? GOT_TYPE_TLS_NOFFSET 2992 : GOT_TYPE_TLS_PAIR); 2993 unsigned int got_offset; 2994 if (gsym != NULL) 2995 { 2996 gold_assert(gsym->has_got_offset(got_type)); 2997 got_offset = gsym->got_offset(got_type) - target->got_size(); 2998 } 2999 else 3000 { 3001 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info()); 3002 gold_assert(object->local_has_got_offset(r_sym, got_type)); 3003 got_offset = (object->local_got_offset(r_sym, got_type) 3004 - target->got_size()); 3005 } 3006 if (optimized_type == tls::TLSOPT_TO_IE) 3007 { 3008 this->tls_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type, 3009 got_offset, view, view_size); 3010 break; 3011 } 3012 else if (optimized_type == tls::TLSOPT_NONE) 3013 { 3014 // Relocate the field with the offset of the pair of GOT 3015 // entries. 3016 Relocate_functions<32, false>::rel32(view, got_offset); 3017 break; 3018 } 3019 } 3020 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 3021 _("unsupported reloc %u"), 3022 r_type); 3023 break; 3024 3025 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url) 3026 case elfcpp::R_386_TLS_DESC_CALL: 3027 this->local_dynamic_type_ = LOCAL_DYNAMIC_GNU; 3028 if (optimized_type == tls::TLSOPT_TO_LE) 3029 { 3030 if (tls_segment == NULL) 3031 { 3032 gold_assert(parameters->errors()->error_count() > 0 3033 || issue_undefined_symbol_error(gsym)); 3034 return; 3035 } 3036 this->tls_desc_gd_to_le(relinfo, relnum, tls_segment, 3037 rel, r_type, value, view, 3038 view_size); 3039 break; 3040 } 3041 else 3042 { 3043 unsigned int got_type = (optimized_type == tls::TLSOPT_TO_IE 3044 ? GOT_TYPE_TLS_NOFFSET 3045 : GOT_TYPE_TLS_DESC); 3046 unsigned int got_offset = 0; 3047 if (r_type == elfcpp::R_386_TLS_GOTDESC 3048 && optimized_type == tls::TLSOPT_NONE) 3049 { 3050 // We created GOT entries in the .got.tlsdesc portion of 3051 // the .got.plt section, but the offset stored in the 3052 // symbol is the offset within .got.tlsdesc. 3053 got_offset = (target->got_size() 3054 + target->got_plt_section()->data_size()); 3055 } 3056 if (gsym != NULL) 3057 { 3058 gold_assert(gsym->has_got_offset(got_type)); 3059 got_offset += gsym->got_offset(got_type) - target->got_size(); 3060 } 3061 else 3062 { 3063 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info()); 3064 gold_assert(object->local_has_got_offset(r_sym, got_type)); 3065 got_offset += (object->local_got_offset(r_sym, got_type) 3066 - target->got_size()); 3067 } 3068 if (optimized_type == tls::TLSOPT_TO_IE) 3069 { 3070 if (tls_segment == NULL) 3071 { 3072 gold_assert(parameters->errors()->error_count() > 0 3073 || issue_undefined_symbol_error(gsym)); 3074 return; 3075 } 3076 this->tls_desc_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type, 3077 got_offset, view, view_size); 3078 break; 3079 } 3080 else if (optimized_type == tls::TLSOPT_NONE) 3081 { 3082 if (r_type == elfcpp::R_386_TLS_GOTDESC) 3083 { 3084 // Relocate the field with the offset of the pair of GOT 3085 // entries. 3086 Relocate_functions<32, false>::rel32(view, got_offset); 3087 } 3088 break; 3089 } 3090 } 3091 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 3092 _("unsupported reloc %u"), 3093 r_type); 3094 break; 3095 3096 case elfcpp::R_386_TLS_LDM: // Local-dynamic 3097 if (this->local_dynamic_type_ == LOCAL_DYNAMIC_SUN) 3098 { 3099 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 3100 _("both SUN and GNU model " 3101 "TLS relocations")); 3102 break; 3103 } 3104 this->local_dynamic_type_ = LOCAL_DYNAMIC_GNU; 3105 if (optimized_type == tls::TLSOPT_TO_LE) 3106 { 3107 if (tls_segment == NULL) 3108 { 3109 gold_assert(parameters->errors()->error_count() > 0 3110 || issue_undefined_symbol_error(gsym)); 3111 return; 3112 } 3113 this->tls_ld_to_le(relinfo, relnum, tls_segment, rel, r_type, 3114 value, view, view_size); 3115 break; 3116 } 3117 else if (optimized_type == tls::TLSOPT_NONE) 3118 { 3119 // Relocate the field with the offset of the GOT entry for 3120 // the module index. 3121 unsigned int got_offset; 3122 got_offset = (target->got_mod_index_entry(NULL, NULL, NULL) 3123 - target->got_size()); 3124 Relocate_functions<32, false>::rel32(view, got_offset); 3125 break; 3126 } 3127 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 3128 _("unsupported reloc %u"), 3129 r_type); 3130 break; 3131 3132 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 3133 if (optimized_type == tls::TLSOPT_TO_LE) 3134 { 3135 // This reloc can appear in debugging sections, in which 3136 // case we must not convert to local-exec. We decide what 3137 // to do based on whether the section is marked as 3138 // containing executable code. That is what the GNU linker 3139 // does as well. 3140 elfcpp::Shdr<32, false> shdr(relinfo->data_shdr); 3141 if ((shdr.get_sh_flags() & elfcpp::SHF_EXECINSTR) != 0) 3142 { 3143 if (tls_segment == NULL) 3144 { 3145 gold_assert(parameters->errors()->error_count() > 0 3146 || issue_undefined_symbol_error(gsym)); 3147 return; 3148 } 3149 value -= tls_segment->memsz(); 3150 } 3151 } 3152 Relocate_functions<32, false>::rel32(view, value); 3153 break; 3154 3155 case elfcpp::R_386_TLS_IE: // Initial-exec 3156 case elfcpp::R_386_TLS_GOTIE: 3157 case elfcpp::R_386_TLS_IE_32: 3158 if (optimized_type == tls::TLSOPT_TO_LE) 3159 { 3160 if (tls_segment == NULL) 3161 { 3162 gold_assert(parameters->errors()->error_count() > 0 3163 || issue_undefined_symbol_error(gsym)); 3164 return; 3165 } 3166 Target_i386::Relocate::tls_ie_to_le(relinfo, relnum, tls_segment, 3167 rel, r_type, value, view, 3168 view_size); 3169 break; 3170 } 3171 else if (optimized_type == tls::TLSOPT_NONE) 3172 { 3173 // Relocate the field with the offset of the GOT entry for 3174 // the tp-relative offset of the symbol. 3175 unsigned int got_type = (r_type == elfcpp::R_386_TLS_IE_32 3176 ? GOT_TYPE_TLS_OFFSET 3177 : GOT_TYPE_TLS_NOFFSET); 3178 unsigned int got_offset; 3179 if (gsym != NULL) 3180 { 3181 gold_assert(gsym->has_got_offset(got_type)); 3182 got_offset = gsym->got_offset(got_type); 3183 } 3184 else 3185 { 3186 unsigned int r_sym = elfcpp::elf_r_sym<32>(rel.get_r_info()); 3187 gold_assert(object->local_has_got_offset(r_sym, got_type)); 3188 got_offset = object->local_got_offset(r_sym, got_type); 3189 } 3190 // For the R_386_TLS_IE relocation, we need to apply the 3191 // absolute address of the GOT entry. 3192 if (r_type == elfcpp::R_386_TLS_IE) 3193 got_offset += target->got_plt_section()->address(); 3194 // All GOT offsets are relative to the end of the GOT. 3195 got_offset -= target->got_size(); 3196 Relocate_functions<32, false>::rel32(view, got_offset); 3197 break; 3198 } 3199 gold_error_at_location(relinfo, relnum, rel.get_r_offset(), 3200 _("unsupported reloc %u"), 3201 r_type); 3202 break; 3203 3204 case elfcpp::R_386_TLS_LE: // Local-exec 3205 // If we're creating a shared library, a dynamic relocation will 3206 // have been created for this location, so do not apply it now. 3207 if (!parameters->options().shared()) 3208 { 3209 if (tls_segment == NULL) 3210 { 3211 gold_assert(parameters->errors()->error_count() > 0 3212 || issue_undefined_symbol_error(gsym)); 3213 return; 3214 } 3215 value -= tls_segment->memsz(); 3216 Relocate_functions<32, false>::rel32(view, value); 3217 } 3218 break; 3219 3220 case elfcpp::R_386_TLS_LE_32: 3221 // If we're creating a shared library, a dynamic relocation will 3222 // have been created for this location, so do not apply it now. 3223 if (!parameters->options().shared()) 3224 { 3225 if (tls_segment == NULL) 3226 { 3227 gold_assert(parameters->errors()->error_count() > 0 3228 || issue_undefined_symbol_error(gsym)); 3229 return; 3230 } 3231 value = tls_segment->memsz() - value; 3232 Relocate_functions<32, false>::rel32(view, value); 3233 } 3234 break; 3235 } 3236 } 3237 3238 // Do a relocation in which we convert a TLS General-Dynamic to a 3239 // Local-Exec. 3240 3241 inline void 3242 Target_i386::Relocate::tls_gd_to_le(const Relocate_info<32, false>* relinfo, 3243 size_t relnum, 3244 Output_segment* tls_segment, 3245 const elfcpp::Rel<32, false>& rel, 3246 unsigned int, 3247 elfcpp::Elf_types<32>::Elf_Addr value, 3248 unsigned char* view, 3249 section_size_type view_size) 3250 { 3251 // leal foo(,%reg,1),%eax; call ___tls_get_addr 3252 // ==> movl %gs:0,%eax; subl $foo@tpoff,%eax 3253 // leal foo(%reg),%eax; call ___tls_get_addr 3254 // ==> movl %gs:0,%eax; subl $foo@tpoff,%eax 3255 3256 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2); 3257 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9); 3258 3259 unsigned char op1 = view[-1]; 3260 unsigned char op2 = view[-2]; 3261 3262 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3263 op2 == 0x8d || op2 == 0x04); 3264 tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8); 3265 3266 int roff = 5; 3267 3268 if (op2 == 0x04) 3269 { 3270 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -3); 3271 tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[-3] == 0x8d); 3272 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3273 ((op1 & 0xc7) == 0x05 && op1 != (4 << 3))); 3274 memcpy(view - 3, "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12); 3275 } 3276 else 3277 { 3278 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3279 (op1 & 0xf8) == 0x80 && (op1 & 7) != 4); 3280 if (rel.get_r_offset() + 9 < view_size 3281 && view[9] == 0x90) 3282 { 3283 // There is a trailing nop. Use the size byte subl. 3284 memcpy(view - 2, "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12); 3285 roff = 6; 3286 } 3287 else 3288 { 3289 // Use the five byte subl. 3290 memcpy(view - 2, "\x65\xa1\0\0\0\0\x2d\0\0\0", 11); 3291 } 3292 } 3293 3294 value = tls_segment->memsz() - value; 3295 Relocate_functions<32, false>::rel32(view + roff, value); 3296 3297 // The next reloc should be a PLT32 reloc against __tls_get_addr. 3298 // We can skip it. 3299 this->skip_call_tls_get_addr_ = true; 3300 } 3301 3302 // Do a relocation in which we convert a TLS General-Dynamic to an 3303 // Initial-Exec. 3304 3305 inline void 3306 Target_i386::Relocate::tls_gd_to_ie(const Relocate_info<32, false>* relinfo, 3307 size_t relnum, 3308 Output_segment*, 3309 const elfcpp::Rel<32, false>& rel, 3310 unsigned int, 3311 elfcpp::Elf_types<32>::Elf_Addr value, 3312 unsigned char* view, 3313 section_size_type view_size) 3314 { 3315 // leal foo(,%ebx,1),%eax; call ___tls_get_addr 3316 // ==> movl %gs:0,%eax; addl foo@gotntpoff(%ebx),%eax 3317 3318 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2); 3319 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9); 3320 3321 unsigned char op1 = view[-1]; 3322 unsigned char op2 = view[-2]; 3323 3324 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3325 op2 == 0x8d || op2 == 0x04); 3326 tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8); 3327 3328 int roff = 5; 3329 3330 // FIXME: For now, support only the first (SIB) form. 3331 tls::check_tls(relinfo, relnum, rel.get_r_offset(), op2 == 0x04); 3332 3333 if (op2 == 0x04) 3334 { 3335 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -3); 3336 tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[-3] == 0x8d); 3337 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3338 ((op1 & 0xc7) == 0x05 && op1 != (4 << 3))); 3339 memcpy(view - 3, "\x65\xa1\0\0\0\0\x03\x83\0\0\0", 12); 3340 } 3341 else 3342 { 3343 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3344 (op1 & 0xf8) == 0x80 && (op1 & 7) != 4); 3345 if (rel.get_r_offset() + 9 < view_size 3346 && view[9] == 0x90) 3347 { 3348 // FIXME: This is not the right instruction sequence. 3349 // There is a trailing nop. Use the size byte subl. 3350 memcpy(view - 2, "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12); 3351 roff = 6; 3352 } 3353 else 3354 { 3355 // FIXME: This is not the right instruction sequence. 3356 // Use the five byte subl. 3357 memcpy(view - 2, "\x65\xa1\0\0\0\0\x2d\0\0\0", 11); 3358 } 3359 } 3360 3361 Relocate_functions<32, false>::rel32(view + roff, value); 3362 3363 // The next reloc should be a PLT32 reloc against __tls_get_addr. 3364 // We can skip it. 3365 this->skip_call_tls_get_addr_ = true; 3366 } 3367 3368 // Do a relocation in which we convert a TLS_GOTDESC or TLS_DESC_CALL 3369 // General-Dynamic to a Local-Exec. 3370 3371 inline void 3372 Target_i386::Relocate::tls_desc_gd_to_le( 3373 const Relocate_info<32, false>* relinfo, 3374 size_t relnum, 3375 Output_segment* tls_segment, 3376 const elfcpp::Rel<32, false>& rel, 3377 unsigned int r_type, 3378 elfcpp::Elf_types<32>::Elf_Addr value, 3379 unsigned char* view, 3380 section_size_type view_size) 3381 { 3382 if (r_type == elfcpp::R_386_TLS_GOTDESC) 3383 { 3384 // leal foo@TLSDESC(%ebx), %eax 3385 // ==> leal foo@NTPOFF, %eax 3386 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2); 3387 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4); 3388 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3389 view[-2] == 0x8d && view[-1] == 0x83); 3390 view[-1] = 0x05; 3391 value -= tls_segment->memsz(); 3392 Relocate_functions<32, false>::rel32(view, value); 3393 } 3394 else 3395 { 3396 // call *foo@TLSCALL(%eax) 3397 // ==> nop; nop 3398 gold_assert(r_type == elfcpp::R_386_TLS_DESC_CALL); 3399 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 2); 3400 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3401 view[0] == 0xff && view[1] == 0x10); 3402 view[0] = 0x66; 3403 view[1] = 0x90; 3404 } 3405 } 3406 3407 // Do a relocation in which we convert a TLS_GOTDESC or TLS_DESC_CALL 3408 // General-Dynamic to an Initial-Exec. 3409 3410 inline void 3411 Target_i386::Relocate::tls_desc_gd_to_ie( 3412 const Relocate_info<32, false>* relinfo, 3413 size_t relnum, 3414 Output_segment*, 3415 const elfcpp::Rel<32, false>& rel, 3416 unsigned int r_type, 3417 elfcpp::Elf_types<32>::Elf_Addr value, 3418 unsigned char* view, 3419 section_size_type view_size) 3420 { 3421 if (r_type == elfcpp::R_386_TLS_GOTDESC) 3422 { 3423 // leal foo@TLSDESC(%ebx), %eax 3424 // ==> movl foo@GOTNTPOFF(%ebx), %eax 3425 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2); 3426 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4); 3427 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3428 view[-2] == 0x8d && view[-1] == 0x83); 3429 view[-2] = 0x8b; 3430 Relocate_functions<32, false>::rel32(view, value); 3431 } 3432 else 3433 { 3434 // call *foo@TLSCALL(%eax) 3435 // ==> nop; nop 3436 gold_assert(r_type == elfcpp::R_386_TLS_DESC_CALL); 3437 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 2); 3438 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3439 view[0] == 0xff && view[1] == 0x10); 3440 view[0] = 0x66; 3441 view[1] = 0x90; 3442 } 3443 } 3444 3445 // Do a relocation in which we convert a TLS Local-Dynamic to a 3446 // Local-Exec. 3447 3448 inline void 3449 Target_i386::Relocate::tls_ld_to_le(const Relocate_info<32, false>* relinfo, 3450 size_t relnum, 3451 Output_segment*, 3452 const elfcpp::Rel<32, false>& rel, 3453 unsigned int, 3454 elfcpp::Elf_types<32>::Elf_Addr, 3455 unsigned char* view, 3456 section_size_type view_size) 3457 { 3458 // leal foo(%reg), %eax; call ___tls_get_addr 3459 // ==> movl %gs:0,%eax; nop; leal 0(%esi,1),%esi 3460 3461 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2); 3462 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 9); 3463 3464 // FIXME: Does this test really always pass? 3465 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3466 view[-2] == 0x8d && view[-1] == 0x83); 3467 3468 tls::check_tls(relinfo, relnum, rel.get_r_offset(), view[4] == 0xe8); 3469 3470 memcpy(view - 2, "\x65\xa1\0\0\0\0\x90\x8d\x74\x26\0", 11); 3471 3472 // The next reloc should be a PLT32 reloc against __tls_get_addr. 3473 // We can skip it. 3474 this->skip_call_tls_get_addr_ = true; 3475 } 3476 3477 // Do a relocation in which we convert a TLS Initial-Exec to a 3478 // Local-Exec. 3479 3480 inline void 3481 Target_i386::Relocate::tls_ie_to_le(const Relocate_info<32, false>* relinfo, 3482 size_t relnum, 3483 Output_segment* tls_segment, 3484 const elfcpp::Rel<32, false>& rel, 3485 unsigned int r_type, 3486 elfcpp::Elf_types<32>::Elf_Addr value, 3487 unsigned char* view, 3488 section_size_type view_size) 3489 { 3490 // We have to actually change the instructions, which means that we 3491 // need to examine the opcodes to figure out which instruction we 3492 // are looking at. 3493 if (r_type == elfcpp::R_386_TLS_IE) 3494 { 3495 // movl %gs:XX,%eax ==> movl $YY,%eax 3496 // movl %gs:XX,%reg ==> movl $YY,%reg 3497 // addl %gs:XX,%reg ==> addl $YY,%reg 3498 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -1); 3499 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4); 3500 3501 unsigned char op1 = view[-1]; 3502 if (op1 == 0xa1) 3503 { 3504 // movl XX,%eax ==> movl $YY,%eax 3505 view[-1] = 0xb8; 3506 } 3507 else 3508 { 3509 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2); 3510 3511 unsigned char op2 = view[-2]; 3512 if (op2 == 0x8b) 3513 { 3514 // movl XX,%reg ==> movl $YY,%reg 3515 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3516 (op1 & 0xc7) == 0x05); 3517 view[-2] = 0xc7; 3518 view[-1] = 0xc0 | ((op1 >> 3) & 7); 3519 } 3520 else if (op2 == 0x03) 3521 { 3522 // addl XX,%reg ==> addl $YY,%reg 3523 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3524 (op1 & 0xc7) == 0x05); 3525 view[-2] = 0x81; 3526 view[-1] = 0xc0 | ((op1 >> 3) & 7); 3527 } 3528 else 3529 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 0); 3530 } 3531 } 3532 else 3533 { 3534 // subl %gs:XX(%reg1),%reg2 ==> subl $YY,%reg2 3535 // movl %gs:XX(%reg1),%reg2 ==> movl $YY,%reg2 3536 // addl %gs:XX(%reg1),%reg2 ==> addl $YY,$reg2 3537 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, -2); 3538 tls::check_range(relinfo, relnum, rel.get_r_offset(), view_size, 4); 3539 3540 unsigned char op1 = view[-1]; 3541 unsigned char op2 = view[-2]; 3542 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 3543 (op1 & 0xc0) == 0x80 && (op1 & 7) != 4); 3544 if (op2 == 0x8b) 3545 { 3546 // movl %gs:XX(%reg1),%reg2 ==> movl $YY,%reg2 3547 view[-2] = 0xc7; 3548 view[-1] = 0xc0 | ((op1 >> 3) & 7); 3549 } 3550 else if (op2 == 0x2b) 3551 { 3552 // subl %gs:XX(%reg1),%reg2 ==> subl $YY,%reg2 3553 view[-2] = 0x81; 3554 view[-1] = 0xe8 | ((op1 >> 3) & 7); 3555 } 3556 else if (op2 == 0x03) 3557 { 3558 // addl %gs:XX(%reg1),%reg2 ==> addl $YY,$reg2 3559 view[-2] = 0x81; 3560 view[-1] = 0xc0 | ((op1 >> 3) & 7); 3561 } 3562 else 3563 tls::check_tls(relinfo, relnum, rel.get_r_offset(), 0); 3564 } 3565 3566 value = tls_segment->memsz() - value; 3567 if (r_type == elfcpp::R_386_TLS_IE || r_type == elfcpp::R_386_TLS_GOTIE) 3568 value = - value; 3569 3570 Relocate_functions<32, false>::rel32(view, value); 3571 } 3572 3573 // Relocate section data. 3574 3575 void 3576 Target_i386::relocate_section(const Relocate_info<32, false>* relinfo, 3577 unsigned int sh_type, 3578 const unsigned char* prelocs, 3579 size_t reloc_count, 3580 Output_section* output_section, 3581 bool needs_special_offset_handling, 3582 unsigned char* view, 3583 elfcpp::Elf_types<32>::Elf_Addr address, 3584 section_size_type view_size, 3585 const Reloc_symbol_changes* reloc_symbol_changes) 3586 { 3587 gold_assert(sh_type == elfcpp::SHT_REL); 3588 3589 gold::relocate_section<32, false, Target_i386, elfcpp::SHT_REL, 3590 Target_i386::Relocate, gold::Default_comdat_behavior>( 3591 relinfo, 3592 this, 3593 prelocs, 3594 reloc_count, 3595 output_section, 3596 needs_special_offset_handling, 3597 view, 3598 address, 3599 view_size, 3600 reloc_symbol_changes); 3601 } 3602 3603 // Return the size of a relocation while scanning during a relocatable 3604 // link. 3605 3606 unsigned int 3607 Target_i386::Relocatable_size_for_reloc::get_size_for_reloc( 3608 unsigned int r_type, 3609 Relobj* object) 3610 { 3611 switch (r_type) 3612 { 3613 case elfcpp::R_386_NONE: 3614 case elfcpp::R_386_GNU_VTINHERIT: 3615 case elfcpp::R_386_GNU_VTENTRY: 3616 case elfcpp::R_386_TLS_GD: // Global-dynamic 3617 case elfcpp::R_386_TLS_GOTDESC: // Global-dynamic (from ~oliva url) 3618 case elfcpp::R_386_TLS_DESC_CALL: 3619 case elfcpp::R_386_TLS_LDM: // Local-dynamic 3620 case elfcpp::R_386_TLS_LDO_32: // Alternate local-dynamic 3621 case elfcpp::R_386_TLS_IE: // Initial-exec 3622 case elfcpp::R_386_TLS_IE_32: 3623 case elfcpp::R_386_TLS_GOTIE: 3624 case elfcpp::R_386_TLS_LE: // Local-exec 3625 case elfcpp::R_386_TLS_LE_32: 3626 return 0; 3627 3628 case elfcpp::R_386_32: 3629 case elfcpp::R_386_PC32: 3630 case elfcpp::R_386_GOT32: 3631 case elfcpp::R_386_PLT32: 3632 case elfcpp::R_386_GOTOFF: 3633 case elfcpp::R_386_GOTPC: 3634 return 4; 3635 3636 case elfcpp::R_386_16: 3637 case elfcpp::R_386_PC16: 3638 return 2; 3639 3640 case elfcpp::R_386_8: 3641 case elfcpp::R_386_PC8: 3642 return 1; 3643 3644 // These are relocations which should only be seen by the 3645 // dynamic linker, and should never be seen here. 3646 case elfcpp::R_386_COPY: 3647 case elfcpp::R_386_GLOB_DAT: 3648 case elfcpp::R_386_JUMP_SLOT: 3649 case elfcpp::R_386_RELATIVE: 3650 case elfcpp::R_386_IRELATIVE: 3651 case elfcpp::R_386_TLS_TPOFF: 3652 case elfcpp::R_386_TLS_DTPMOD32: 3653 case elfcpp::R_386_TLS_DTPOFF32: 3654 case elfcpp::R_386_TLS_TPOFF32: 3655 case elfcpp::R_386_TLS_DESC: 3656 object->error(_("unexpected reloc %u in object file"), r_type); 3657 return 0; 3658 3659 case elfcpp::R_386_32PLT: 3660 case elfcpp::R_386_TLS_GD_32: 3661 case elfcpp::R_386_TLS_GD_PUSH: 3662 case elfcpp::R_386_TLS_GD_CALL: 3663 case elfcpp::R_386_TLS_GD_POP: 3664 case elfcpp::R_386_TLS_LDM_32: 3665 case elfcpp::R_386_TLS_LDM_PUSH: 3666 case elfcpp::R_386_TLS_LDM_CALL: 3667 case elfcpp::R_386_TLS_LDM_POP: 3668 case elfcpp::R_386_USED_BY_INTEL_200: 3669 default: 3670 object->error(_("unsupported reloc %u in object file"), r_type); 3671 return 0; 3672 } 3673 } 3674 3675 // Scan the relocs during a relocatable link. 3676 3677 void 3678 Target_i386::scan_relocatable_relocs(Symbol_table* symtab, 3679 Layout* layout, 3680 Sized_relobj_file<32, false>* object, 3681 unsigned int data_shndx, 3682 unsigned int sh_type, 3683 const unsigned char* prelocs, 3684 size_t reloc_count, 3685 Output_section* output_section, 3686 bool needs_special_offset_handling, 3687 size_t local_symbol_count, 3688 const unsigned char* plocal_symbols, 3689 Relocatable_relocs* rr) 3690 { 3691 gold_assert(sh_type == elfcpp::SHT_REL); 3692 3693 typedef gold::Default_scan_relocatable_relocs<elfcpp::SHT_REL, 3694 Relocatable_size_for_reloc> Scan_relocatable_relocs; 3695 3696 gold::scan_relocatable_relocs<32, false, elfcpp::SHT_REL, 3697 Scan_relocatable_relocs>( 3698 symtab, 3699 layout, 3700 object, 3701 data_shndx, 3702 prelocs, 3703 reloc_count, 3704 output_section, 3705 needs_special_offset_handling, 3706 local_symbol_count, 3707 plocal_symbols, 3708 rr); 3709 } 3710 3711 // Emit relocations for a section. 3712 3713 void 3714 Target_i386::relocate_relocs( 3715 const Relocate_info<32, false>* relinfo, 3716 unsigned int sh_type, 3717 const unsigned char* prelocs, 3718 size_t reloc_count, 3719 Output_section* output_section, 3720 elfcpp::Elf_types<32>::Elf_Off offset_in_output_section, 3721 const Relocatable_relocs* rr, 3722 unsigned char* view, 3723 elfcpp::Elf_types<32>::Elf_Addr view_address, 3724 section_size_type view_size, 3725 unsigned char* reloc_view, 3726 section_size_type reloc_view_size) 3727 { 3728 gold_assert(sh_type == elfcpp::SHT_REL); 3729 3730 gold::relocate_relocs<32, false, elfcpp::SHT_REL>( 3731 relinfo, 3732 prelocs, 3733 reloc_count, 3734 output_section, 3735 offset_in_output_section, 3736 rr, 3737 view, 3738 view_address, 3739 view_size, 3740 reloc_view, 3741 reloc_view_size); 3742 } 3743 3744 // Return the value to use for a dynamic which requires special 3745 // treatment. This is how we support equality comparisons of function 3746 // pointers across shared library boundaries, as described in the 3747 // processor specific ABI supplement. 3748 3749 uint64_t 3750 Target_i386::do_dynsym_value(const Symbol* gsym) const 3751 { 3752 gold_assert(gsym->is_from_dynobj() && gsym->has_plt_offset()); 3753 return this->plt_address_for_global(gsym); 3754 } 3755 3756 // Return a string used to fill a code section with nops to take up 3757 // the specified length. 3758 3759 std::string 3760 Target_i386::do_code_fill(section_size_type length) const 3761 { 3762 if (length >= 16) 3763 { 3764 // Build a jmp instruction to skip over the bytes. 3765 unsigned char jmp[5]; 3766 jmp[0] = 0xe9; 3767 elfcpp::Swap_unaligned<32, false>::writeval(jmp + 1, length - 5); 3768 return (std::string(reinterpret_cast<char*>(&jmp[0]), 5) 3769 + std::string(length - 5, static_cast<char>(0x90))); 3770 } 3771 3772 // Nop sequences of various lengths. 3773 const char nop1[1] = { '\x90' }; // nop 3774 const char nop2[2] = { '\x66', '\x90' }; // xchg %ax %ax 3775 const char nop3[3] = { '\x8d', '\x76', '\x00' }; // leal 0(%esi),%esi 3776 const char nop4[4] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi 3777 '\x00'}; 3778 const char nop5[5] = { '\x90', '\x8d', '\x74', // nop 3779 '\x26', '\x00' }; // leal 0(%esi,1),%esi 3780 const char nop6[6] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi 3781 '\x00', '\x00', '\x00' }; 3782 const char nop7[7] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi 3783 '\x00', '\x00', '\x00', 3784 '\x00' }; 3785 const char nop8[8] = { '\x90', '\x8d', '\xb4', // nop 3786 '\x26', '\x00', '\x00', // leal 0L(%esi,1),%esi 3787 '\x00', '\x00' }; 3788 const char nop9[9] = { '\x89', '\xf6', '\x8d', // movl %esi,%esi 3789 '\xbc', '\x27', '\x00', // leal 0L(%edi,1),%edi 3790 '\x00', '\x00', '\x00' }; 3791 const char nop10[10] = { '\x8d', '\x76', '\x00', // leal 0(%esi),%esi 3792 '\x8d', '\xbc', '\x27', // leal 0L(%edi,1),%edi 3793 '\x00', '\x00', '\x00', 3794 '\x00' }; 3795 const char nop11[11] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi 3796 '\x00', '\x8d', '\xbc', // leal 0L(%edi,1),%edi 3797 '\x27', '\x00', '\x00', 3798 '\x00', '\x00' }; 3799 const char nop12[12] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi 3800 '\x00', '\x00', '\x00', // leal 0L(%edi),%edi 3801 '\x8d', '\xbf', '\x00', 3802 '\x00', '\x00', '\x00' }; 3803 const char nop13[13] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi 3804 '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi 3805 '\x8d', '\xbc', '\x27', 3806 '\x00', '\x00', '\x00', 3807 '\x00' }; 3808 const char nop14[14] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi 3809 '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi 3810 '\x00', '\x8d', '\xbc', 3811 '\x27', '\x00', '\x00', 3812 '\x00', '\x00' }; 3813 const char nop15[15] = { '\xeb', '\x0d', '\x90', // jmp .+15 3814 '\x90', '\x90', '\x90', // nop,nop,nop,... 3815 '\x90', '\x90', '\x90', 3816 '\x90', '\x90', '\x90', 3817 '\x90', '\x90', '\x90' }; 3818 3819 const char* nops[16] = { 3820 NULL, 3821 nop1, nop2, nop3, nop4, nop5, nop6, nop7, 3822 nop8, nop9, nop10, nop11, nop12, nop13, nop14, nop15 3823 }; 3824 3825 return std::string(nops[length], length); 3826 } 3827 3828 // Return the value to use for the base of a DW_EH_PE_datarel offset 3829 // in an FDE. Solaris and SVR4 use DW_EH_PE_datarel because their 3830 // assembler can not write out the difference between two labels in 3831 // different sections, so instead of using a pc-relative value they 3832 // use an offset from the GOT. 3833 3834 uint64_t 3835 Target_i386::do_ehframe_datarel_base() const 3836 { 3837 gold_assert(this->global_offset_table_ != NULL); 3838 Symbol* sym = this->global_offset_table_; 3839 Sized_symbol<32>* ssym = static_cast<Sized_symbol<32>*>(sym); 3840 return ssym->value(); 3841 } 3842 3843 // Return whether SYM should be treated as a call to a non-split 3844 // function. We don't want that to be true of a call to a 3845 // get_pc_thunk function. 3846 3847 bool 3848 Target_i386::do_is_call_to_non_split(const Symbol* sym, unsigned int) const 3849 { 3850 return (sym->type() == elfcpp::STT_FUNC 3851 && !is_prefix_of("__i686.get_pc_thunk.", sym->name())); 3852 } 3853 3854 // FNOFFSET in section SHNDX in OBJECT is the start of a function 3855 // compiled with -fsplit-stack. The function calls non-split-stack 3856 // code. We have to change the function so that it always ensures 3857 // that it has enough stack space to run some random function. 3858 3859 void 3860 Target_i386::do_calls_non_split(Relobj* object, unsigned int shndx, 3861 section_offset_type fnoffset, 3862 section_size_type fnsize, 3863 unsigned char* view, 3864 section_size_type view_size, 3865 std::string* from, 3866 std::string* to) const 3867 { 3868 // The function starts with a comparison of the stack pointer and a 3869 // field in the TCB. This is followed by a jump. 3870 3871 // cmp %gs:NN,%esp 3872 if (this->match_view(view, view_size, fnoffset, "\x65\x3b\x25", 3) 3873 && fnsize > 7) 3874 { 3875 // We will call __morestack if the carry flag is set after this 3876 // comparison. We turn the comparison into an stc instruction 3877 // and some nops. 3878 view[fnoffset] = '\xf9'; 3879 this->set_view_to_nop(view, view_size, fnoffset + 1, 6); 3880 } 3881 // lea NN(%esp),%ecx 3882 // lea NN(%esp),%edx 3883 else if ((this->match_view(view, view_size, fnoffset, "\x8d\x8c\x24", 3) 3884 || this->match_view(view, view_size, fnoffset, "\x8d\x94\x24", 3)) 3885 && fnsize > 7) 3886 { 3887 // This is loading an offset from the stack pointer for a 3888 // comparison. The offset is negative, so we decrease the 3889 // offset by the amount of space we need for the stack. This 3890 // means we will avoid calling __morestack if there happens to 3891 // be plenty of space on the stack already. 3892 unsigned char* pval = view + fnoffset + 3; 3893 uint32_t val = elfcpp::Swap_unaligned<32, false>::readval(pval); 3894 val -= parameters->options().split_stack_adjust_size(); 3895 elfcpp::Swap_unaligned<32, false>::writeval(pval, val); 3896 } 3897 else 3898 { 3899 if (!object->has_no_split_stack()) 3900 object->error(_("failed to match split-stack sequence at " 3901 "section %u offset %0zx"), 3902 shndx, static_cast<size_t>(fnoffset)); 3903 return; 3904 } 3905 3906 // We have to change the function so that it calls 3907 // __morestack_non_split instead of __morestack. The former will 3908 // allocate additional stack space. 3909 *from = "__morestack"; 3910 *to = "__morestack_non_split"; 3911 } 3912 3913 // The selector for i386 object files. Note this is never instantiated 3914 // directly. It's only used in Target_selector_i386_nacl, below. 3915 3916 class Target_selector_i386 : public Target_selector_freebsd 3917 { 3918 public: 3919 Target_selector_i386() 3920 : Target_selector_freebsd(elfcpp::EM_386, 32, false, 3921 "elf32-i386", "elf32-i386-freebsd", 3922 "elf_i386") 3923 { } 3924 3925 Target* 3926 do_instantiate_target() 3927 { return new Target_i386(); } 3928 }; 3929 3930 // NaCl variant. It uses different PLT contents. 3931 3932 class Output_data_plt_i386_nacl : public Output_data_plt_i386 3933 { 3934 public: 3935 Output_data_plt_i386_nacl(Layout* layout, 3936 Output_data_got_plt_i386* got_plt, 3937 Output_data_space* got_irelative) 3938 : Output_data_plt_i386(layout, plt_entry_size, got_plt, got_irelative) 3939 { } 3940 3941 protected: 3942 virtual unsigned int 3943 do_get_plt_entry_size() const 3944 { return plt_entry_size; } 3945 3946 virtual void 3947 do_add_eh_frame(Layout* layout) 3948 { 3949 layout->add_eh_frame_for_plt(this, plt_eh_frame_cie, plt_eh_frame_cie_size, 3950 plt_eh_frame_fde, plt_eh_frame_fde_size); 3951 } 3952 3953 // The size of an entry in the PLT. 3954 static const int plt_entry_size = 64; 3955 3956 // The .eh_frame unwind information for the PLT. 3957 static const int plt_eh_frame_fde_size = 32; 3958 static const unsigned char plt_eh_frame_fde[plt_eh_frame_fde_size]; 3959 }; 3960 3961 class Output_data_plt_i386_nacl_exec : public Output_data_plt_i386_nacl 3962 { 3963 public: 3964 Output_data_plt_i386_nacl_exec(Layout* layout, 3965 Output_data_got_plt_i386* got_plt, 3966 Output_data_space* got_irelative) 3967 : Output_data_plt_i386_nacl(layout, got_plt, got_irelative) 3968 { } 3969 3970 protected: 3971 virtual void 3972 do_fill_first_plt_entry(unsigned char* pov, 3973 elfcpp::Elf_types<32>::Elf_Addr got_address); 3974 3975 virtual unsigned int 3976 do_fill_plt_entry(unsigned char* pov, 3977 elfcpp::Elf_types<32>::Elf_Addr got_address, 3978 unsigned int got_offset, 3979 unsigned int plt_offset, 3980 unsigned int plt_rel_offset); 3981 3982 private: 3983 // The first entry in the PLT for an executable. 3984 static const unsigned char first_plt_entry[plt_entry_size]; 3985 3986 // Other entries in the PLT for an executable. 3987 static const unsigned char plt_entry[plt_entry_size]; 3988 }; 3989 3990 class Output_data_plt_i386_nacl_dyn : public Output_data_plt_i386_nacl 3991 { 3992 public: 3993 Output_data_plt_i386_nacl_dyn(Layout* layout, 3994 Output_data_got_plt_i386* got_plt, 3995 Output_data_space* got_irelative) 3996 : Output_data_plt_i386_nacl(layout, got_plt, got_irelative) 3997 { } 3998 3999 protected: 4000 virtual void 4001 do_fill_first_plt_entry(unsigned char* pov, elfcpp::Elf_types<32>::Elf_Addr); 4002 4003 virtual unsigned int 4004 do_fill_plt_entry(unsigned char* pov, 4005 elfcpp::Elf_types<32>::Elf_Addr, 4006 unsigned int got_offset, 4007 unsigned int plt_offset, 4008 unsigned int plt_rel_offset); 4009 4010 private: 4011 // The first entry in the PLT for a shared object. 4012 static const unsigned char first_plt_entry[plt_entry_size]; 4013 4014 // Other entries in the PLT for a shared object. 4015 static const unsigned char plt_entry[plt_entry_size]; 4016 }; 4017 4018 class Target_i386_nacl : public Target_i386 4019 { 4020 public: 4021 Target_i386_nacl() 4022 : Target_i386(&i386_nacl_info) 4023 { } 4024 4025 protected: 4026 virtual Output_data_plt_i386* 4027 do_make_data_plt(Layout* layout, 4028 Output_data_got_plt_i386* got_plt, 4029 Output_data_space* got_irelative, 4030 bool dyn) 4031 { 4032 if (dyn) 4033 return new Output_data_plt_i386_nacl_dyn(layout, got_plt, got_irelative); 4034 else 4035 return new Output_data_plt_i386_nacl_exec(layout, got_plt, got_irelative); 4036 } 4037 4038 virtual std::string 4039 do_code_fill(section_size_type length) const; 4040 4041 private: 4042 static const Target::Target_info i386_nacl_info; 4043 }; 4044 4045 const Target::Target_info Target_i386_nacl::i386_nacl_info = 4046 { 4047 32, // size 4048 false, // is_big_endian 4049 elfcpp::EM_386, // machine_code 4050 false, // has_make_symbol 4051 false, // has_resolve 4052 true, // has_code_fill 4053 true, // is_default_stack_executable 4054 true, // can_icf_inline_merge_sections 4055 '\0', // wrap_char 4056 "/lib/ld-nacl-x86-32.so.1", // dynamic_linker 4057 0x20000, // default_text_segment_address 4058 0x10000, // abi_pagesize (overridable by -z max-page-size) 4059 0x10000, // common_pagesize (overridable by -z common-page-size) 4060 true, // isolate_execinstr 4061 0x10000000, // rosegment_gap 4062 elfcpp::SHN_UNDEF, // small_common_shndx 4063 elfcpp::SHN_UNDEF, // large_common_shndx 4064 0, // small_common_section_flags 4065 0, // large_common_section_flags 4066 NULL, // attributes_section 4067 NULL, // attributes_vendor 4068 "_start" // entry_symbol_name 4069 }; 4070 4071 #define NACLMASK 0xe0 // 32-byte alignment mask 4072 4073 const unsigned char 4074 Output_data_plt_i386_nacl_exec::first_plt_entry[plt_entry_size] = 4075 { 4076 0xff, 0x35, // pushl contents of memory address 4077 0, 0, 0, 0, // replaced with address of .got + 4 4078 0x8b, 0x0d, // movl contents of address, %ecx 4079 0, 0, 0, 0, // replaced with address of .got + 8 4080 0x83, 0xe1, NACLMASK, // andl $NACLMASK, %ecx 4081 0xff, 0xe1, // jmp *%ecx 4082 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4083 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4084 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4085 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4086 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4087 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4088 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4089 0x90, 0x90, 0x90, 0x90, 0x90 4090 }; 4091 4092 void 4093 Output_data_plt_i386_nacl_exec::do_fill_first_plt_entry( 4094 unsigned char* pov, 4095 elfcpp::Elf_types<32>::Elf_Addr got_address) 4096 { 4097 memcpy(pov, first_plt_entry, plt_entry_size); 4098 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_address + 4); 4099 elfcpp::Swap<32, false>::writeval(pov + 8, got_address + 8); 4100 } 4101 4102 // The first entry in the PLT for a shared object. 4103 4104 const unsigned char 4105 Output_data_plt_i386_nacl_dyn::first_plt_entry[plt_entry_size] = 4106 { 4107 0xff, 0xb3, 4, 0, 0, 0, // pushl 4(%ebx) 4108 0x8b, 0x4b, 0x08, // mov 0x8(%ebx), %ecx 4109 0x83, 0xe1, NACLMASK, // andl $NACLMASK, %ecx 4110 0xff, 0xe1, // jmp *%ecx 4111 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4112 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4113 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4114 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4115 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4116 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4117 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4118 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4119 0x90, 0x90, 0x90, 0x90, 0x90, // nops 4120 0x90, 0x90, 0x90, 0x90, 0x90 // nops 4121 }; 4122 4123 void 4124 Output_data_plt_i386_nacl_dyn::do_fill_first_plt_entry( 4125 unsigned char* pov, 4126 elfcpp::Elf_types<32>::Elf_Addr) 4127 { 4128 memcpy(pov, first_plt_entry, plt_entry_size); 4129 } 4130 4131 // Subsequent entries in the PLT for an executable. 4132 4133 const unsigned char 4134 Output_data_plt_i386_nacl_exec::plt_entry[plt_entry_size] = 4135 { 4136 0x8b, 0x0d, // movl contents of address, %ecx */ 4137 0, 0, 0, 0, // replaced with address of symbol in .got 4138 0x83, 0xe1, NACLMASK, // andl $NACLMASK, %ecx 4139 0xff, 0xe1, // jmp *%ecx 4140 4141 // Pad to the next 32-byte boundary with nop instructions. 4142 0x90, 4143 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4144 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4145 4146 // Lazy GOT entries point here (32-byte aligned). 4147 0x68, // pushl immediate 4148 0, 0, 0, 0, // replaced with offset into relocation table 4149 0xe9, // jmp relative 4150 0, 0, 0, 0, // replaced with offset to start of .plt 4151 4152 // Pad to the next 32-byte boundary with nop instructions. 4153 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4154 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4155 0x90, 0x90 4156 }; 4157 4158 unsigned int 4159 Output_data_plt_i386_nacl_exec::do_fill_plt_entry( 4160 unsigned char* pov, 4161 elfcpp::Elf_types<32>::Elf_Addr got_address, 4162 unsigned int got_offset, 4163 unsigned int plt_offset, 4164 unsigned int plt_rel_offset) 4165 { 4166 memcpy(pov, plt_entry, plt_entry_size); 4167 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, 4168 got_address + got_offset); 4169 elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset); 4170 elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4)); 4171 return 32; 4172 } 4173 4174 // Subsequent entries in the PLT for a shared object. 4175 4176 const unsigned char 4177 Output_data_plt_i386_nacl_dyn::plt_entry[plt_entry_size] = 4178 { 4179 0x8b, 0x8b, // movl offset(%ebx), %ecx 4180 0, 0, 0, 0, // replaced with offset of symbol in .got 4181 0x83, 0xe1, 0xe0, // andl $NACLMASK, %ecx 4182 0xff, 0xe1, // jmp *%ecx 4183 4184 // Pad to the next 32-byte boundary with nop instructions. 4185 0x90, 4186 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4187 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4188 4189 // Lazy GOT entries point here (32-byte aligned). 4190 0x68, // pushl immediate 4191 0, 0, 0, 0, // replaced with offset into relocation table. 4192 0xe9, // jmp relative 4193 0, 0, 0, 0, // replaced with offset to start of .plt. 4194 4195 // Pad to the next 32-byte boundary with nop instructions. 4196 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4197 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 4198 0x90, 0x90 4199 }; 4200 4201 unsigned int 4202 Output_data_plt_i386_nacl_dyn::do_fill_plt_entry( 4203 unsigned char* pov, 4204 elfcpp::Elf_types<32>::Elf_Addr, 4205 unsigned int got_offset, 4206 unsigned int plt_offset, 4207 unsigned int plt_rel_offset) 4208 { 4209 memcpy(pov, plt_entry, plt_entry_size); 4210 elfcpp::Swap_unaligned<32, false>::writeval(pov + 2, got_offset); 4211 elfcpp::Swap_unaligned<32, false>::writeval(pov + 33, plt_rel_offset); 4212 elfcpp::Swap<32, false>::writeval(pov + 38, - (plt_offset + 38 + 4)); 4213 return 32; 4214 } 4215 4216 const unsigned char 4217 Output_data_plt_i386_nacl::plt_eh_frame_fde[plt_eh_frame_fde_size] = 4218 { 4219 0, 0, 0, 0, // Replaced with offset to .plt. 4220 0, 0, 0, 0, // Replaced with size of .plt. 4221 0, // Augmentation size. 4222 elfcpp::DW_CFA_def_cfa_offset, 8, // DW_CFA_def_cfa_offset: 8. 4223 elfcpp::DW_CFA_advance_loc + 6, // Advance 6 to __PLT__ + 6. 4224 elfcpp::DW_CFA_def_cfa_offset, 12, // DW_CFA_def_cfa_offset: 12. 4225 elfcpp::DW_CFA_advance_loc + 58, // Advance 58 to __PLT__ + 64. 4226 elfcpp::DW_CFA_def_cfa_expression, // DW_CFA_def_cfa_expression. 4227 13, // Block length. 4228 elfcpp::DW_OP_breg4, 4, // Push %esp + 4. 4229 elfcpp::DW_OP_breg8, 0, // Push %eip. 4230 elfcpp::DW_OP_const1u, 63, // Push 0x3f. 4231 elfcpp::DW_OP_and, // & (%eip & 0x3f). 4232 elfcpp::DW_OP_const1u, 37, // Push 0x25. 4233 elfcpp::DW_OP_ge, // >= ((%eip & 0x3f) >= 0x25) 4234 elfcpp::DW_OP_lit2, // Push 2. 4235 elfcpp::DW_OP_shl, // << (((%eip & 0x3f) >= 0x25) << 2) 4236 elfcpp::DW_OP_plus, // + ((((%eip&0x3f)>=0x25)<<2)+%esp+4 4237 elfcpp::DW_CFA_nop, // Align to 32 bytes. 4238 elfcpp::DW_CFA_nop 4239 }; 4240 4241 // Return a string used to fill a code section with nops. 4242 // For NaCl, long NOPs are only valid if they do not cross 4243 // bundle alignment boundaries, so keep it simple with one-byte NOPs. 4244 std::string 4245 Target_i386_nacl::do_code_fill(section_size_type length) const 4246 { 4247 return std::string(length, static_cast<char>(0x90)); 4248 } 4249 4250 // The selector for i386-nacl object files. 4251 4252 class Target_selector_i386_nacl 4253 : public Target_selector_nacl<Target_selector_i386, Target_i386_nacl> 4254 { 4255 public: 4256 Target_selector_i386_nacl() 4257 : Target_selector_nacl<Target_selector_i386, 4258 Target_i386_nacl>("x86-32", 4259 "elf32-i386-nacl", 4260 "elf_i386_nacl") 4261 { } 4262 }; 4263 4264 Target_selector_i386_nacl target_selector_i386; 4265 4266 } // End anonymous namespace. 4267