Add support for -rpath.
This commit is contained in:
parent
fcb7aa2f6b
commit
41f542e70b
|
@ -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.
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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_;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue