* options.h (General_options::output_is_executable): New.

(General_options::output_is_pie): New.
* i386.cc (Target_i386::define_tls_base_symbol): Use SEGMENT_START
for shared libraries.
* x86_64.cc (Target_x86_64::define_tls_base_symbol): Likewise.
This commit is contained in:
Alexandre Oliva 2008-09-16 04:23:29 +00:00
parent b7f9e084d2
commit 183fd0e3ed
4 changed files with 32 additions and 2 deletions

View file

@ -1,3 +1,11 @@
2008-09-16 Alexandre Oliva <aoliva@redhat.com>
* options.h (General_options::output_is_executable): New.
(General_options::output_is_pie): New.
* i386.cc (Target_i386::define_tls_base_symbol): Use SEGMENT_START
for shared libraries.
* x86_64.cc (Target_x86_64::define_tls_base_symbol): Likewise.
2008-09-11 Chris Demetriou <cgd@google.com>
* options.h (origin): New -z option.

View file

@ -747,12 +747,16 @@ Target_i386::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
Output_segment* tls_segment = layout->tls_segment();
if (tls_segment != NULL)
{
bool is_exec = parameters->options().output_is_executable();
symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
tls_segment, 0, 0,
elfcpp::STT_TLS,
elfcpp::STB_LOCAL,
elfcpp::STV_HIDDEN, 0,
Symbol::SEGMENT_END, true);
(is_exec
? Symbol::SEGMENT_END
: Symbol::SEGMENT_START),
true);
}
this->tls_base_symbol_defined_ = true;
}

View file

@ -865,6 +865,20 @@ class General_options
output_is_position_independent() const
{ return this->shared(); }
// Return true if the output is something that can be exec()ed, such
// as a static executable, or a position-dependent or
// position-independent executable, but not a dynamic library or an
// object file.
bool
output_is_executable() const
{ return !this->shared() || this->output_is_pie(); }
// Return true if the output is a position-independent executable.
// This is currently not supported.
bool
output_is_pie() const
{ return false; }
// This would normally be static(), and defined automatically, but
// since static is a keyword, we need to come up with our own name.
bool

View file

@ -807,12 +807,16 @@ Target_x86_64::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
Output_segment* tls_segment = layout->tls_segment();
if (tls_segment != NULL)
{
bool is_exec = parameters->options().output_is_executable();
symtab->define_in_output_segment("_TLS_MODULE_BASE_", NULL,
tls_segment, 0, 0,
elfcpp::STT_TLS,
elfcpp::STB_LOCAL,
elfcpp::STV_HIDDEN, 0,
Symbol::SEGMENT_END, true);
(is_exec
? Symbol::SEGMENT_END
: Symbol::SEGMENT_START),
true);
}
this->tls_base_symbol_defined_ = true;
}