Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: binutils/gold/layout.cc

Issue 3018030: [binutils] Bump binutils to 2.20.1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/nacl-toolchain.git
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « binutils/gold/layout.h ('k') | binutils/gold/object.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // layout.cc -- lay out output file sections for gold 1 // layout.cc -- lay out output file sections for gold
2 2
3 // Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. 3 // Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>. 4 // Written by Ian Lance Taylor <iant@google.com>.
5 5
6 // This file is part of gold. 6 // This file is part of gold.
7 7
8 // This program is free software; you can redistribute it and/or modify 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 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 10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version. 11 // (at your option) any later version.
12 12
13 // This program is distributed in the hope that it will be useful, 13 // This program is distributed in the hope that it will be useful,
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 return false; 342 return false;
343 } 343 }
344 if (parameters->options().strip_lto_sections() 344 if (parameters->options().strip_lto_sections()
345 && !parameters->options().relocatable() 345 && !parameters->options().relocatable()
346 && (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0) 346 && (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
347 { 347 {
348 // Ignore LTO sections containing intermediate code. 348 // Ignore LTO sections containing intermediate code.
349 if (is_prefix_of(".gnu.lto_", name)) 349 if (is_prefix_of(".gnu.lto_", name))
350 return false; 350 return false;
351 } 351 }
352 // The GNU linker strips .gnu_debuglink sections, so we do too.
353 // This is a feature used to keep debugging information in
354 // separate files.
355 if (strcmp(name, ".gnu_debuglink") == 0)
356 return false;
352 return true; 357 return true;
353 358
354 default: 359 default:
355 return true; 360 return true;
356 } 361 }
357 } 362 }
358 363
359 // Return an output section named NAME, or NULL if there is none. 364 // Return an output section named NAME, or NULL if there is none.
360 365
361 Output_section* 366 Output_section*
(...skipping 19 matching lines...) Expand all
381 ++p) 386 ++p)
382 if (static_cast<elfcpp::PT>((*p)->type()) == type 387 if (static_cast<elfcpp::PT>((*p)->type()) == type
383 && ((*p)->flags() & set) == set 388 && ((*p)->flags() & set) == set
384 && ((*p)->flags() & clear) == 0) 389 && ((*p)->flags() & clear) == 0)
385 return *p; 390 return *p;
386 return NULL; 391 return NULL;
387 } 392 }
388 393
389 // Return the output section to use for section NAME with type TYPE 394 // Return the output section to use for section NAME with type TYPE
390 // and section flags FLAGS. NAME must be canonicalized in the string 395 // and section flags FLAGS. NAME must be canonicalized in the string
391 // pool, and NAME_KEY is the key. 396 // pool, and NAME_KEY is the key. IS_INTERP is true if this is the
397 // .interp section. IS_DYNAMIC_LINKER_SECTION is true if this section
398 // is used by the dynamic linker.
392 399
393 Output_section* 400 Output_section*
394 Layout::get_output_section(const char* name, Stringpool::Key name_key, 401 Layout::get_output_section(const char* name, Stringpool::Key name_key,
395 » » » elfcpp::Elf_Word type, elfcpp::Elf_Xword flags) 402 » » » elfcpp::Elf_Word type, elfcpp::Elf_Xword flags,
403 » » » bool is_interp, bool is_dynamic_linker_section)
396 { 404 {
397 elfcpp::Elf_Xword lookup_flags = flags; 405 elfcpp::Elf_Xword lookup_flags = flags;
398 406
399 // Ignoring SHF_WRITE and SHF_EXECINSTR here means that we combine 407 // Ignoring SHF_WRITE and SHF_EXECINSTR here means that we combine
400 // read-write with read-only sections. Some other ELF linkers do 408 // read-write with read-only sections. Some other ELF linkers do
401 // not do this. FIXME: Perhaps there should be an option 409 // not do this. FIXME: Perhaps there should be an option
402 // controlling this. 410 // controlling this.
403 lookup_flags &= ~(elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR); 411 lookup_flags &= ~(elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR);
404 412
405 const Key key(name_key, std::make_pair(type, lookup_flags)); 413 const Key key(name_key, std::make_pair(type, lookup_flags));
(...skipping 28 matching lines...) Expand all
434 elfcpp::Elf_Xword zero_flags = 0; 442 elfcpp::Elf_Xword zero_flags = 0;
435 const Key zero_key(name_key, std::make_pair(type, zero_flags)); 443 const Key zero_key(name_key, std::make_pair(type, zero_flags));
436 Section_name_map::iterator p = 444 Section_name_map::iterator p =
437 this->section_name_map_.find(zero_key); 445 this->section_name_map_.find(zero_key);
438 if (p != this->section_name_map_.end()) 446 if (p != this->section_name_map_.end())
439 os = p->second; 447 os = p->second;
440 } 448 }
441 } 449 }
442 450
443 if (os == NULL) 451 if (os == NULL)
444 » os = this->make_output_section(name, type, flags); 452 » os = this->make_output_section(name, type, flags, is_interp,
453 » » » » is_dynamic_linker_section);
445 ins.first->second = os; 454 ins.first->second = os;
446 return os; 455 return os;
447 } 456 }
448 } 457 }
449 458
450 // Pick the output section to use for section NAME, in input file 459 // Pick the output section to use for section NAME, in input file
451 // RELOBJ, with type TYPE and flags FLAGS. RELOBJ may be NULL for a 460 // RELOBJ, with type TYPE and flags FLAGS. RELOBJ may be NULL for a
452 // linker created section. IS_INPUT_SECTION is true if we are 461 // linker created section. IS_INPUT_SECTION is true if we are
453 // choosing an output section for an input section found in a input 462 // choosing an output section for an input section found in a input
454 // file. This will return NULL if the input section should be 463 // file. IS_INTERP is true if this is the .interp section.
455 // discarded. 464 // IS_DYNAMIC_LINKER_SECTION is true if this section is used by the
465 // dynamic linker. This will return NULL if the input section should
466 // be discarded.
456 467
457 Output_section* 468 Output_section*
458 Layout::choose_output_section(const Relobj* relobj, const char* name, 469 Layout::choose_output_section(const Relobj* relobj, const char* name,
459 elfcpp::Elf_Word type, elfcpp::Elf_Xword flags, 470 elfcpp::Elf_Word type, elfcpp::Elf_Xword flags,
460 » » » bool is_input_section) 471 » » » bool is_input_section, bool is_interp,
472 » » » bool is_dynamic_linker_section)
461 { 473 {
462 // We should not see any input sections after we have attached 474 // We should not see any input sections after we have attached
463 // sections to segments. 475 // sections to segments.
464 gold_assert(!is_input_section || !this->sections_are_attached_); 476 gold_assert(!is_input_section || !this->sections_are_attached_);
465 477
466 // Some flags in the input section should not be automatically 478 // Some flags in the input section should not be automatically
467 // copied to the output section. 479 // copied to the output section.
468 flags &= ~ (elfcpp::SHF_INFO_LINK 480 flags &= ~ (elfcpp::SHF_INFO_LINK
469 | elfcpp::SHF_LINK_ORDER 481 | elfcpp::SHF_LINK_ORDER
470 | elfcpp::SHF_GROUP 482 | elfcpp::SHF_GROUP
(...skipping 27 matching lines...) Expand all
498 return *output_section_slot; 510 return *output_section_slot;
499 } 511 }
500 512
501 // We don't put sections found in the linker script into 513 // We don't put sections found in the linker script into
502 // SECTION_NAME_MAP_. That keeps us from getting confused 514 // SECTION_NAME_MAP_. That keeps us from getting confused
503 // if an orphan section is mapped to a section with the same 515 // if an orphan section is mapped to a section with the same
504 // name as one in the linker script. 516 // name as one in the linker script.
505 517
506 name = this->namepool_.add(name, false, NULL); 518 name = this->namepool_.add(name, false, NULL);
507 519
508 » Output_section* os = this->make_output_section(name, type, flags); 520 » Output_section* os =
521 » this->make_output_section(name, type, flags, is_interp,
522 » » » » is_dynamic_linker_section);
509 os->set_found_in_sections_clause(); 523 os->set_found_in_sections_clause();
510 *output_section_slot = os; 524 *output_section_slot = os;
511 return os; 525 return os;
512 } 526 }
513 } 527 }
514 528
515 // FIXME: Handle SHF_OS_NONCONFORMING somewhere. 529 // FIXME: Handle SHF_OS_NONCONFORMING somewhere.
516 530
517 // Turn NAME from the name of the input section into the name of the 531 // Turn NAME from the name of the input section into the name of the
518 // output section. 532 // output section.
519 533
520 size_t len = strlen(name); 534 size_t len = strlen(name);
521 if (is_input_section 535 if (is_input_section
522 && !this->script_options_->saw_sections_clause() 536 && !this->script_options_->saw_sections_clause()
523 && !parameters->options().relocatable()) 537 && !parameters->options().relocatable())
524 name = Layout::output_section_name(name, &len); 538 name = Layout::output_section_name(name, &len);
525 539
526 Stringpool::Key name_key; 540 Stringpool::Key name_key;
527 name = this->namepool_.add_with_length(name, len, true, &name_key); 541 name = this->namepool_.add_with_length(name, len, true, &name_key);
528 542
529 // Find or make the output section. The output section is selected 543 // Find or make the output section. The output section is selected
530 // based on the section name, type, and flags. 544 // based on the section name, type, and flags.
531 return this->get_output_section(name, name_key, type, flags); 545 return this->get_output_section(name, name_key, type, flags, is_interp,
546 » » » » is_dynamic_linker_section);
532 } 547 }
533 548
534 // Return the output section to use for input section SHNDX, with name 549 // Return the output section to use for input section SHNDX, with name
535 // NAME, with header HEADER, from object OBJECT. RELOC_SHNDX is the 550 // NAME, with header HEADER, from object OBJECT. RELOC_SHNDX is the
536 // index of a relocation section which applies to this section, or 0 551 // index of a relocation section which applies to this section, or 0
537 // if none, or -1U if more than one. RELOC_TYPE is the type of the 552 // if none, or -1U if more than one. RELOC_TYPE is the type of the
538 // relocation section if there is one. Set *OFF to the offset of this 553 // relocation section if there is one. Set *OFF to the offset of this
539 // input section without the output section. Return NULL if the 554 // input section without the output section. Return NULL if the
540 // section should be discarded. Set *OFF to -1 if the section 555 // section should be discarded. Set *OFF to -1 if the section
541 // contents should not be written directly to the output file, but 556 // contents should not be written directly to the output file, but
(...skipping 12 matching lines...) Expand all
554 569
555 Output_section* os; 570 Output_section* os;
556 571
557 // In a relocatable link a grouped section must not be combined with 572 // In a relocatable link a grouped section must not be combined with
558 // any other sections. 573 // any other sections.
559 if (parameters->options().relocatable() 574 if (parameters->options().relocatable()
560 && (shdr.get_sh_flags() & elfcpp::SHF_GROUP) != 0) 575 && (shdr.get_sh_flags() & elfcpp::SHF_GROUP) != 0)
561 { 576 {
562 name = this->namepool_.add(name, true, NULL); 577 name = this->namepool_.add(name, true, NULL);
563 os = this->make_output_section(name, shdr.get_sh_type(), 578 os = this->make_output_section(name, shdr.get_sh_type(),
564 » » » » shdr.get_sh_flags()); 579 » » » » shdr.get_sh_flags(), false, false);
565 } 580 }
566 else 581 else
567 { 582 {
568 os = this->choose_output_section(object, name, shdr.get_sh_type(), 583 os = this->choose_output_section(object, name, shdr.get_sh_type(),
569 » » » » shdr.get_sh_flags(), true); 584 » » » » shdr.get_sh_flags(), true, false,
585 » » » » false);
570 if (os == NULL) 586 if (os == NULL)
571 return NULL; 587 return NULL;
572 } 588 }
573 589
574 // By default the GNU linker sorts input sections whose names match 590 // By default the GNU linker sorts input sections whose names match
575 // .ctor.*, .dtor.*, .init_array.*, or .fini_array.*. The sections 591 // .ctor.*, .dtor.*, .init_array.*, or .fini_array.*. The sections
576 // are sorted by name. This is used to implement constructor 592 // are sorted by name. This is used to implement constructor
577 // priority ordering. We are compatible. 593 // priority ordering. We are compatible.
578 if (!this->script_options_->saw_sections_clause() 594 if (!this->script_options_->saw_sections_clause()
579 && (is_prefix_of(".ctors.", name) 595 && (is_prefix_of(".ctors.", name)
(...skipping 30 matching lines...) Expand all
610 name = ".rel"; 626 name = ".rel";
611 else if (sh_type == elfcpp::SHT_RELA) 627 else if (sh_type == elfcpp::SHT_RELA)
612 name = ".rela"; 628 name = ".rela";
613 else 629 else
614 gold_unreachable(); 630 gold_unreachable();
615 name += data_section->name(); 631 name += data_section->name();
616 632
617 Output_section* os = this->choose_output_section(object, name.c_str(), 633 Output_section* os = this->choose_output_section(object, name.c_str(),
618 sh_type, 634 sh_type,
619 shdr.get_sh_flags(), 635 shdr.get_sh_flags(),
620 » » » » » » false); 636 » » » » » » false, false, false);
621 637
622 os->set_should_link_to_symtab(); 638 os->set_should_link_to_symtab();
623 os->set_info_section(data_section); 639 os->set_info_section(data_section);
624 640
625 Output_section_data* posd; 641 Output_section_data* posd;
626 if (sh_type == elfcpp::SHT_REL) 642 if (sh_type == elfcpp::SHT_REL)
627 { 643 {
628 os->set_entsize(elfcpp::Elf_sizes<size>::rel_size); 644 os->set_entsize(elfcpp::Elf_sizes<size>::rel_size);
629 posd = new Output_relocatable_relocs<elfcpp::SHT_REL, 645 posd = new Output_relocatable_relocs<elfcpp::SHT_REL,
630 size, 646 size,
(...skipping 26 matching lines...) Expand all
657 const char* signature, 673 const char* signature,
658 const elfcpp::Shdr<size, big_endian>& shdr, 674 const elfcpp::Shdr<size, big_endian>& shdr,
659 elfcpp::Elf_Word flags, 675 elfcpp::Elf_Word flags,
660 std::vector<unsigned int>* shndxes) 676 std::vector<unsigned int>* shndxes)
661 { 677 {
662 gold_assert(parameters->options().relocatable()); 678 gold_assert(parameters->options().relocatable());
663 gold_assert(shdr.get_sh_type() == elfcpp::SHT_GROUP); 679 gold_assert(shdr.get_sh_type() == elfcpp::SHT_GROUP);
664 group_section_name = this->namepool_.add(group_section_name, true, NULL); 680 group_section_name = this->namepool_.add(group_section_name, true, NULL);
665 Output_section* os = this->make_output_section(group_section_name, 681 Output_section* os = this->make_output_section(group_section_name,
666 elfcpp::SHT_GROUP, 682 elfcpp::SHT_GROUP,
667 » » » » » » shdr.get_sh_flags()); 683 » » » » » » shdr.get_sh_flags(),
684 » » » » » » false, false);
668 685
669 // We need to find a symbol with the signature in the symbol table. 686 // We need to find a symbol with the signature in the symbol table.
670 // If we don't find one now, we need to look again later. 687 // If we don't find one now, we need to look again later.
671 Symbol* sym = symtab->lookup(signature, NULL); 688 Symbol* sym = symtab->lookup(signature, NULL);
672 if (sym != NULL) 689 if (sym != NULL)
673 os->set_info_symndx(sym); 690 os->set_info_symndx(sym);
674 else 691 else
675 { 692 {
676 // Reserve some space to minimize reallocations. 693 // Reserve some space to minimize reallocations.
677 if (this->group_signatures_.empty()) 694 if (this->group_signatures_.empty())
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 off_t* off) 728 off_t* off)
712 { 729 {
713 gold_assert(shdr.get_sh_type() == elfcpp::SHT_PROGBITS); 730 gold_assert(shdr.get_sh_type() == elfcpp::SHT_PROGBITS);
714 gold_assert((shdr.get_sh_flags() & elfcpp::SHF_ALLOC) != 0); 731 gold_assert((shdr.get_sh_flags() & elfcpp::SHF_ALLOC) != 0);
715 732
716 const char* const name = ".eh_frame"; 733 const char* const name = ".eh_frame";
717 Output_section* os = this->choose_output_section(object, 734 Output_section* os = this->choose_output_section(object,
718 name, 735 name,
719 elfcpp::SHT_PROGBITS, 736 elfcpp::SHT_PROGBITS,
720 elfcpp::SHF_ALLOC, 737 elfcpp::SHF_ALLOC,
721 » » » » » » false); 738 » » » » » » false, false, false);
722 if (os == NULL) 739 if (os == NULL)
723 return NULL; 740 return NULL;
724 741
725 if (this->eh_frame_section_ == NULL) 742 if (this->eh_frame_section_ == NULL)
726 { 743 {
727 this->eh_frame_section_ = os; 744 this->eh_frame_section_ = os;
728 this->eh_frame_data_ = new Eh_frame(); 745 this->eh_frame_data_ = new Eh_frame();
729 746
730 if (parameters->options().eh_frame_hdr()) 747 if (parameters->options().eh_frame_hdr())
731 { 748 {
732 Output_section* hdr_os = 749 Output_section* hdr_os =
733 this->choose_output_section(NULL, 750 this->choose_output_section(NULL,
734 ".eh_frame_hdr", 751 ".eh_frame_hdr",
735 elfcpp::SHT_PROGBITS, 752 elfcpp::SHT_PROGBITS,
736 elfcpp::SHF_ALLOC, 753 elfcpp::SHF_ALLOC,
737 » » » » » false); 754 » » » » » false, false, false);
738 755
739 if (hdr_os != NULL) 756 if (hdr_os != NULL)
740 { 757 {
741 Eh_frame_hdr* hdr_posd = new Eh_frame_hdr(os, 758 Eh_frame_hdr* hdr_posd = new Eh_frame_hdr(os,
742 this->eh_frame_data_); 759 this->eh_frame_data_);
743 hdr_os->add_output_section_data(hdr_posd); 760 hdr_os->add_output_section_data(hdr_posd);
744 761
745 hdr_os->set_after_input_sections(); 762 hdr_os->set_after_input_sections();
746 763
747 if (!this->script_options_->saw_phdrs_clause()) 764 if (!this->script_options_->saw_phdrs_clause())
748 { 765 {
749 Output_segment* hdr_oseg; 766 Output_segment* hdr_oseg;
750 hdr_oseg = this->make_output_segment(elfcpp::PT_GNU_EH_FRAME, 767 hdr_oseg = this->make_output_segment(elfcpp::PT_GNU_EH_FRAME,
751 elfcpp::PF_R); 768 elfcpp::PF_R);
752 » » hdr_oseg->add_output_section(hdr_os, elfcpp::PF_R); 769 » » hdr_oseg->add_output_section(hdr_os, elfcpp::PF_R, false);
753 } 770 }
754 771
755 this->eh_frame_data_->set_eh_frame_hdr(hdr_posd); 772 this->eh_frame_data_->set_eh_frame_hdr(hdr_posd);
756 } 773 }
757 } 774 }
758 } 775 }
759 776
760 gold_assert(this->eh_frame_section_ == os); 777 gold_assert(this->eh_frame_section_ == os);
761 778
762 if (this->eh_frame_data_->add_ehframe_input_section(object, 779 if (this->eh_frame_data_->add_ehframe_input_section(object,
(...skipping 30 matching lines...) Expand all
793 810
794 return os; 811 return os;
795 } 812 }
796 813
797 // Add POSD to an output section using NAME, TYPE, and FLAGS. Return 814 // Add POSD to an output section using NAME, TYPE, and FLAGS. Return
798 // the output section. 815 // the output section.
799 816
800 Output_section* 817 Output_section*
801 Layout::add_output_section_data(const char* name, elfcpp::Elf_Word type, 818 Layout::add_output_section_data(const char* name, elfcpp::Elf_Word type,
802 elfcpp::Elf_Xword flags, 819 elfcpp::Elf_Xword flags,
803 » » » » Output_section_data* posd) 820 » » » » Output_section_data* posd,
821 » » » » bool is_dynamic_linker_section)
804 { 822 {
805 Output_section* os = this->choose_output_section(NULL, name, type, flags, 823 Output_section* os = this->choose_output_section(NULL, name, type, flags,
806 » » » » » » false); 824 » » » » » » false, false,
825 » » » » » » is_dynamic_linker_section);
807 if (os != NULL) 826 if (os != NULL)
808 os->add_output_section_data(posd); 827 os->add_output_section_data(posd);
809 return os; 828 return os;
810 } 829 }
811 830
812 // Map section flags to segment flags. 831 // Map section flags to segment flags.
813 832
814 elfcpp::Elf_Word 833 elfcpp::Elf_Word
815 Layout::section_flags_to_segment(elfcpp::Elf_Xword flags) 834 Layout::section_flags_to_segment(elfcpp::Elf_Xword flags)
816 { 835 {
(...skipping 14 matching lines...) Expand all
831 // (The Output_compressed_section class decides whether to compress 850 // (The Output_compressed_section class decides whether to compress
832 // a given section, and picks the name of the compressed section.) 851 // a given section, and picks the name of the compressed section.)
833 852
834 static bool 853 static bool
835 is_compressible_debug_section(const char* secname) 854 is_compressible_debug_section(const char* secname)
836 { 855 {
837 return (strncmp(secname, ".debug", sizeof(".debug") - 1) == 0); 856 return (strncmp(secname, ".debug", sizeof(".debug") - 1) == 0);
838 } 857 }
839 858
840 // Make a new Output_section, and attach it to segments as 859 // Make a new Output_section, and attach it to segments as
841 // appropriate. 860 // appropriate. IS_INTERP is true if this is the .interp section.
861 // IS_DYNAMIC_LINKER_SECTION is true if this section is used by the
862 // dynamic linker.
842 863
843 Output_section* 864 Output_section*
844 Layout::make_output_section(const char* name, elfcpp::Elf_Word type, 865 Layout::make_output_section(const char* name, elfcpp::Elf_Word type,
845 » » » elfcpp::Elf_Xword flags) 866 » » » elfcpp::Elf_Xword flags, bool is_interp,
867 » » » bool is_dynamic_linker_section)
846 { 868 {
847 Output_section* os; 869 Output_section* os;
848 if ((flags & elfcpp::SHF_ALLOC) == 0 870 if ((flags & elfcpp::SHF_ALLOC) == 0
849 && strcmp(parameters->options().compress_debug_sections(), "none") != 0 871 && strcmp(parameters->options().compress_debug_sections(), "none") != 0
850 && is_compressible_debug_section(name)) 872 && is_compressible_debug_section(name))
851 os = new Output_compressed_section(&parameters->options(), name, type, 873 os = new Output_compressed_section(&parameters->options(), name, type,
852 flags); 874 flags);
853
854 else if ((flags & elfcpp::SHF_ALLOC) == 0 875 else if ((flags & elfcpp::SHF_ALLOC) == 0
855 && parameters->options().strip_debug_non_line() 876 && parameters->options().strip_debug_non_line()
856 && strcmp(".debug_abbrev", name) == 0) 877 && strcmp(".debug_abbrev", name) == 0)
857 { 878 {
858 os = this->debug_abbrev_ = new Output_reduced_debug_abbrev_section( 879 os = this->debug_abbrev_ = new Output_reduced_debug_abbrev_section(
859 name, type, flags); 880 name, type, flags);
860 if (this->debug_info_) 881 if (this->debug_info_)
861 this->debug_info_->set_abbreviations(this->debug_abbrev_); 882 this->debug_info_->set_abbreviations(this->debug_abbrev_);
862 } 883 }
863 else if ((flags & elfcpp::SHF_ALLOC) == 0 884 else if ((flags & elfcpp::SHF_ALLOC) == 0
864 && parameters->options().strip_debug_non_line() 885 && parameters->options().strip_debug_non_line()
865 && strcmp(".debug_info", name) == 0) 886 && strcmp(".debug_info", name) == 0)
866 { 887 {
867 os = this->debug_info_ = new Output_reduced_debug_info_section( 888 os = this->debug_info_ = new Output_reduced_debug_info_section(
868 name, type, flags); 889 name, type, flags);
869 if (this->debug_abbrev_) 890 if (this->debug_abbrev_)
870 this->debug_info_->set_abbreviations(this->debug_abbrev_); 891 this->debug_info_->set_abbreviations(this->debug_abbrev_);
871 } 892 }
872 else 893 else
873 { 894 {
874 // FIXME: const_cast is ugly. 895 // FIXME: const_cast is ugly.
875 Target* target = const_cast<Target*>(&parameters->target()); 896 Target* target = const_cast<Target*>(&parameters->target());
876 os = target->make_output_section(name, type, flags); 897 os = target->make_output_section(name, type, flags);
877 } 898 }
878 899
900 if (is_interp)
901 os->set_is_interp();
902 if (is_dynamic_linker_section)
903 os->set_is_dynamic_linker_section();
904
879 parameters->target().new_output_section(os); 905 parameters->target().new_output_section(os);
880 906
881 this->section_list_.push_back(os); 907 this->section_list_.push_back(os);
882 908
883 // The GNU linker by default sorts some sections by priority, so we 909 // The GNU linker by default sorts some sections by priority, so we
884 // do the same. We need to know that this might happen before we 910 // do the same. We need to know that this might happen before we
885 // attach any input sections. 911 // attach any input sections.
886 if (!this->script_options_->saw_sections_clause() 912 if (!this->script_options_->saw_sections_clause()
887 && (strcmp(name, ".ctors") == 0 913 && (strcmp(name, ".ctors") == 0
888 || strcmp(name, ".dtors") == 0 914 || strcmp(name, ".dtors") == 0
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 // segments until after we've seen all the sections. 990 // segments until after we've seen all the sections.
965 if (this->script_options_->saw_sections_clause()) 991 if (this->script_options_->saw_sections_clause())
966 return; 992 return;
967 993
968 gold_assert(!this->script_options_->saw_phdrs_clause()); 994 gold_assert(!this->script_options_->saw_phdrs_clause());
969 995
970 // This output section goes into a PT_LOAD segment. 996 // This output section goes into a PT_LOAD segment.
971 997
972 elfcpp::Elf_Word seg_flags = Layout::section_flags_to_segment(flags); 998 elfcpp::Elf_Word seg_flags = Layout::section_flags_to_segment(flags);
973 999
1000 bool sort_sections = !this->script_options_->saw_sections_clause();
1001
974 // In general the only thing we really care about for PT_LOAD 1002 // In general the only thing we really care about for PT_LOAD
975 // segments is whether or not they are writable, so that is how we 1003 // segments is whether or not they are writable, so that is how we
976 // search for them. Large data sections also go into their own 1004 // search for them. Large data sections also go into their own
977 // PT_LOAD segment. People who need segments sorted on some other 1005 // PT_LOAD segment. People who need segments sorted on some other
978 // basis will have to use a linker script. 1006 // basis will have to use a linker script.
979 1007
980 Segment_list::const_iterator p; 1008 Segment_list::const_iterator p;
981 for (p = this->segment_list_.begin(); 1009 for (p = this->segment_list_.begin();
982 p != this->segment_list_.end(); 1010 p != this->segment_list_.end();
983 ++p) 1011 ++p)
984 { 1012 {
985 if ((*p)->type() != elfcpp::PT_LOAD) 1013 if ((*p)->type() != elfcpp::PT_LOAD)
986 continue; 1014 continue;
987 if (!parameters->options().omagic() 1015 if (!parameters->options().omagic()
988 && ((*p)->flags() & elfcpp::PF_W) != (seg_flags & elfcpp::PF_W)) 1016 && ((*p)->flags() & elfcpp::PF_W) != (seg_flags & elfcpp::PF_W))
989 continue; 1017 continue;
990 // If -Tbss was specified, we need to separate the data and BSS 1018 // If -Tbss was specified, we need to separate the data and BSS
991 // segments. 1019 // segments.
992 if (parameters->options().user_set_Tbss()) 1020 if (parameters->options().user_set_Tbss())
993 { 1021 {
994 if ((os->type() == elfcpp::SHT_NOBITS) 1022 if ((os->type() == elfcpp::SHT_NOBITS)
995 == (*p)->has_any_data_sections()) 1023 == (*p)->has_any_data_sections())
996 continue; 1024 continue;
997 } 1025 }
998 if (os->is_large_data_section() && !(*p)->is_large_data_segment()) 1026 if (os->is_large_data_section() && !(*p)->is_large_data_segment())
999 continue; 1027 continue;
1000 1028
1001 (*p)->add_output_section(os, seg_flags); 1029 (*p)->add_output_section(os, seg_flags, sort_sections);
1002 break; 1030 break;
1003 } 1031 }
1004 1032
1005 if (p == this->segment_list_.end()) 1033 if (p == this->segment_list_.end())
1006 { 1034 {
1007 Output_segment* oseg = this->make_output_segment(elfcpp::PT_LOAD, 1035 Output_segment* oseg = this->make_output_segment(elfcpp::PT_LOAD,
1008 seg_flags); 1036 seg_flags);
1009 if (os->is_large_data_section()) 1037 if (os->is_large_data_section())
1010 oseg->set_is_large_data_segment(); 1038 oseg->set_is_large_data_segment();
1011 oseg->add_output_section(os, seg_flags); 1039 oseg->add_output_section(os, seg_flags, sort_sections);
1012 } 1040 }
1013 1041
1014 // If we see a loadable SHT_NOTE section, we create a PT_NOTE 1042 // If we see a loadable SHT_NOTE section, we create a PT_NOTE
1015 // segment. 1043 // segment.
1016 if (os->type() == elfcpp::SHT_NOTE) 1044 if (os->type() == elfcpp::SHT_NOTE)
1017 { 1045 {
1018 // See if we already have an equivalent PT_NOTE segment. 1046 // See if we already have an equivalent PT_NOTE segment.
1019 for (p = this->segment_list_.begin(); 1047 for (p = this->segment_list_.begin();
1020 p != segment_list_.end(); 1048 p != segment_list_.end();
1021 ++p) 1049 ++p)
1022 { 1050 {
1023 if ((*p)->type() == elfcpp::PT_NOTE 1051 if ((*p)->type() == elfcpp::PT_NOTE
1024 && (((*p)->flags() & elfcpp::PF_W) 1052 && (((*p)->flags() & elfcpp::PF_W)
1025 == (seg_flags & elfcpp::PF_W))) 1053 == (seg_flags & elfcpp::PF_W)))
1026 { 1054 {
1027 (*p)->add_output_section(os, seg_flags); 1055 (*p)->add_output_section(os, seg_flags, false);
1028 break; 1056 break;
1029 } 1057 }
1030 } 1058 }
1031 1059
1032 if (p == this->segment_list_.end()) 1060 if (p == this->segment_list_.end())
1033 { 1061 {
1034 Output_segment* oseg = this->make_output_segment(elfcpp::PT_NOTE, 1062 Output_segment* oseg = this->make_output_segment(elfcpp::PT_NOTE,
1035 seg_flags); 1063 seg_flags);
1036 oseg->add_output_section(os, seg_flags); 1064 oseg->add_output_section(os, seg_flags, false);
1037 } 1065 }
1038 } 1066 }
1039 1067
1040 // If we see a loadable SHF_TLS section, we create a PT_TLS 1068 // If we see a loadable SHF_TLS section, we create a PT_TLS
1041 // segment. There can only be one such segment. 1069 // segment. There can only be one such segment.
1042 if ((flags & elfcpp::SHF_TLS) != 0) 1070 if ((flags & elfcpp::SHF_TLS) != 0)
1043 { 1071 {
1044 if (this->tls_segment_ == NULL) 1072 if (this->tls_segment_ == NULL)
1045 this->make_output_segment(elfcpp::PT_TLS, seg_flags); 1073 this->make_output_segment(elfcpp::PT_TLS, seg_flags);
1046 this->tls_segment_->add_output_section(os, seg_flags); 1074 this->tls_segment_->add_output_section(os, seg_flags, false);
1047 } 1075 }
1048 1076
1049 // If -z relro is in effect, and we see a relro section, we create a 1077 // If -z relro is in effect, and we see a relro section, we create a
1050 // PT_GNU_RELRO segment. There can only be one such segment. 1078 // PT_GNU_RELRO segment. There can only be one such segment.
1051 if (os->is_relro() && parameters->options().relro()) 1079 if (os->is_relro() && parameters->options().relro())
1052 { 1080 {
1053 gold_assert(seg_flags == (elfcpp::PF_R | elfcpp::PF_W)); 1081 gold_assert(seg_flags == (elfcpp::PF_R | elfcpp::PF_W));
1054 if (this->relro_segment_ == NULL) 1082 if (this->relro_segment_ == NULL)
1055 this->make_output_segment(elfcpp::PT_GNU_RELRO, seg_flags); 1083 this->make_output_segment(elfcpp::PT_GNU_RELRO, seg_flags);
1056 this->relro_segment_->add_output_section(os, seg_flags); 1084 this->relro_segment_->add_output_section(os, seg_flags, false);
1057 } 1085 }
1058 } 1086 }
1059 1087
1060 // Make an output section for a script. 1088 // Make an output section for a script.
1061 1089
1062 Output_section* 1090 Output_section*
1063 Layout::make_output_section_for_script(const char* name) 1091 Layout::make_output_section_for_script(const char* name)
1064 { 1092 {
1065 name = this->namepool_.add(name, false, NULL); 1093 name = this->namepool_.add(name, false, NULL);
1066 Output_section* os = this->make_output_section(name, elfcpp::SHT_PROGBITS, 1094 Output_section* os = this->make_output_section(name, elfcpp::SHT_PROGBITS,
1067 » » » » » » elfcpp::SHF_ALLOC); 1095 » » » » » » elfcpp::SHF_ALLOC, false,
1096 » » » » » » false);
1068 os->set_found_in_sections_clause(); 1097 os->set_found_in_sections_clause();
1069 return os; 1098 return os;
1070 } 1099 }
1071 1100
1072 // Return the number of segments we expect to see. 1101 // Return the number of segments we expect to see.
1073 1102
1074 size_t 1103 size_t
1075 Layout::expected_segment_count() const 1104 Layout::expected_segment_count() const
1076 { 1105 {
1077 size_t ret = this->segment_list_.size(); 1106 size_t ret = this->segment_list_.size();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 void 1156 void
1128 Layout::create_initial_dynamic_sections(Symbol_table* symtab) 1157 Layout::create_initial_dynamic_sections(Symbol_table* symtab)
1129 { 1158 {
1130 if (parameters->doing_static_link()) 1159 if (parameters->doing_static_link())
1131 return; 1160 return;
1132 1161
1133 this->dynamic_section_ = this->choose_output_section(NULL, ".dynamic", 1162 this->dynamic_section_ = this->choose_output_section(NULL, ".dynamic",
1134 elfcpp::SHT_DYNAMIC, 1163 elfcpp::SHT_DYNAMIC,
1135 (elfcpp::SHF_ALLOC 1164 (elfcpp::SHF_ALLOC
1136 | elfcpp::SHF_WRITE), 1165 | elfcpp::SHF_WRITE),
1137 » » » » » » false); 1166 » » » » » » false, false, true);
1138 this->dynamic_section_->set_is_relro(); 1167 this->dynamic_section_->set_is_relro();
1139 1168
1140 symtab->define_in_output_data("_DYNAMIC", NULL, this->dynamic_section_, 0, 0, 1169 symtab->define_in_output_data("_DYNAMIC", NULL, this->dynamic_section_, 0, 0,
1141 elfcpp::STT_OBJECT, elfcpp::STB_LOCAL, 1170 elfcpp::STT_OBJECT, elfcpp::STB_LOCAL,
1142 elfcpp::STV_HIDDEN, 0, false, false); 1171 elfcpp::STV_HIDDEN, 0, false, false);
1143 1172
1144 this->dynamic_data_ = new Output_data_dynamic(&this->dynpool_); 1173 this->dynamic_data_ = new Output_data_dynamic(&this->dynpool_);
1145 1174
1146 this->dynamic_section_->add_output_section_data(this->dynamic_data_); 1175 this->dynamic_section_->add_output_section_data(this->dynamic_data_);
1147 } 1176 }
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
1725 else 1754 else
1726 gold_unreachable(); 1755 gold_unreachable();
1727 1756
1728 memcpy(buffer + 3 * (size / 8), name, namesz); 1757 memcpy(buffer + 3 * (size / 8), name, namesz);
1729 1758
1730 elfcpp::Elf_Xword flags = 0; 1759 elfcpp::Elf_Xword flags = 0;
1731 if (allocate) 1760 if (allocate)
1732 flags = elfcpp::SHF_ALLOC; 1761 flags = elfcpp::SHF_ALLOC;
1733 Output_section* os = this->choose_output_section(NULL, section_name, 1762 Output_section* os = this->choose_output_section(NULL, section_name,
1734 elfcpp::SHT_NOTE, 1763 elfcpp::SHT_NOTE,
1735 » » » » » » flags, false); 1764 » » » » » » flags, false, false,
1765 » » » » » » false);
1736 if (os == NULL) 1766 if (os == NULL)
1737 return NULL; 1767 return NULL;
1738 1768
1739 Output_section_data* posd = new Output_data_const_buffer(buffer, notehdrsz, 1769 Output_section_data* posd = new Output_data_const_buffer(buffer, notehdrsz,
1740 size / 8, 1770 size / 8,
1741 "** note header"); 1771 "** note header");
1742 os->add_output_section_data(posd); 1772 os->add_output_section_data(posd);
1743 1773
1744 *trailing_padding = aligned_descsz - descsz; 1774 *trailing_padding = aligned_descsz - descsz;
1745 1775
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1804 else 1834 else
1805 is_stack_executable = false; 1835 is_stack_executable = false;
1806 } 1836 }
1807 1837
1808 if (parameters->options().relocatable()) 1838 if (parameters->options().relocatable())
1809 { 1839 {
1810 const char* name = this->namepool_.add(".note.GNU-stack", false, NULL); 1840 const char* name = this->namepool_.add(".note.GNU-stack", false, NULL);
1811 elfcpp::Elf_Xword flags = 0; 1841 elfcpp::Elf_Xword flags = 0;
1812 if (is_stack_executable) 1842 if (is_stack_executable)
1813 flags |= elfcpp::SHF_EXECINSTR; 1843 flags |= elfcpp::SHF_EXECINSTR;
1814 this->make_output_section(name, elfcpp::SHT_PROGBITS, flags); 1844 this->make_output_section(name, elfcpp::SHT_PROGBITS, flags, false,
1845 » » » » false);
1815 } 1846 }
1816 else 1847 else
1817 { 1848 {
1818 if (this->script_options_->saw_phdrs_clause()) 1849 if (this->script_options_->saw_phdrs_clause())
1819 return; 1850 return;
1820 int flags = elfcpp::PF_R | elfcpp::PF_W; 1851 int flags = elfcpp::PF_R | elfcpp::PF_W;
1821 if (is_stack_executable) 1852 if (is_stack_executable)
1822 flags |= elfcpp::PF_X; 1853 flags |= elfcpp::PF_X;
1823 this->make_output_segment(elfcpp::PT_GNU_STACK, flags); 1854 this->make_output_segment(elfcpp::PT_GNU_STACK, flags);
1824 } 1855 }
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1964 void 1995 void
1965 Layout::create_incremental_info_sections() 1996 Layout::create_incremental_info_sections()
1966 { 1997 {
1967 gold_assert(this->incremental_inputs_ != NULL); 1998 gold_assert(this->incremental_inputs_ != NULL);
1968 1999
1969 // Add the .gnu_incremental_inputs section. 2000 // Add the .gnu_incremental_inputs section.
1970 const char *incremental_inputs_name = 2001 const char *incremental_inputs_name =
1971 this->namepool_.add(".gnu_incremental_inputs", false, NULL); 2002 this->namepool_.add(".gnu_incremental_inputs", false, NULL);
1972 Output_section* inputs_os = 2003 Output_section* inputs_os =
1973 this->make_output_section(incremental_inputs_name, 2004 this->make_output_section(incremental_inputs_name,
1974 » » » elfcpp::SHT_GNU_INCREMENTAL_INPUTS, 0); 2005 » » » elfcpp::SHT_GNU_INCREMENTAL_INPUTS, 0,
2006 » » » false, false);
1975 Output_section_data* posd = 2007 Output_section_data* posd =
1976 this->incremental_inputs_->create_incremental_inputs_section_data(); 2008 this->incremental_inputs_->create_incremental_inputs_section_data();
1977 inputs_os->add_output_section_data(posd); 2009 inputs_os->add_output_section_data(posd);
1978 2010
1979 // Add the .gnu_incremental_strtab section. 2011 // Add the .gnu_incremental_strtab section.
1980 const char *incremental_strtab_name = 2012 const char *incremental_strtab_name =
1981 this->namepool_.add(".gnu_incremental_strtab", false, NULL); 2013 this->namepool_.add(".gnu_incremental_strtab", false, NULL);
1982 Output_section* strtab_os = this->make_output_section(incremental_strtab_name, 2014 Output_section* strtab_os = this->make_output_section(incremental_strtab_name,
1983 elfcpp::SHT_STRTAB, 2015 elfcpp::SHT_STRTAB,
1984 0); 2016 0, false, false);
1985 Output_data_strtab* strtab_data = 2017 Output_data_strtab* strtab_data =
1986 new Output_data_strtab(this->incremental_inputs_->get_stringpool()); 2018 new Output_data_strtab(this->incremental_inputs_->get_stringpool());
1987 strtab_os->add_output_section_data(strtab_data); 2019 strtab_os->add_output_section_data(strtab_data);
1988 2020
1989 inputs_os->set_link_section(strtab_data); 2021 inputs_os->set_link_section(strtab_data);
1990 } 2022 }
1991 2023
1992 // Return whether SEG1 should be before SEG2 in the output file. This 2024 // Return whether SEG1 should be before SEG2 in the output file. This
1993 // is based entirely on the segment type and flags. When this is 2025 // is based entirely on the segment type and flags. When this is
1994 // called the segment addresses has normally not yet been set. 2026 // called the segment addresses has normally not yet been set.
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
2586 off = symtab->finalize(off, dynoff, dyn_global_index, dyncount, 2618 off = symtab->finalize(off, dynoff, dyn_global_index, dyncount,
2587 &this->sympool_, &local_symcount); 2619 &this->sympool_, &local_symcount);
2588 2620
2589 if (!parameters->options().strip_all()) 2621 if (!parameters->options().strip_all())
2590 { 2622 {
2591 this->sympool_.set_string_offsets(); 2623 this->sympool_.set_string_offsets();
2592 2624
2593 const char* symtab_name = this->namepool_.add(".symtab", false, NULL); 2625 const char* symtab_name = this->namepool_.add(".symtab", false, NULL);
2594 Output_section* osymtab = this->make_output_section(symtab_name, 2626 Output_section* osymtab = this->make_output_section(symtab_name,
2595 elfcpp::SHT_SYMTAB, 2627 elfcpp::SHT_SYMTAB,
2596 » » » » » » » 0); 2628 » » » » » » » 0, false, false);
2597 this->symtab_section_ = osymtab; 2629 this->symtab_section_ = osymtab;
2598 2630
2599 Output_section_data* pos = new Output_data_fixed_space(off - startoff, 2631 Output_section_data* pos = new Output_data_fixed_space(off - startoff,
2600 align, 2632 align,
2601 "** symtab"); 2633 "** symtab");
2602 osymtab->add_output_section_data(pos); 2634 osymtab->add_output_section_data(pos);
2603 2635
2604 // We generate a .symtab_shndx section if we have more than 2636 // We generate a .symtab_shndx section if we have more than
2605 // SHN_LORESERVE sections. Technically it is possible that we 2637 // SHN_LORESERVE sections. Technically it is possible that we
2606 // don't need one, because it is possible that there are no 2638 // don't need one, because it is possible that there are no
2607 // symbols in any of sections with indexes larger than 2639 // symbols in any of sections with indexes larger than
2608 // SHN_LORESERVE. That is probably unusual, though, and it is 2640 // SHN_LORESERVE. That is probably unusual, though, and it is
2609 // easier to always create one than to compute section indexes 2641 // easier to always create one than to compute section indexes
2610 // twice (once here, once when writing out the symbols). 2642 // twice (once here, once when writing out the symbols).
2611 if (shnum >= elfcpp::SHN_LORESERVE) 2643 if (shnum >= elfcpp::SHN_LORESERVE)
2612 { 2644 {
2613 const char* symtab_xindex_name = this->namepool_.add(".symtab_shndx", 2645 const char* symtab_xindex_name = this->namepool_.add(".symtab_shndx",
2614 false, NULL); 2646 false, NULL);
2615 Output_section* osymtab_xindex = 2647 Output_section* osymtab_xindex =
2616 this->make_output_section(symtab_xindex_name, 2648 this->make_output_section(symtab_xindex_name,
2617 » » » » elfcpp::SHT_SYMTAB_SHNDX, 0); 2649 » » » » elfcpp::SHT_SYMTAB_SHNDX, 0, false,
2650 » » » » false);
2618 2651
2619 size_t symcount = (off - startoff) / symsize; 2652 size_t symcount = (off - startoff) / symsize;
2620 this->symtab_xindex_ = new Output_symtab_xindex(symcount); 2653 this->symtab_xindex_ = new Output_symtab_xindex(symcount);
2621 2654
2622 osymtab_xindex->add_output_section_data(this->symtab_xindex_); 2655 osymtab_xindex->add_output_section_data(this->symtab_xindex_);
2623 2656
2624 osymtab_xindex->set_link_section(osymtab); 2657 osymtab_xindex->set_link_section(osymtab);
2625 osymtab_xindex->set_addralign(4); 2658 osymtab_xindex->set_addralign(4);
2626 osymtab_xindex->set_entsize(4); 2659 osymtab_xindex->set_entsize(4);
2627 2660
2628 osymtab_xindex->set_after_input_sections(); 2661 osymtab_xindex->set_after_input_sections();
2629 2662
2630 // This tells the driver code to wait until the symbol table 2663 // This tells the driver code to wait until the symbol table
2631 // has written out before writing out the postprocessing 2664 // has written out before writing out the postprocessing
2632 // sections, including the .symtab_shndx section. 2665 // sections, including the .symtab_shndx section.
2633 this->any_postprocessing_sections_ = true; 2666 this->any_postprocessing_sections_ = true;
2634 } 2667 }
2635 2668
2636 const char* strtab_name = this->namepool_.add(".strtab", false, NULL); 2669 const char* strtab_name = this->namepool_.add(".strtab", false, NULL);
2637 Output_section* ostrtab = this->make_output_section(strtab_name, 2670 Output_section* ostrtab = this->make_output_section(strtab_name,
2638 elfcpp::SHT_STRTAB, 2671 elfcpp::SHT_STRTAB,
2639 » » » » » » » 0); 2672 » » » » » » » 0, false, false);
2640 2673
2641 Output_section_data* pstr = new Output_data_strtab(&this->sympool_); 2674 Output_section_data* pstr = new Output_data_strtab(&this->sympool_);
2642 ostrtab->add_output_section_data(pstr); 2675 ostrtab->add_output_section_data(pstr);
2643 2676
2644 osymtab->set_file_offset(startoff); 2677 osymtab->set_file_offset(startoff);
2645 osymtab->finalize_data_size(); 2678 osymtab->finalize_data_size();
2646 osymtab->set_link_section(ostrtab); 2679 osymtab->set_link_section(ostrtab);
2647 osymtab->set_info(local_symcount); 2680 osymtab->set_info(local_symcount);
2648 osymtab->set_entsize(symsize); 2681 osymtab->set_entsize(symsize);
2649 2682
2650 *poff = off; 2683 *poff = off;
2651 } 2684 }
2652 } 2685 }
2653 2686
2654 // Create the .shstrtab section, which holds the names of the 2687 // Create the .shstrtab section, which holds the names of the
2655 // sections. At the time this is called, we have created all the 2688 // sections. At the time this is called, we have created all the
2656 // output sections except .shstrtab itself. 2689 // output sections except .shstrtab itself.
2657 2690
2658 Output_section* 2691 Output_section*
2659 Layout::create_shstrtab() 2692 Layout::create_shstrtab()
2660 { 2693 {
2661 // FIXME: We don't need to create a .shstrtab section if we are 2694 // FIXME: We don't need to create a .shstrtab section if we are
2662 // stripping everything. 2695 // stripping everything.
2663 2696
2664 const char* name = this->namepool_.add(".shstrtab", false, NULL); 2697 const char* name = this->namepool_.add(".shstrtab", false, NULL);
2665 2698
2666 Output_section* os = this->make_output_section(name, elfcpp::SHT_STRTAB, 0); 2699 Output_section* os = this->make_output_section(name, elfcpp::SHT_STRTAB, 0,
2700 » » » » » » false, false);
2667 2701
2668 // We can't write out this section until we've set all the section 2702 // We can't write out this section until we've set all the section
2669 // names, and we don't set the names of compressed output sections 2703 // names, and we don't set the names of compressed output sections
2670 // until relocations are complete. 2704 // until relocations are complete.
2671 os->set_after_input_sections(); 2705 os->set_after_input_sections();
2672 2706
2673 Output_section_data* posd = new Output_data_strtab(&this->namepool_); 2707 Output_section_data* posd = new Output_data_strtab(&this->namepool_);
2674 os->add_output_section_data(posd); 2708 os->add_output_section_data(posd);
2675 2709
2676 return os; 2710 return os;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2769 align = 8; 2803 align = 8;
2770 } 2804 }
2771 else 2805 else
2772 gold_unreachable(); 2806 gold_unreachable();
2773 2807
2774 // Create the dynamic symbol table section. 2808 // Create the dynamic symbol table section.
2775 2809
2776 Output_section* dynsym = this->choose_output_section(NULL, ".dynsym", 2810 Output_section* dynsym = this->choose_output_section(NULL, ".dynsym",
2777 elfcpp::SHT_DYNSYM, 2811 elfcpp::SHT_DYNSYM,
2778 elfcpp::SHF_ALLOC, 2812 elfcpp::SHF_ALLOC,
2779 » » » » » » false); 2813 » » » » » » false, false, true);
2780 2814
2781 Output_section_data* odata = new Output_data_fixed_space(index * symsize, 2815 Output_section_data* odata = new Output_data_fixed_space(index * symsize,
2782 align, 2816 align,
2783 "** dynsym"); 2817 "** dynsym");
2784 dynsym->add_output_section_data(odata); 2818 dynsym->add_output_section_data(odata);
2785 2819
2786 dynsym->set_info(local_symcount); 2820 dynsym->set_info(local_symcount);
2787 dynsym->set_entsize(symsize); 2821 dynsym->set_entsize(symsize);
2788 dynsym->set_addralign(align); 2822 dynsym->set_addralign(align);
2789 2823
2790 this->dynsym_section_ = dynsym; 2824 this->dynsym_section_ = dynsym;
2791 2825
2792 Output_data_dynamic* const odyn = this->dynamic_data_; 2826 Output_data_dynamic* const odyn = this->dynamic_data_;
2793 odyn->add_section_address(elfcpp::DT_SYMTAB, dynsym); 2827 odyn->add_section_address(elfcpp::DT_SYMTAB, dynsym);
2794 odyn->add_constant(elfcpp::DT_SYMENT, symsize); 2828 odyn->add_constant(elfcpp::DT_SYMENT, symsize);
2795 2829
2796 // If there are more than SHN_LORESERVE allocated sections, we 2830 // If there are more than SHN_LORESERVE allocated sections, we
2797 // create a .dynsym_shndx section. It is possible that we don't 2831 // create a .dynsym_shndx section. It is possible that we don't
2798 // need one, because it is possible that there are no dynamic 2832 // need one, because it is possible that there are no dynamic
2799 // symbols in any of the sections with indexes larger than 2833 // symbols in any of the sections with indexes larger than
2800 // SHN_LORESERVE. This is probably unusual, though, and at this 2834 // SHN_LORESERVE. This is probably unusual, though, and at this
2801 // time we don't know the actual section indexes so it is 2835 // time we don't know the actual section indexes so it is
2802 // inconvenient to check. 2836 // inconvenient to check.
2803 if (this->allocated_output_section_count() >= elfcpp::SHN_LORESERVE) 2837 if (this->allocated_output_section_count() >= elfcpp::SHN_LORESERVE)
2804 { 2838 {
2805 Output_section* dynsym_xindex = 2839 Output_section* dynsym_xindex =
2806 this->choose_output_section(NULL, ".dynsym_shndx", 2840 this->choose_output_section(NULL, ".dynsym_shndx",
2807 elfcpp::SHT_SYMTAB_SHNDX, 2841 elfcpp::SHT_SYMTAB_SHNDX,
2808 elfcpp::SHF_ALLOC, 2842 elfcpp::SHF_ALLOC,
2809 » » » » false); 2843 » » » » false, false, true);
2810 2844
2811 this->dynsym_xindex_ = new Output_symtab_xindex(index); 2845 this->dynsym_xindex_ = new Output_symtab_xindex(index);
2812 2846
2813 dynsym_xindex->add_output_section_data(this->dynsym_xindex_); 2847 dynsym_xindex->add_output_section_data(this->dynsym_xindex_);
2814 2848
2815 dynsym_xindex->set_link_section(dynsym); 2849 dynsym_xindex->set_link_section(dynsym);
2816 dynsym_xindex->set_addralign(4); 2850 dynsym_xindex->set_addralign(4);
2817 dynsym_xindex->set_entsize(4); 2851 dynsym_xindex->set_entsize(4);
2818 2852
2819 dynsym_xindex->set_after_input_sections(); 2853 dynsym_xindex->set_after_input_sections();
2820 2854
2821 // This tells the driver code to wait until the symbol table has 2855 // This tells the driver code to wait until the symbol table has
2822 // written out before writing out the postprocessing sections, 2856 // written out before writing out the postprocessing sections,
2823 // including the .dynsym_shndx section. 2857 // including the .dynsym_shndx section.
2824 this->any_postprocessing_sections_ = true; 2858 this->any_postprocessing_sections_ = true;
2825 } 2859 }
2826 2860
2827 // Create the dynamic string table section. 2861 // Create the dynamic string table section.
2828 2862
2829 Output_section* dynstr = this->choose_output_section(NULL, ".dynstr", 2863 Output_section* dynstr = this->choose_output_section(NULL, ".dynstr",
2830 elfcpp::SHT_STRTAB, 2864 elfcpp::SHT_STRTAB,
2831 elfcpp::SHF_ALLOC, 2865 elfcpp::SHF_ALLOC,
2832 » » » » » » false); 2866 » » » » » » false, false, true);
2833 2867
2834 Output_section_data* strdata = new Output_data_strtab(&this->dynpool_); 2868 Output_section_data* strdata = new Output_data_strtab(&this->dynpool_);
2835 dynstr->add_output_section_data(strdata); 2869 dynstr->add_output_section_data(strdata);
2836 2870
2837 dynsym->set_link_section(dynstr); 2871 dynsym->set_link_section(dynstr);
2838 this->dynamic_section_->set_link_section(dynstr); 2872 this->dynamic_section_->set_link_section(dynstr);
2839 2873
2840 odyn->add_section_address(elfcpp::DT_STRTAB, dynstr); 2874 odyn->add_section_address(elfcpp::DT_STRTAB, dynstr);
2841 odyn->add_section_size(elfcpp::DT_STRSZ, dynstr); 2875 odyn->add_section_size(elfcpp::DT_STRSZ, dynstr);
2842 2876
2843 *pdynstr = dynstr; 2877 *pdynstr = dynstr;
2844 2878
2845 // Create the hash tables. 2879 // Create the hash tables.
2846 2880
2847 if (strcmp(parameters->options().hash_style(), "sysv") == 0 2881 if (strcmp(parameters->options().hash_style(), "sysv") == 0
2848 || strcmp(parameters->options().hash_style(), "both") == 0) 2882 || strcmp(parameters->options().hash_style(), "both") == 0)
2849 { 2883 {
2850 unsigned char* phash; 2884 unsigned char* phash;
2851 unsigned int hashlen; 2885 unsigned int hashlen;
2852 Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount, 2886 Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount,
2853 &phash, &hashlen); 2887 &phash, &hashlen);
2854 2888
2855 Output_section* hashsec = this->choose_output_section(NULL, ".hash", 2889 Output_section* hashsec = this->choose_output_section(NULL, ".hash",
2856 elfcpp::SHT_HASH, 2890 elfcpp::SHT_HASH,
2857 elfcpp::SHF_ALLOC, 2891 elfcpp::SHF_ALLOC,
2858 » » » » » » » false); 2892 » » » » » » » false, false, true);
2859 2893
2860 Output_section_data* hashdata = new Output_data_const_buffer(phash, 2894 Output_section_data* hashdata = new Output_data_const_buffer(phash,
2861 hashlen, 2895 hashlen,
2862 align, 2896 align,
2863 "** hash"); 2897 "** hash");
2864 hashsec->add_output_section_data(hashdata); 2898 hashsec->add_output_section_data(hashdata);
2865 2899
2866 hashsec->set_link_section(dynsym); 2900 hashsec->set_link_section(dynsym);
2867 hashsec->set_entsize(4); 2901 hashsec->set_entsize(4);
2868 2902
2869 odyn->add_section_address(elfcpp::DT_HASH, hashsec); 2903 odyn->add_section_address(elfcpp::DT_HASH, hashsec);
2870 } 2904 }
2871 2905
2872 if (strcmp(parameters->options().hash_style(), "gnu") == 0 2906 if (strcmp(parameters->options().hash_style(), "gnu") == 0
2873 || strcmp(parameters->options().hash_style(), "both") == 0) 2907 || strcmp(parameters->options().hash_style(), "both") == 0)
2874 { 2908 {
2875 unsigned char* phash; 2909 unsigned char* phash;
2876 unsigned int hashlen; 2910 unsigned int hashlen;
2877 Dynobj::create_gnu_hash_table(*pdynamic_symbols, local_symcount, 2911 Dynobj::create_gnu_hash_table(*pdynamic_symbols, local_symcount,
2878 &phash, &hashlen); 2912 &phash, &hashlen);
2879 2913
2880 Output_section* hashsec = this->choose_output_section(NULL, ".gnu.hash", 2914 Output_section* hashsec = this->choose_output_section(NULL, ".gnu.hash",
2881 elfcpp::SHT_GNU_HASH , 2915 elfcpp::SHT_GNU_HASH ,
2882 elfcpp::SHF_ALLOC, 2916 elfcpp::SHF_ALLOC,
2883 » » » » » » » false); 2917 » » » » » » » false, false, true);
2884 2918
2885 Output_section_data* hashdata = new Output_data_const_buffer(phash, 2919 Output_section_data* hashdata = new Output_data_const_buffer(phash,
2886 hashlen, 2920 hashlen,
2887 align, 2921 align,
2888 "** hash"); 2922 "** hash");
2889 hashsec->add_output_section_data(hashdata); 2923 hashsec->add_output_section_data(hashdata);
2890 2924
2891 hashsec->set_link_section(dynsym); 2925 hashsec->set_link_section(dynsym);
2892 hashsec->set_entsize(4); 2926 hashsec->set_entsize(4);
2893 2927
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2971 Layout::sized_create_version_sections( 3005 Layout::sized_create_version_sections(
2972 const Versions* versions, 3006 const Versions* versions,
2973 const Symbol_table* symtab, 3007 const Symbol_table* symtab,
2974 unsigned int local_symcount, 3008 unsigned int local_symcount,
2975 const std::vector<Symbol*>& dynamic_symbols, 3009 const std::vector<Symbol*>& dynamic_symbols,
2976 const Output_section* dynstr) 3010 const Output_section* dynstr)
2977 { 3011 {
2978 Output_section* vsec = this->choose_output_section(NULL, ".gnu.version", 3012 Output_section* vsec = this->choose_output_section(NULL, ".gnu.version",
2979 elfcpp::SHT_GNU_versym, 3013 elfcpp::SHT_GNU_versym,
2980 elfcpp::SHF_ALLOC, 3014 elfcpp::SHF_ALLOC,
2981 » » » » » » false); 3015 » » » » » » false, false, true);
2982 3016
2983 unsigned char* vbuf; 3017 unsigned char* vbuf;
2984 unsigned int vsize; 3018 unsigned int vsize;
2985 versions->symbol_section_contents<size, big_endian>(symtab, &this->dynpool_, 3019 versions->symbol_section_contents<size, big_endian>(symtab, &this->dynpool_,
2986 local_symcount, 3020 local_symcount,
2987 dynamic_symbols, 3021 dynamic_symbols,
2988 &vbuf, &vsize); 3022 &vbuf, &vsize);
2989 3023
2990 Output_section_data* vdata = new Output_data_const_buffer(vbuf, vsize, 2, 3024 Output_section_data* vdata = new Output_data_const_buffer(vbuf, vsize, 2,
2991 "** versions"); 3025 "** versions");
2992 3026
2993 vsec->add_output_section_data(vdata); 3027 vsec->add_output_section_data(vdata);
2994 vsec->set_entsize(2); 3028 vsec->set_entsize(2);
2995 vsec->set_link_section(this->dynsym_section_); 3029 vsec->set_link_section(this->dynsym_section_);
2996 3030
2997 Output_data_dynamic* const odyn = this->dynamic_data_; 3031 Output_data_dynamic* const odyn = this->dynamic_data_;
2998 odyn->add_section_address(elfcpp::DT_VERSYM, vsec); 3032 odyn->add_section_address(elfcpp::DT_VERSYM, vsec);
2999 3033
3000 if (versions->any_defs()) 3034 if (versions->any_defs())
3001 { 3035 {
3002 Output_section* vdsec; 3036 Output_section* vdsec;
3003 vdsec= this->choose_output_section(NULL, ".gnu.version_d", 3037 vdsec= this->choose_output_section(NULL, ".gnu.version_d",
3004 elfcpp::SHT_GNU_verdef, 3038 elfcpp::SHT_GNU_verdef,
3005 elfcpp::SHF_ALLOC, 3039 elfcpp::SHF_ALLOC,
3006 » » » » » false); 3040 » » » » » false, false, true);
3007 3041
3008 unsigned char* vdbuf; 3042 unsigned char* vdbuf;
3009 unsigned int vdsize; 3043 unsigned int vdsize;
3010 unsigned int vdentries; 3044 unsigned int vdentries;
3011 versions->def_section_contents<size, big_endian>(&this->dynpool_, &vdbuf, 3045 versions->def_section_contents<size, big_endian>(&this->dynpool_, &vdbuf,
3012 &vdsize, &vdentries); 3046 &vdsize, &vdentries);
3013 3047
3014 Output_section_data* vddata = 3048 Output_section_data* vddata =
3015 new Output_data_const_buffer(vdbuf, vdsize, 4, "** version defs"); 3049 new Output_data_const_buffer(vdbuf, vdsize, 4, "** version defs");
3016 3050
3017 vdsec->add_output_section_data(vddata); 3051 vdsec->add_output_section_data(vddata);
3018 vdsec->set_link_section(dynstr); 3052 vdsec->set_link_section(dynstr);
3019 vdsec->set_info(vdentries); 3053 vdsec->set_info(vdentries);
3020 3054
3021 odyn->add_section_address(elfcpp::DT_VERDEF, vdsec); 3055 odyn->add_section_address(elfcpp::DT_VERDEF, vdsec);
3022 odyn->add_constant(elfcpp::DT_VERDEFNUM, vdentries); 3056 odyn->add_constant(elfcpp::DT_VERDEFNUM, vdentries);
3023 } 3057 }
3024 3058
3025 if (versions->any_needs()) 3059 if (versions->any_needs())
3026 { 3060 {
3027 Output_section* vnsec; 3061 Output_section* vnsec;
3028 vnsec = this->choose_output_section(NULL, ".gnu.version_r", 3062 vnsec = this->choose_output_section(NULL, ".gnu.version_r",
3029 elfcpp::SHT_GNU_verneed, 3063 elfcpp::SHT_GNU_verneed,
3030 elfcpp::SHF_ALLOC, 3064 elfcpp::SHF_ALLOC,
3031 » » » » » false); 3065 » » » » » false, false, true);
3032 3066
3033 unsigned char* vnbuf; 3067 unsigned char* vnbuf;
3034 unsigned int vnsize; 3068 unsigned int vnsize;
3035 unsigned int vnentries; 3069 unsigned int vnentries;
3036 versions->need_section_contents<size, big_endian>(&this->dynpool_, 3070 versions->need_section_contents<size, big_endian>(&this->dynpool_,
3037 &vnbuf, &vnsize, 3071 &vnbuf, &vnsize,
3038 &vnentries); 3072 &vnentries);
3039 3073
3040 Output_section_data* vndata = 3074 Output_section_data* vndata =
3041 new Output_data_const_buffer(vnbuf, vnsize, 4, "** version refs"); 3075 new Output_data_const_buffer(vnbuf, vnsize, 4, "** version refs");
(...skipping 19 matching lines...) Expand all
3061 gold_assert(interp != NULL); 3095 gold_assert(interp != NULL);
3062 } 3096 }
3063 3097
3064 size_t len = strlen(interp) + 1; 3098 size_t len = strlen(interp) + 1;
3065 3099
3066 Output_section_data* odata = new Output_data_const(interp, len, 1); 3100 Output_section_data* odata = new Output_data_const(interp, len, 1);
3067 3101
3068 Output_section* osec = this->choose_output_section(NULL, ".interp", 3102 Output_section* osec = this->choose_output_section(NULL, ".interp",
3069 elfcpp::SHT_PROGBITS, 3103 elfcpp::SHT_PROGBITS,
3070 elfcpp::SHF_ALLOC, 3104 elfcpp::SHF_ALLOC,
3071 » » » » » » false); 3105 » » » » » » false, true, true);
3072 osec->add_output_section_data(odata); 3106 osec->add_output_section_data(odata);
3073 3107
3074 if (!this->script_options_->saw_phdrs_clause()) 3108 if (!this->script_options_->saw_phdrs_clause())
3075 { 3109 {
3076 Output_segment* oseg = this->make_output_segment(elfcpp::PT_INTERP, 3110 Output_segment* oseg = this->make_output_segment(elfcpp::PT_INTERP,
3077 elfcpp::PF_R); 3111 elfcpp::PF_R);
3078 oseg->add_output_section(osec, elfcpp::PF_R); 3112 oseg->add_output_section(osec, elfcpp::PF_R, false);
3079 } 3113 }
3080 } 3114 }
3081 3115
3082 // Finish the .dynamic section and PT_DYNAMIC segment. 3116 // Finish the .dynamic section and PT_DYNAMIC segment.
3083 3117
3084 void 3118 void
3085 Layout::finish_dynamic_section(const Input_objects* input_objects, 3119 Layout::finish_dynamic_section(const Input_objects* input_objects,
3086 const Symbol_table* symtab) 3120 const Symbol_table* symtab)
3087 { 3121 {
3088 if (!this->script_options_->saw_phdrs_clause()) 3122 if (!this->script_options_->saw_phdrs_clause())
3089 { 3123 {
3090 Output_segment* oseg = this->make_output_segment(elfcpp::PT_DYNAMIC, 3124 Output_segment* oseg = this->make_output_segment(elfcpp::PT_DYNAMIC,
3091 (elfcpp::PF_R 3125 (elfcpp::PF_R
3092 | elfcpp::PF_W)); 3126 | elfcpp::PF_W));
3093 oseg->add_output_section(this->dynamic_section_, 3127 oseg->add_output_section(this->dynamic_section_,
3094 » » » elfcpp::PF_R | elfcpp::PF_W); 3128 » » » elfcpp::PF_R | elfcpp::PF_W,
3129 » » » false);
3095 } 3130 }
3096 3131
3097 Output_data_dynamic* const odyn = this->dynamic_data_; 3132 Output_data_dynamic* const odyn = this->dynamic_data_;
3098 3133
3099 for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin(); 3134 for (Input_objects::Dynobj_iterator p = input_objects->dynobj_begin();
3100 p != input_objects->dynobj_end(); 3135 p != input_objects->dynobj_end();
3101 ++p) 3136 ++p)
3102 { 3137 {
3103 // FIXME: Handle --as-needed. 3138 if (!(*p)->is_needed()
3139 » && (*p)->input_file()->options().as_needed())
3140 » {
3141 » // This dynamic object was linked with --as-needed, but it
3142 » // is not needed.
3143 » continue;
3144 » }
3145
3104 odyn->add_string(elfcpp::DT_NEEDED, (*p)->soname()); 3146 odyn->add_string(elfcpp::DT_NEEDED, (*p)->soname());
3105 } 3147 }
3106 3148
3107 if (parameters->options().shared()) 3149 if (parameters->options().shared())
3108 { 3150 {
3109 const char* soname = parameters->options().soname(); 3151 const char* soname = parameters->options().soname();
3110 if (soname != NULL) 3152 if (soname != NULL)
3111 odyn->add_string(elfcpp::DT_SONAME, soname); 3153 odyn->add_string(elfcpp::DT_SONAME, soname);
3112 } 3154 }
3113 3155
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after
4006 const unsigned char* symbol_names, 4048 const unsigned char* symbol_names,
4007 off_t symbol_names_size, 4049 off_t symbol_names_size,
4008 unsigned int shndx, 4050 unsigned int shndx,
4009 const elfcpp::Shdr<64, true>& shdr, 4051 const elfcpp::Shdr<64, true>& shdr,
4010 unsigned int reloc_shndx, 4052 unsigned int reloc_shndx,
4011 unsigned int reloc_type, 4053 unsigned int reloc_type,
4012 off_t* off); 4054 off_t* off);
4013 #endif 4055 #endif
4014 4056
4015 } // End namespace gold. 4057 } // End namespace gold.
OLDNEW
« no previous file with comments | « binutils/gold/layout.h ('k') | binutils/gold/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698