* archive.cc (Library_base::should_include_member): Pull in object
authorIan Lance Taylor <ian@airs.com>
Wed, 25 May 2011 00:17:47 +0000 (00:17 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 25 May 2011 00:17:47 +0000 (00:17 +0000)
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
gold/archive.cc
gold/gold.cc
gold/layout.cc
gold/output.cc
gold/output.h
gold/parameters.cc
gold/parameters.h
gold/plugin.cc

index 12463516dc77ae4b3414bcf986a01bbb76dbe68b..94774ae9cbc56339be7d503ee47152ef89ceac90 100644 (file)
@@ -1,3 +1,16 @@
+2011-05-24  Ian Lance Taylor  <iant@google.com>
+
+       * 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  <ccoutant@google.com>
 
        * gold.cc (queue_initial_tasks): Pass incremental base filename
index 6a1e3b944b6a9de453e1b6169ef11009ed29f006..a7a5b93ed709b7dbd6fe26fe4da46b81f607bbd6 100644 (file)
@@ -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;
     }
index 4f1f871250ed539e77949d54457edf087f2f4668..fc3974edb13df5bcecb79175e23217721a323142 100644 (file)
@@ -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;
index 356a664d2e2c186f3f23545c69cad532d8e8d7a3..f44640cd55853e90b5ec39efd1c160180eedefcb 100644 (file)
@@ -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)
index b3fd35d671cd4f098e056412a360b6d3d2a111cb..202d8c2bc9dcbe2dd036f749694ab408c2a99a2b 100644 (file)
@@ -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<int size>
 typename elfcpp::Elf_types<size>::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<size>::Value_type v;
index da2e9cb735b04d9101264709b7023f3c32078b32..86c308ff73ae57f51ccc6c791e36a52912267ae5 100644 (file)
@@ -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,
index e04168f924cf9e78a209b0a8108acc3bf9f3d302..194c81bd389ceb8ad81cbac70240c82ba39facdd 100644 (file)
@@ -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,
index f9022ae1a9661092abba97ca51fc945d094da643..786750300712a4cdb148604b9652a452da3ca052 100644 (file)
@@ -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
index 3a5e6725137fb89b13b152b58c209971e383827b..345df281554d5dd12e358a0a76325257eca98372 100644 (file)
@@ -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();