Add support for -rpath.

This commit is contained in:
Ian Lance Taylor 2007-08-21 20:37:32 +00:00
parent fcb7aa2f6b
commit 41f542e70b
4 changed files with 47 additions and 1 deletions

View 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.

View 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"),

View 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_;
};

View 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);