diff options
author | Ian Lance Taylor <iant@google.com> | 2007-08-21 20:37:32 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-08-21 20:37:32 +0000 |
commit | 41f542e70b89b9ea2875c438b0c9a60ac46092dd (patch) | |
tree | e731637699fca298f82185865790dd38321e4f69 | |
parent | fcb7aa2f6b17eb5211fe4d361eab8d985c40065e (diff) | |
download | gdb-41f542e70b89b9ea2875c438b0c9a60ac46092dd.zip gdb-41f542e70b89b9ea2875c438b0c9a60ac46092dd.tar.gz gdb-41f542e70b89b9ea2875c438b0c9a60ac46092dd.tar.bz2 |
Add support for -rpath.
-rw-r--r-- | gold/layout.cc | 29 | ||||
-rw-r--r-- | gold/options.cc | 3 | ||||
-rw-r--r-- | gold/options.h | 12 | ||||
-rw-r--r-- | gold/output.h | 4 |
4 files changed, 47 insertions, 1 deletions
diff --git a/gold/layout.cc b/gold/layout.cc index 62ba5f3..2f85db4 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 b8339e8..36e0044 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 56907c0..dc38b2f 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<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 @@ -94,6 +99,10 @@ class General_options { 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 7ed53ff..3147080 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); |