2013-03-29 Sriraman Tallam <tmsriram@google.com>
authorSriraman Tallam <tmsriram@google.com>
Sat, 30 Mar 2013 01:03:23 +0000 (01:03 +0000)
committerSriraman Tallam <tmsriram@google.com>
Sat, 30 Mar 2013 01:03:23 +0000 (01:03 +0000)
* archive.cc (Archive::get_elf_object_for_member):  Create the elf
object before calling the plugin claim_file handler.  Pass the elf
object of the archive to the plugin. Delete the elf object if the
plugin claims the file.

gold/ChangeLog
gold/archive.cc

index 49ed934..360599c 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-29  Sriraman Tallam  <tmsriram@google.com>
+
+       * archive.cc (Archive::get_elf_object_for_member):  Create the elf
+       object before calling the plugin claim_file handler.  Pass the elf
+       object of the archive to the plugin. Delete the elf object if the
+       plugin claims the file.
+
 2013-03-21  Alan Modra  <amodra@gmail.com>
 
        * layout.cc (Layout::set_segment_offsets): Accept writable .text
index 4db813d..f2cd848 100644 (file)
@@ -654,33 +654,45 @@ Archive::get_elf_object_for_member(off_t off, bool* punconfigured)
                                 &member_name))
     return NULL;
 
+  const unsigned char* ehdr;
+  int read_size;
+  Object *obj = NULL;
+  bool is_elf_obj = false;
+
+  if (is_elf_object(input_file, memoff, &ehdr, &read_size))
+    {
+      obj = make_elf_object((std::string(this->input_file_->filename())
+                            + "(" + member_name + ")"),
+                           input_file, memoff, ehdr, read_size,
+                           punconfigured);
+      is_elf_obj = true;
+    }
+
   if (parameters->options().has_plugins())
     {
-      Object* obj = parameters->options().plugins()->claim_file(input_file,
-                                                                memoff,
-                                                                memsize,
-                                                               NULL);
-      if (obj != NULL)
+      Object* plugin_obj
+       = parameters->options().plugins()->claim_file(input_file,
+                                                     memoff,
+                                                     memsize,
+                                                     obj);
+      if (plugin_obj != NULL)
         {
           // The input file was claimed by a plugin, and its symbols
           // have been provided by the plugin.
-          return obj;
+         // Delete its elf object.
+         if (obj != NULL)
+           delete obj;
+          return plugin_obj;
         }
     }
 
-  const unsigned char* ehdr;
-  int read_size;
-  if (!is_elf_object(input_file, memoff, &ehdr, &read_size))
+  if (!is_elf_obj)
     {
       gold_error(_("%s: member at %zu is not an ELF object"),
                 this->name().c_str(), static_cast<size_t>(off));
       return NULL;
     }
 
-  Object* obj = make_elf_object((std::string(this->input_file_->filename())
-                                + "(" + member_name + ")"),
-                               input_file, memoff, ehdr, read_size,
-                               punconfigured);
   if (obj == NULL)
     return NULL;
   obj->set_no_export(this->no_export());