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.
&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"),
{ 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
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
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; }
Dir_list search_path_;
const char* output_file_name_;
bool is_relocatable_;
+ Dir_list rpath_;
bool is_shared_;
bool is_static_;
};
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);