Fix soname for library found in search path.
authorIan Lance Taylor <iant@google.com>
Tue, 9 Oct 2007 17:46:15 +0000 (17:46 +0000)
committerIan Lance Taylor <iant@google.com>
Tue, 9 Oct 2007 17:46:15 +0000 (17:46 +0000)
gold/dynobj.cc
gold/fileread.cc
gold/fileread.h

index 581772086de55aa5b46901167d49c30b85f41084..805d869f2e9f3b2840430807848b58d9a02ce975 100644 (file)
@@ -42,7 +42,7 @@ Dynobj::soname() const
 {
   if (!this->soname_.empty())
     return this->soname_.c_str();
-  return this->name().c_str();
+  return this->input_file()->found_name().c_str();
 }
 
 // Class Sized_dynobj.
index 1bbd8412a8109cf1e6c051dd0311a50d133b25b9..88ac12611a2a2034e719aa2b99ca6f4c49baa0e5 100644 (file)
@@ -397,8 +397,10 @@ Input_file::open(const General_options& options, const Dirsearch& dirpath)
   if (IS_ABSOLUTE_PATH (this->input_argument_->name())
       || (!this->input_argument_->is_lib()
          && this->input_argument_->extra_search_path() == NULL))
-    name = this->input_argument_->name();
-
+    {
+      name = this->input_argument_->name();
+      this->found_name_ = name;
+    }
   // Case 3: is_lib is true
   else if (this->input_argument_->is_lib())
     {
@@ -421,8 +423,11 @@ Input_file::open(const General_options& options, const Dirsearch& dirpath)
                  this->input_argument_->name());
          gold_exit(false);
        }
+      if (n2.empty() || name[name.length() - 1] == 'o')
+       this->found_name_ = n1;
+      else
+       this->found_name_ = n2;
     }
-
   // Case 4: extra_search_path is not empty
   else
     {
@@ -446,6 +451,7 @@ Input_file::open(const General_options& options, const Dirsearch& dirpath)
               gold_exit(false);
             }
         }
+      this->found_name_ = this->input_argument_->name();
     }
 
   // Now that we've figured out where the file lives, try to open it.
index abeb28e07b952f2fdb6cbc9dfa7210519120e703..349a2b5217303a02305492286d9cb1c67cda4b70 100644 (file)
@@ -260,7 +260,8 @@ class Input_file
 {
  public:
   Input_file(const Input_file_argument* input_argument)
-    : input_argument_(input_argument), file_(), is_in_sysroot_(false)
+    : input_argument_(input_argument), found_name_(), file_(),
+      is_in_sysroot_(false)
   { }
 
   // Create an input file with the contents already provided.  This is
@@ -272,16 +273,24 @@ class Input_file
   void
   open(const General_options&, const Dirsearch&);
 
-  // Return the name given by the user.
+  // Return the name given by the user.  For -lc this will return "c".
   const char*
   name() const
   { return this->input_argument_->name(); }
 
-  // Return the file name.
+  // Return the file name.  For -lc this will return something like
+  // "/usr/lib/libc.so".
   const std::string&
   filename() const
   { return this->file_.filename(); }
 
+  // Return the name under which we found the file, corresponding to
+  // the command line.  For -lc this will return something like
+  // "libc.so".
+  const std::string&
+  found_name() const
+  { return this->found_name_; }
+
   // Return the position dependent options.
   const Position_dependent_options&
   options() const
@@ -303,6 +312,11 @@ class Input_file
 
   // The argument from the command line.
   const Input_file_argument* input_argument_;
+  // The name under which we opened the file.  This is like the name
+  // on the command line, but -lc turns into libc.so (or whatever).
+  // It only includes the full path if the path was on the command
+  // line.
+  std::string found_name_;
   // The file after we open it.
   File_read file_;
   // Whether we found the file in a directory in the system root.