// 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