From 4e8fe71f6c6f417efb67675695fa0b96cf6081b5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 12 Feb 2008 00:24:00 +0000 Subject: Set TEXTREL correctly when using a SECTIONS clause. --- gold/layout.cc | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) (limited to 'gold') diff --git a/gold/layout.cc b/gold/layout.cc index 6cba3aa..b28682e 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 -- cgit v1.1