aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2007-11-07 00:45:05 +0000
committerIan Lance Taylor <iant@google.com>2007-11-07 00:45:05 +0000
commita7a81c1d9d5e6191ec7a2c3ce2ecc03e1264e4df (patch)
treef1f2a8e096c9854921abc6abcc5ea35ca02b7ecf
parent019cdb1a59d66739843fdb0e6221566bcf7d60bd (diff)
downloadgdb-a7a81c1d9d5e6191ec7a2c3ce2ecc03e1264e4df.zip
gdb-a7a81c1d9d5e6191ec7a2c3ce2ecc03e1264e4df.tar.gz
gdb-a7a81c1d9d5e6191ec7a2c3ce2ecc03e1264e4df.tar.bz2
From Craig Silverstein: Handle a .so file in a .a file.
-rw-r--r--gold/dynobj.cc29
-rw-r--r--gold/dynobj.h4
2 files changed, 27 insertions, 6 deletions
diff --git a/gold/dynobj.cc b/gold/dynobj.cc
index 119f0c7..95ffe08 100644
--- a/gold/dynobj.cc
+++ b/gold/dynobj.cc
@@ -35,14 +35,37 @@ namespace gold
// Class Dynobj.
+// Sets up the default soname_ to use, in the (rare) cases we never
+// see a DT_SONAME entry.
+
+Dynobj::Dynobj(const std::string& name, Input_file* input_file, off_t offset)
+ : Object(name, input_file, true, offset)
+{
+ // This will be overridden by a DT_SONAME entry, hopefully. But if
+ // we never see a DT_SONAME entry, our rule is to use the dynamic
+ // object's filename. The only exception is when the dynamic object
+ // is part of an archive (so the filename is the archive's
+ // filename). In that case, we use just the dynobj's name-in-archive.
+ this->soname_ = this->input_file()->found_name();
+ if (this->offset() != 0)
+ {
+ std::string::size_type open_paren = this->name().find('(');
+ std::string::size_type close_paren = this->name().find(')');
+ if (open_paren != std::string::npos && close_paren != std::string::npos)
+ {
+ // It's an archive, and name() is of the form 'foo.a(bar.so)'.
+ this->soname_ = this->name().substr(open_paren + 1,
+ close_paren - (open_paren + 1));
+ }
+ }
+}
+
// Return the string to use in a DT_NEEDED entry.
const char*
Dynobj::soname() const
{
- if (!this->soname_.empty())
- return this->soname_.c_str();
- return this->input_file()->found_name().c_str();
+ return this->soname_.c_str();
}
// Class Sized_dynobj.
diff --git a/gold/dynobj.h b/gold/dynobj.h
index aea004d..d9c3e10 100644
--- a/gold/dynobj.h
+++ b/gold/dynobj.h
@@ -39,9 +39,7 @@ class General_options;
class Dynobj : public Object
{
public:
- Dynobj(const std::string& name, Input_file* input_file, off_t offset = 0)
- : Object(name, input_file, true, offset), soname_()
- { }
+ Dynobj(const std::string& name, Input_file* input_file, off_t offset = 0);
// Return the name to use in a DT_NEEDED entry for this object.
const char*