diff --git a/gold/layout.cc b/gold/layout.cc index 6cba3aa3c3b..b28682e6a21 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -2168,16 +2168,38 @@ Layout::finish_dynamic_section(const Input_objects* input_objects, // Look for text segments that have dynamic relocations. bool have_textrel = false; - for (Segment_list::const_iterator p = this->segment_list_.begin(); - p != this->segment_list_.end(); - ++p) + if (!this->script_options_->saw_sections_clause()) { - if (((*p)->flags() & elfcpp::PF_W) == 0 - && (*p)->dynamic_reloc_count() > 0) - { - have_textrel = true; - break; - } + for (Segment_list::const_iterator p = this->segment_list_.begin(); + p != this->segment_list_.end(); + ++p) + { + if (((*p)->flags() & elfcpp::PF_W) == 0 + && (*p)->dynamic_reloc_count() > 0) + { + have_textrel = true; + break; + } + } + } + else + { + // We don't know the section -> segment mapping, so we are + // conservative and just look for readonly sections with + // relocations. If those sections wind up in writable segments, + // then we have created an unnecessary DT_TEXTREL entry. + for (Section_list::const_iterator p = this->section_list_.begin(); + p != this->section_list_.end(); + ++p) + { + if (((*p)->flags() & elfcpp::SHF_ALLOC) != 0 + && ((*p)->flags() & elfcpp::SHF_WRITE) == 0 + && ((*p)->dynamic_reloc_count() > 0)) + { + have_textrel = true; + break; + } + } } // Add a DT_FLAGS entry. We add it even if no flags are set so that