Set TEXTREL correctly when using a SECTIONS clause.
authorIan Lance Taylor <iant@google.com>
Tue, 12 Feb 2008 00:24:00 +0000 (00:24 +0000)
committerIan Lance Taylor <iant@google.com>
Tue, 12 Feb 2008 00:24:00 +0000 (00:24 +0000)
gold/layout.cc

index 6cba3aa3c3b2d098de58718d767c4e9560de8a53..b28682e6a21932951a81068e9c693c159fae6b06 100644 (file)
@@ -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