aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2009-12-30 19:29:20 +0000
committerIan Lance Taylor <ian@airs.com>2009-12-30 19:29:20 +0000
commitbb321bb1c4c33cdea5f547e727833e7f17f1cd3f (patch)
tree5fcf1e9eee23fa0b7441da455ecb709a3bfd4591
parent553e4c1193524cadcf86e8d2d040ba8e5aa491d5 (diff)
downloadfsf-binutils-gdb-bb321bb1c4c33cdea5f547e727833e7f17f1cd3f.zip
fsf-binutils-gdb-bb321bb1c4c33cdea5f547e727833e7f17f1cd3f.tar.gz
fsf-binutils-gdb-bb321bb1c4c33cdea5f547e727833e7f17f1cd3f.tar.bz2
PR 10450
* output.cc (Output_segment::Output_segment): If PT_TLS, set the flags to PF_R. (Output_segment::add_output_section): Don't change the flags if the type is PT_TLS.
-rw-r--r--gold/ChangeLog6
-rw-r--r--gold/output.cc11
2 files changed, 15 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 8acaf87..12dc7f0 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,6 +1,12 @@
2009-12-30 Ian Lance Taylor <iant@google.com>
PR 10450
+ * output.cc (Output_segment::Output_segment): If PT_TLS, set the
+ flags to PF_R.
+ (Output_segment::add_output_section): Don't change the flags if
+ the type is PT_TLS.
+
+ PR 10450
* dynobj.cc (Dynobj::create_gnu_hash_table): Add symbols to the
GNU hash table if they need a dynamic value. Otherwise, don't add
them if they are defined in a dynamic object or are forced local.
diff --git a/gold/output.cc b/gold/output.cc
index e643fb7..8f1060e 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -3063,6 +3063,10 @@ Output_segment::Output_segment(elfcpp::Elf_Word type, elfcpp::Elf_Word flags)
are_addresses_set_(false),
is_large_data_segment_(false)
{
+ // The ELF ABI specifies that a PT_TLS segment always has PF_R as
+ // the flags.
+ if (type == elfcpp::PT_TLS)
+ this->flags_ = elfcpp::PF_R;
}
// Add an Output_section to an Output_segment.
@@ -3077,8 +3081,11 @@ Output_segment::add_output_section(Output_section* os,
gold_assert(os->is_large_data_section() == this->is_large_data_segment());
gold_assert(this->type() == elfcpp::PT_LOAD || !do_sort);
- // Update the segment flags.
- this->flags_ |= seg_flags;
+ // Update the segment flags. The ELF ABI specifies that a PT_TLS
+ // segment should always have PF_R as the flags, regardless of the
+ // associated sections.
+ if (this->type() != elfcpp::PT_TLS)
+ this->flags_ |= seg_flags;
Output_segment::Output_data_list* pdl;
if (os->type() == elfcpp::SHT_NOBITS)