From: Ian Lance Taylor Date: Tue, 21 Aug 2007 20:37:32 +0000 (+0000) Subject: Add support for -rpath. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=41f542e70b89b9ea2875c438b0c9a60ac46092dd;p=binutils-gdb.git Add support for -rpath. --- diff --git a/gold/layout.cc b/gold/layout.cc index 62ba5f30dec..2f85db4d300 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -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. diff --git a/gold/options.cc b/gold/options.cc index b8339e8a625..36e0044c233 100644 --- a/gold/options.cc +++ b/gold/options.cc @@ -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"), diff --git a/gold/options.h b/gold/options.h index 56907c058ea..dc38b2f1c79 100644 --- a/gold/options.h +++ b/gold/options.h @@ -43,7 +43,7 @@ class General_options { return this->dynamic_linker_; } // -L: Library search path. - typedef std::list Dir_list; + typedef std::vector 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_; }; diff --git a/gold/output.h b/gold/output.h index 7ed53ff06d7..3147080320f 100644 --- a/gold/output.h +++ b/gold/output.h @@ -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);