Properly install gold as default linker
[binutils-gdb.git] / gold / gold.cc
index 013702fed878cef0e5d7c30bbb6859c84ea1cf47..30d623e7fe29d02d6c8395a0a4ff28a963f76398 100644 (file)
@@ -502,17 +502,15 @@ queue_middle_tasks(const General_options& options,
   if (parameters->options().gc_sections())
     {
       // Find the start symbol if any.
-      Symbol* start_sym = symtab->lookup(parameters->entry());
-      if (start_sym != NULL)
-       {
-         bool is_ordinary;
-         unsigned int shndx = start_sym->shndx(&is_ordinary);
-         if (is_ordinary)
-           {
-             symtab->gc()->worklist().push(
-               Section_id(start_sym->object(), shndx));
-           }
-       }
+      Symbol* sym = symtab->lookup(parameters->entry());
+      if (sym != NULL)
+       symtab->gc_mark_symbol(sym);
+      sym = symtab->lookup(parameters->options().init());
+      if (sym != NULL && sym->is_defined() && !sym->is_from_dynobj())
+       symtab->gc_mark_symbol(sym);
+      sym = symtab->lookup(parameters->options().fini());
+      if (sym != NULL && sym->is_defined() && !sym->is_from_dynobj())
+       symtab->gc_mark_symbol(sym);
       // Symbols named with -u should not be considered garbage.
       symtab->gc_mark_undef_symbols(layout);
       gold_assert(symtab->gc() != NULL);
@@ -530,11 +528,13 @@ queue_middle_tasks(const General_options& options,
 
   // Call Object::layout for the second time to determine the
   // output_sections for all referenced input sections.  When
-  // --gc-sections or --icf is turned on, Object::layout is
-  // called twice.  It is called the first time when the
-  // symbols are added.
+  // --gc-sections or --icf is turned on, or when certain input
+  // sections have to be mapped to unique segments, Object::layout
+  // is called twice.  It is called the first time when symbols
+  // are added.
   if (parameters->options().gc_sections()
-      || parameters->options().icf_enabled())
+      || parameters->options().icf_enabled()
+      || layout->is_unique_segment_for_sections_specified())
     {
       for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
           p != input_objects->relobj_end();
@@ -545,6 +545,14 @@ queue_middle_tasks(const General_options& options,
        }
     }
 
+  // Layout deferred objects due to plugins.
+  if (parameters->options().has_plugins())
+    {
+      Plugin_manager* plugins = parameters->options().plugins();
+      gold_assert(plugins != NULL);
+      plugins->layout_deferred_objects();
+    }
+
   /* If plugins have specified a section order, re-arrange input sections
      according to a specified section order.  If --section-ordering-file is
      also specified, do not do anything here.  */
@@ -559,14 +567,6 @@ queue_middle_tasks(const General_options& options,
        (*p)->update_section_layout(layout->get_section_order_map());
     }
 
-  // Layout deferred objects due to plugins.
-  if (parameters->options().has_plugins())
-    {
-      Plugin_manager* plugins = parameters->options().plugins();
-      gold_assert(plugins != NULL);
-      plugins->layout_deferred_objects();
-    }
-
   if (parameters->options().gc_sections()
       || parameters->options().icf_enabled())
     {