* layout.cc (Layout::layout_reloc): In relocatable link don't
authorIan Lance Taylor <ian@airs.com>
Sat, 24 Apr 2010 14:32:23 +0000 (14:32 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 24 Apr 2010 14:32:23 +0000 (14:32 +0000)
combine reloc sections for grouped sections.

gold/ChangeLog
gold/layout.cc

index 153828cb7b028a1ee39a897eeb1bae67c89c90d4..5b5026461690fffc3aa4171215f3c1332a211187 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-24  Ian Lance Taylor  <iant@google.com>
+
+       * layout.cc (Layout::layout_reloc): In relocatable link don't
+       combine reloc sections for grouped sections.
+
 2010-04-23  Sriraman Tallam  <tmsriram@google.com>
 
        * gc.h (gc_process_relocs): Pass information on relocs pointing to
index 2ffbdf49770288e42a7cb2ab9c0825adaf260e56..36cfa8bd744063286d5d41fd283ae08de8ed0b30 100644 (file)
@@ -699,11 +699,20 @@ Layout::layout_reloc(Sized_relobj<size, big_endian>* object,
     gold_unreachable();
   name += data_section->name();
 
-  Output_section* os = this->choose_output_section(object, name.c_str(),
-                                                  sh_type,
-                                                  shdr.get_sh_flags(),
-                                                  false, false, false,
-                                                  false, false, false);
+  // In a relocatable link relocs for a grouped section must not be
+  // combined with other reloc sections.
+  Output_section* os;
+  if (!parameters->options().relocatable()
+      || (data_section->flags() & elfcpp::SHF_GROUP) == 0)
+    os = this->choose_output_section(object, name.c_str(), sh_type,
+                                    shdr.get_sh_flags(), false, false,
+                                    false, false, false, false);
+  else
+    {
+      const char* n = this->namepool_.add(name.c_str(), true, NULL);
+      os = this->make_output_section(n, sh_type, shdr.get_sh_flags(),
+                                    false, false, false, false, false);
+    }
 
   os->set_should_link_to_symtab();
   os->set_info_section(data_section);