aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog8
-rw-r--r--gold/i386.cc6
-rw-r--r--gold/options.h14
-rw-r--r--gold/x86_64.cc6
4 files changed, 32 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 8829e0a..7235cd9 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -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.
diff --git a/gold/i386.cc b/gold/i386.cc
index 54f1233..8889a68 100644
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -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;
}
diff --git a/gold/options.h b/gold/options.h
index 8614ce6..2926730 100644
--- a/gold/options.h
+++ b/gold/options.h
@@ -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
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 2daa9bf..dda3297 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -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;
}