From bb321bb1c4c33cdea5f547e727833e7f17f1cd3f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 30 Dec 2009 19:29:20 +0000 Subject: [PATCH] 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. --- gold/ChangeLog | 6 ++++++ gold/output.cc | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 8acaf87621b..12dc7f081b8 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,11 @@ 2009-12-30 Ian Lance Taylor + 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 diff --git a/gold/output.cc b/gold/output.cc index e643fb76f46..8f1060ed3f2 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) -- 2.30.2