PR gold/12163
authorCary Coutant <ccoutant@google.com>
Thu, 2 Jun 2011 20:13:23 +0000 (20:13 +0000)
committerCary Coutant <ccoutant@google.com>
Thu, 2 Jun 2011 20:13:23 +0000 (20:13 +0000)
* gold/archive.cc (Archive::Archive): Initialize new data member.
(Archive::include_all_members): Return if archive has already been
included.
* gold/archive.h (Archive::include_all_members_): New data member.

gold/ChangeLog
gold/archive.cc
gold/archive.h

index 4691aff..a974f8f 100644 (file)
@@ -1,3 +1,11 @@
+2011-06-02  Cary Coutant  <ccoutant@google.com>
+
+       PR gold/12163
+       * gold/archive.cc (Archive::Archive): Initialize new data member.
+       (Archive::include_all_members): Return if archive has already been
+       included.
+       * gold/archive.h (Archive::include_all_members_): New data member.
+
 2011-06-02  Nick Clifton  <nickc@redhat.com>
 
        * dynobj.h: Fix spelling mistake in comment.
index a7a5b93..c3f7b94 100644 (file)
@@ -179,7 +179,8 @@ Archive::Archive(const std::string& name, Input_file* input_file,
   : Library_base(task), name_(name), input_file_(input_file), armap_(),
     armap_names_(), extended_names_(), armap_checked_(), seen_offsets_(),
     members_(), is_thin_archive_(is_thin_archive), included_member_(false),
-    nested_archives_(), dirpath_(dirpath), num_members_(0)
+    nested_archives_(), dirpath_(dirpath), num_members_(0),
+    included_all_members_(false)
 {
   this->no_export_ =
     parameters->options().check_excluded_libs(input_file->found_name());
@@ -847,6 +848,13 @@ bool
 Archive::include_all_members(Symbol_table* symtab, Layout* layout,
                              Input_objects* input_objects, Mapfile* mapfile)
 {
+  // Don't include the same archive twice.  This can happen if
+  // --whole-archive is nested inside --start-group (PR gold/12163).
+  if (this->included_all_members_)
+    return true;
+
+  this->included_all_members_ = true;
+
   input_objects->archive_start(this);
 
   if (this->members_.size() > 0)
index 78c2cc8..e73a687 100644 (file)
@@ -405,6 +405,8 @@ class Archive : public Library_base
   unsigned int num_members_;
   // True if we exclude this library archive from automatic export.
   bool no_export_;
+  // True if this library has been included as a --whole-archive.
+  bool included_all_members_;
 };
 
 // This class is used to read an archive and pick out the desired