From a10ae760821ec6f09cf63f93e3b2ff0e03fbaa3d Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 25 May 2011 00:17:47 +0000 Subject: [PATCH] * archive.cc (Library_base::should_include_member): Pull in object from archive if it defines the entry symbol. * parameters.cc (Parameters::entry): New function. * parameters.h (class Parameters): Declare entry. * output.h (class Output_file_header): Remove entry_ field. * output.cc (Output_file_header::Output_file_header): Remove entry parameter. Change all callers. (Output_file_header::entry): Use parameters->entry. * gold.cc (queue_middle_tasks): Likewise. * plugin.cc (Plugin_hook::run): Likewise. --- gold/ChangeLog | 13 +++++++++++++ gold/archive.cc | 5 +++++ gold/gold.cc | 6 +----- gold/layout.cc | 5 ++--- gold/output.cc | 18 +++++------------- gold/output.h | 4 +--- gold/parameters.cc | 14 ++++++++++++++ gold/parameters.h | 4 ++++ gold/plugin.cc | 6 +----- 9 files changed, 46 insertions(+), 29 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 1246351..94774ae 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,16 @@ +2011-05-24 Ian Lance Taylor + + * archive.cc (Library_base::should_include_member): Pull in object + from archive if it defines the entry symbol. + * parameters.cc (Parameters::entry): New function. + * parameters.h (class Parameters): Declare entry. + * output.h (class Output_file_header): Remove entry_ field. + * output.cc (Output_file_header::Output_file_header): Remove entry + parameter. Change all callers. + (Output_file_header::entry): Use parameters->entry. + * gold.cc (queue_middle_tasks): Likewise. + * plugin.cc (Plugin_hook::run): Likewise. + 2011-05-24 Cary Coutant * gold.cc (queue_initial_tasks): Pass incremental base filename diff --git a/gold/archive.cc b/gold/archive.cc index 6a1e3b9..a7a5b93 100644 --- a/gold/archive.cc +++ b/gold/archive.cc @@ -113,6 +113,11 @@ Library_base::should_include_member(Symbol_table* symtab, Layout* layout, *why = buf; delete[] buf; } + else if (strcmp(sym_name, parameters->entry()) == 0) + { + *why = "entry symbol "; + *why += sym_name; + } else return Library_base::SHOULD_INCLUDE_UNKNOWN; } diff --git a/gold/gold.cc b/gold/gold.cc index 4f1f871..fc3974e 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -501,11 +501,7 @@ queue_middle_tasks(const General_options& options, if (parameters->options().gc_sections()) { // Find the start symbol if any. - Symbol* start_sym; - if (parameters->options().entry()) - start_sym = symtab->lookup(parameters->options().entry()); - else - start_sym = symtab->lookup("_start"); + Symbol* start_sym = symtab->lookup(parameters->entry()); if (start_sym != NULL) { bool is_ordinary; diff --git a/gold/layout.cc b/gold/layout.cc index 356a664..f44640c 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -2192,9 +2192,8 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab, : new Output_segment_headers(this->segment_list_)); // Lay out the file header. - Output_file_header* file_header - = new Output_file_header(target, symtab, segment_headers, - parameters->options().entry()); + Output_file_header* file_header = new Output_file_header(target, symtab, + segment_headers); this->special_output_list_.push_back(file_header); if (segment_headers != NULL) diff --git a/gold/output.cc b/gold/output.cc index b3fd35d..202d8c2 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -425,14 +425,12 @@ Output_segment_headers::do_size() const Output_file_header::Output_file_header(const Target* target, const Symbol_table* symtab, - const Output_segment_headers* osh, - const char* entry) + const Output_segment_headers* osh) : target_(target), symtab_(symtab), segment_header_(osh), section_header_(NULL), - shstrtab_(NULL), - entry_(entry) + shstrtab_(NULL) { this->set_data_size(this->do_size()); } @@ -572,22 +570,16 @@ Output_file_header::do_sized_write(Output_file* of) of->write_output_view(0, ehdr_size, view); } -// Return the value to use for the entry address. THIS->ENTRY_ is the -// symbol specified on the command line, if any. +// Return the value to use for the entry address. template typename elfcpp::Elf_types::Elf_Addr Output_file_header::entry() { - const bool should_issue_warning = (this->entry_ != NULL + const bool should_issue_warning = (parameters->options().entry() != NULL && !parameters->options().relocatable() && !parameters->options().shared()); - - // FIXME: Need to support target specific entry symbol. - const char* entry = this->entry_; - if (entry == NULL) - entry = "_start"; - + const char* entry = parameters->entry(); Symbol* sym = this->symtab_->lookup(entry); typename Sized_symbol::Value_type v; diff --git a/gold/output.h b/gold/output.h index da2e9cb..86c308f 100644 --- a/gold/output.h +++ b/gold/output.h @@ -566,8 +566,7 @@ class Output_file_header : public Output_data public: Output_file_header(const Target*, const Symbol_table*, - const Output_segment_headers*, - const char* entry); + const Output_segment_headers*); // Add information about the section headers. We lay out the ELF // file header before we create the section headers. @@ -614,7 +613,6 @@ class Output_file_header : public Output_data const Output_segment_headers* segment_header_; const Output_section_headers* section_header_; const Output_section* shstrtab_; - const char* entry_; }; // Output sections are mainly comprised of input sections. However, diff --git a/gold/parameters.cc b/gold/parameters.cc index e04168f..194c81b 100644 --- a/gold/parameters.cc +++ b/gold/parameters.cc @@ -211,6 +211,20 @@ Parameters::check_target_endianness() } } +// Return the name of the entry symbol. + +const char* +Parameters::entry() const +{ + const char* ret = this->options().entry(); + if (ret == NULL) + { + // FIXME: Need to support target specific entry symbol. + ret = "_start"; + } + return ret; +} + // Set the incremental linking mode to INCREMENTAL_FULL. Used when // the linker determines that an incremental update is not possible. // Returns false if the incremental mode was INCREMENTAL_UPDATE, diff --git a/gold/parameters.h b/gold/parameters.h index f9022ae..7867503 100644 --- a/gold/parameters.h +++ b/gold/parameters.h @@ -134,6 +134,10 @@ class Parameters return debug_; } + // Return the name of the entry symbol. + const char* + entry() const; + // A convenience routine for combining size and endianness. It also // checks the HAVE_TARGET_FOO configure options and dies if the // current target's size/endianness is not supported according to diff --git a/gold/plugin.cc b/gold/plugin.cc index 3a5e672..345df28 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -1218,11 +1218,7 @@ void Plugin_hook::run(Workqueue* workqueue) { gold_assert(this->options_.has_plugins()); - Symbol* start_sym; - if (parameters->options().entry()) - start_sym = this->symtab_->lookup(parameters->options().entry()); - else - start_sym = this->symtab_->lookup("_start"); + Symbol* start_sym = this->symtab_->lookup(parameters->entry()); if (start_sym != NULL) start_sym->set_in_real_elf(); -- 2.7.4