mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
From Craig Silverstein: implement -Ttext.
This commit is contained in:
parent
928a4139f6
commit
0c5e9c22aa
@ -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
|
||||
};
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user