From Craig Silverstein: implement -Ttext.

This commit is contained in:
Ian Lance Taylor 2007-10-16 22:38:36 +00:00
parent 928a4139f6
commit 0c5e9c22aa
7 changed files with 64 additions and 31 deletions

View File

@ -264,7 +264,7 @@ const Target::Target_info Target_i386::i386_info =
false, // has_resolve
true, // has_code_fill
"/usr/lib/libc.so.1", // dynamic_linker
0x08048000, // text_segment_address
0x08048000, // default_text_segment_address
0x1000, // abi_pagesize
0x1000 // common_pagesize
};

View File

@ -817,7 +817,11 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
// Find the PT_LOAD segments, and set their addresses and offsets
// and their section's addresses and offsets.
uint64_t addr = target->text_segment_address();
uint64_t addr;
if (options_.user_set_text_segment_address())
addr = options_.text_segment_address();
else
addr = target->default_text_segment_address();
off_t off = 0;
bool was_readonly = false;
for (Segment_list::iterator p = this->segment_list_.begin();

View File

@ -306,44 +306,46 @@ namespace gold
const options::One_option
options::Command_line_options::options[] =
{
SPECIAL('l', "library", N_("Search for library LIBNAME"),
N_("-lLIBNAME, --library LIBNAME"), TWO_DASHES,
&library),
SPECIAL('(', "start-group", N_("Start a library search group"), NULL,
TWO_DASHES, &start_group),
SPECIAL(')', "end-group", N_("End a library search group"), NULL,
TWO_DASHES, &end_group),
POSDEP_NOARG('\0', "as-needed",
N_("Only set DT_NEEDED for dynamic libs if used"),
NULL, TWO_DASHES, &Position_dependent_options::set_as_needed),
POSDEP_NOARG('\0', "no-as-needed",
N_("Always DT_NEEDED for dynamic libs (default)"),
NULL, TWO_DASHES, &Position_dependent_options::clear_as_needed),
GENERAL_NOARG('E', "export-dynamic", N_("Export all dynamic symbols"),
NULL, TWO_DASHES, &General_options::set_export_dynamic),
GENERAL_NOARG('\0', "eh-frame-hdr", N_("Create exception frame header"),
NULL, TWO_DASHES, &General_options::set_create_eh_frame_hdr),
GENERAL_ARG('I', "dynamic-linker", N_("Set dynamic linker path"),
N_("-I PROGRAM, --dynamic-linker PROGRAM"), TWO_DASHES,
&General_options::set_dynamic_linker),
SPECIAL('l', "library", N_("Search for library LIBNAME"),
N_("-lLIBNAME, --library LIBNAME"), TWO_DASHES,
&library),
GENERAL_ARG('L', "library-path", N_("Add directory to search path"),
N_("-L DIR, --library-path DIR"), TWO_DASHES,
&General_options::add_to_search_path),
GENERAL_ARG('m', NULL, N_("Ignored for compatibility"), NULL, ONE_DASH,
&General_options::ignore),
GENERAL_ARG('O', NULL, N_("Optimize output file size"),
N_("-O level"), ONE_DASH,
&General_options::set_optimization_level),
GENERAL_ARG('o', "output", N_("Set output file name"),
N_("-o FILE, --output FILE"), TWO_DASHES,
&General_options::set_output_file_name),
GENERAL_ARG('O', NULL, N_("Optimize output file size"),
N_("-O level"), ONE_DASH,
&General_options::set_optimization_level),
GENERAL_NOARG('r', NULL, N_("Generate relocatable output"), NULL,
ONE_DASH, &General_options::set_relocatable),
GENERAL_ARG('R', "rpath", N_("Add DIR to runtime search path"),
N_("-R DIR, -rpath DIR"), ONE_DASH,
&General_options::add_to_rpath),
GENERAL_NOARG('s', "strip-all", N_("Strip all symbols"), NULL,
TWO_DASHES, &General_options::set_strip_all),
GENERAL_NOARG('S', "strip-debug", N_("Strip debugging information"), NULL,
TWO_DASHES, &General_options::set_strip_debug),
GENERAL_NOARG('\0', "eh-frame-hdr", N_("Create exception frame header"),
NULL, TWO_DASHES, &General_options::set_create_eh_frame_hdr),
GENERAL_ARG('\0', "rpath-link",
N_("Add DIR to link time shared library search path"),
N_("--rpath-link DIR"), TWO_DASHES,
&General_options::add_to_rpath_link),
GENERAL_NOARG('s', "strip-all", N_("Strip all symbols"), NULL,
TWO_DASHES, &General_options::set_strip_all),
GENERAL_NOARG('S', "strip-debug", N_("Strip debugging information"), NULL,
TWO_DASHES, &General_options::set_strip_debug),
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"),
@ -352,12 +354,9 @@ options::Command_line_options::options[] =
NULL, TWO_DASHES, &General_options::set_stats),
GENERAL_ARG('\0', "sysroot", N_("Set target system root directory"),
N_("--sysroot DIR"), TWO_DASHES, &General_options::set_sysroot),
POSDEP_NOARG('\0', "as-needed",
N_("Only set DT_NEEDED for dynamic libs if used"),
NULL, TWO_DASHES, &Position_dependent_options::set_as_needed),
POSDEP_NOARG('\0', "no-as-needed",
N_("Always DT_NEEDED for dynamic libs (default)"),
NULL, TWO_DASHES, &Position_dependent_options::clear_as_needed),
GENERAL_ARG('\0', "Ttext", N_("Set the address of the .text section"),
N_("-Ttext ADDRESS"), ONE_DASH,
&General_options::set_text_segment_address),
POSDEP_NOARG('\0', "whole-archive",
N_("Include all archive contents"),
NULL, TWO_DASHES,
@ -366,6 +365,10 @@ options::Command_line_options::options[] =
N_("Include only needed archive contents"),
NULL, TWO_DASHES,
&Position_dependent_options::clear_whole_archive),
SPECIAL('(', "start-group", N_("Start a library search group"), NULL,
TWO_DASHES, &start_group),
SPECIAL(')', "end-group", N_("End a library search group"), NULL,
TWO_DASHES, &end_group),
SPECIAL('\0', "help", N_("Report usage information"), NULL,
TWO_DASHES, &help),
SPECIAL('v', "version", N_("Report version information"), NULL,
@ -391,7 +394,8 @@ General_options::General_options()
is_shared_(false),
is_static_(false),
print_stats_(false),
sysroot_()
sysroot_(),
text_segment_address_(-1U) // -1 indicates value not set by user
{
}

View File

@ -169,7 +169,7 @@ class General_options
is_static() const
{ return this->is_static_; }
// --statis: Print resource usage statistics.
// --stats: Print resource usage statistics.
bool
print_stats() const
{ return this->print_stats_; }
@ -179,6 +179,16 @@ class General_options
sysroot() const
{ return this->sysroot_; }
// -Ttext: The address of the .text section
uint64_t
text_segment_address() const
{ return this->text_segment_address_; }
// Whether -Ttext was used.
bool
user_set_text_segment_address() const
{ return this->text_segment_address_ != -1U; }
private:
// Don't copy this structure.
General_options(const General_options&);
@ -264,6 +274,20 @@ class General_options
set_sysroot(const char* arg)
{ this->sysroot_ = arg; }
void
set_text_segment_address(const char* arg)
{
char* endptr;
this->text_segment_address_ = strtoull(arg, &endptr, 0);
if (*endptr != '\0'
|| this->text_segment_address_ == -1U)
{
fprintf(stderr, _("%s: invalid argument to -Ttext: %s\n"),
program_name, arg);
::exit(1);
}
}
void
ignore(const char*)
{ }
@ -286,6 +310,7 @@ class General_options
bool is_static_;
bool print_stats_;
std::string sysroot_;
uint64_t text_segment_address_;
};
// The current state of the position dependent options.

View File

@ -95,8 +95,8 @@ class Target
// Return the default address to use for the text segment.
uint64_t
text_segment_address() const
{ return this->pti_->text_segment_address; }
default_text_segment_address() const
{ return this->pti_->default_text_segment_address; }
// Return the ABI specified page size.
uint64_t
@ -149,7 +149,7 @@ class Target
// The default dynamic linker name.
const char* dynamic_linker;
// The default text segment address.
uint64_t text_segment_address;
uint64_t default_text_segment_address;
// The ABI specified page size.
uint64_t abi_pagesize;
// The common page size used by actual implementations.

View File

@ -69,7 +69,7 @@ const Target::Target_info Target_test<size, big_endian>::test_target_info =
false, // has_resolve
false, // has_code_fill
"/dummy", // dynamic_linker
0x08000000, // text_segment_address
0x08000000, // default_text_segment_address
0x1000, // abi_pagesize
0x1000 // common_pagesize
};

View File

@ -264,7 +264,7 @@ const Target::Target_info Target_x86_64::x86_64_info =
false, // has_resolve
true, // has_code_fill
"/lib/ld64.so.1", // program interpreter
0x400000, // text_segment_address
0x400000, // default_text_segment_address
0x1000, // abi_pagesize
0x1000 // common_pagesize
};