diff options
author | Cary Coutant <ccoutant@google.com> | 2011-06-02 20:13:23 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2011-06-02 20:13:23 +0000 |
commit | 7cdb37d9aa10a7e988a3812304da6b04dc2fd4c1 (patch) | |
tree | 30af4c568ba363cbb07f0ef04145f7f7dc2d7a1b | |
parent | 8dfd1e6d6ee42d903a027e42670ef8d3553678c3 (diff) | |
download | gdb-7cdb37d9aa10a7e988a3812304da6b04dc2fd4c1.zip gdb-7cdb37d9aa10a7e988a3812304da6b04dc2fd4c1.tar.gz gdb-7cdb37d9aa10a7e988a3812304da6b04dc2fd4c1.tar.bz2 |
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.
-rw-r--r-- | gold/ChangeLog | 8 | ||||
-rw-r--r-- | gold/archive.cc | 10 | ||||
-rw-r--r-- | gold/archive.h | 2 |
3 files changed, 19 insertions, 1 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 4691aff..a974f8f 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -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. diff --git a/gold/archive.cc b/gold/archive.cc index a7a5b93..c3f7b94 100644 --- a/gold/archive.cc +++ b/gold/archive.cc @@ -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) diff --git a/gold/archive.h b/gold/archive.h index 78c2cc8..e73a687 100644 --- a/gold/archive.h +++ b/gold/archive.h @@ -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 |