Add support for -rpath.
authorIan Lance Taylor <iant@google.com>
Tue, 21 Aug 2007 20:37:32 +0000 (20:37 +0000)
committerIan Lance Taylor <iant@google.com>
Tue, 21 Aug 2007 20:37:32 +0000 (20:37 +0000)
gold/layout.cc
gold/options.cc
gold/options.h
gold/output.h

index 62ba5f30dec9d66ffa5e59aa39d51e40267d7140..2f85db4d3005db788dc7dde8f40156246e913cea 100644 (file)
@@ -1148,6 +1148,35 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
     odyn->add_symbol(elfcpp::DT_FINI, sym);
 
   // FIXME: Support DT_INIT_ARRAY and DT_FINI_ARRAY.
+
+  // Add a DT_RPATH entry if needed.
+  const General_options::Dir_list& rpath(this->options_.rpath());
+  if (!rpath.empty())
+    {
+      std::string rpath_val;
+      for (General_options::Dir_list::const_iterator p = rpath.begin();
+           p != rpath.end();
+           ++p)
+        {
+          if (rpath_val.empty())
+            rpath_val = *p;
+          else
+            {
+              // Eliminate duplicates.
+              General_options::Dir_list::const_iterator q;
+              for (q = rpath.begin(); q != p; ++q)
+                if (strcmp(*q, *p) == 0)
+                  break;
+              if (q == p)
+                {
+                  rpath_val += ':';
+                  rpath_val += *p;
+                }
+            }
+        }
+
+      odyn->add_string(elfcpp::DT_RPATH, rpath_val);
+    }
 }
 
 // The mapping of .gnu.linkonce section names to real section names.
index b8339e8a625390ba35f89b31bcc9fd8104876d2d..36e0044c2334e9ffee170962f72791ee1cdd10a9 100644 (file)
@@ -244,6 +244,9 @@ options::Command_line_options::options[] =
              &General_options::set_output_file_name),
   GENERAL_NOARG('r', NULL, N_("Generate relocatable output"), NULL,
                ONE_DASH, &General_options::set_relocatable),
+  GENERAL_ARG('R', "rpath", N_("Add directory to runtime search path"),
+              N_("-R DIR, -rpath DIR"), ONE_DASH,
+              &General_options::add_to_rpath),
   GENERAL_NOARG('\0', "shared", N_("Generate shared library"),
                NULL, ONE_DASH, &General_options::set_shared),
   GENERAL_NOARG('\0', "static", N_("Do not link against shared libraries"),
index 56907c058eadbc8ecd76d86d1a6b2538d3da7705..dc38b2f1c7967972fbca6d12f20e49ceae0d5a8a 100644 (file)
@@ -43,7 +43,7 @@ class General_options
   { return this->dynamic_linker_; }
 
   // -L: Library search path.
-  typedef std::list<const char*> Dir_list;
+  typedef std::vector<const char*> Dir_list;
 
   const Dir_list&
   search_path() const
@@ -59,6 +59,11 @@ class General_options
   is_relocatable() const
   { return this->is_relocatable_; }
 
+  // --rpath: The runtime search path.
+  const Dir_list&
+  rpath() const
+  { return this->rpath_; }
+
   // --shared: Whether generating a shared object.
   bool
   is_shared() const
@@ -93,6 +98,10 @@ class General_options
   set_relocatable()
   { this->is_relocatable_ = true; }
 
+  void
+  add_to_rpath(const char* arg)
+  { this->rpath_.push_back(arg); }
+
   void
   set_shared()
   { this->is_shared_ = true; }
@@ -109,6 +118,7 @@ class General_options
   Dir_list search_path_;
   const char* output_file_name_;
   bool is_relocatable_;
+  Dir_list rpath_;
   bool is_shared_;
   bool is_static_;
 };
index 7ed53ff06d7717bd437a91462c1ce9c543dfe5d8..3147080320ff38bb0d0cb49f0e90f0ec7288865f 100644 (file)
@@ -1040,6 +1040,10 @@ class Output_data_dynamic : public Output_section_data
   add_string(elfcpp::DT tag, const char* str)
   { this->add_entry(Dynamic_entry(tag, this->pool_->add(str, NULL))); }
 
+  void
+  add_string(elfcpp::DT tag, const std::string& str)
+  { this->add_string(tag, str.c_str()); }
+
   // Set the final data size.
   void
   do_set_address(uint64_t, off_t);