diff options
author | Cary Coutant <ccoutant@gmail.com> | 2015-08-21 12:32:33 -0700 |
---|---|---|
committer | Cary Coutant <ccoutant@gmail.com> | 2015-08-25 18:39:20 -0700 |
commit | 4bfacfd359a1f8d026d1a350f56f2f5d70b6cb65 (patch) | |
tree | daed2bfd37f874c2e75cf0d43c961d36180531bf /gold/object.h | |
parent | 1757d35c8a35d77fd631705589024456c6030966 (diff) | |
download | gdb-4bfacfd359a1f8d026d1a350f56f2f5d70b6cb65.zip gdb-4bfacfd359a1f8d026d1a350f56f2f5d70b6cb65.tar.gz gdb-4bfacfd359a1f8d026d1a350f56f2f5d70b6cb65.tar.bz2 |
Fix --no-as-needed when shared library is listed twice on the command line.
When a shared library is listed twice on the command line, the linker
ignores the second mention. If the first mention is in the scope of
an --as-needed option, and the second one is under the scope of a
--no-as-needed option, the --no-as-needed should take effect, but
doesn't. This patch keeps track of the objects we've already seen,
and updates the --as-needed flag so that if a shared object is ever
seen with --no-as-needed, it will be marked as such.
gold/
PR gold/18859
* object.cc (Input_objects::add_object): Store objects in a map,
indexed by soname; update as-needed flag when necessary.
* object.h (Object::clear_as_needed): New method.
(Input_objects::so_names_): Change from set to map.
Diffstat (limited to 'gold/object.h')
-rw-r--r-- | gold/object.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/gold/object.h b/gold/object.h index e8f74ac..f796fb5 100644 --- a/gold/object.h +++ b/gold/object.h @@ -731,6 +731,11 @@ class Object set_as_needed() { this->as_needed_ = true; } + // Clear flag that this object was linked with --as-needed. + void + clear_as_needed() + { this->as_needed_ = false; } + // Return whether this object was linked with --as-needed. bool as_needed() const @@ -2836,7 +2841,7 @@ class Input_objects // The list of dynamic objects included in the link. Dynobj_list dynobj_list_; // SONAMEs that we have seen. - Unordered_set<std::string> sonames_; + Unordered_map<std::string, Object*> sonames_; // Manage cross-references if requested. Cref* cref_; }; |