summaryrefslogtreecommitdiff
path: root/gold/object.h
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2015-08-21 12:32:33 -0700
committerCary Coutant <ccoutant@gmail.com>2015-08-25 18:39:20 -0700
commit4bfacfd359a1f8d026d1a350f56f2f5d70b6cb65 (patch)
treedaed2bfd37f874c2e75cf0d43c961d36180531bf /gold/object.h
parent1757d35c8a35d77fd631705589024456c6030966 (diff)
downloadbinutils-gdb-4bfacfd359a1f8d026d1a350f56f2f5d70b6cb65.tar.gz
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.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/gold/object.h b/gold/object.h
index e8f74ac9bcb..f796fb50147 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_;
};