Force PT_LOAD segments to be aligned to the page size.
authorIan Lance Taylor <iant@google.com>
Tue, 21 Aug 2007 21:03:50 +0000 (21:03 +0000)
committerIan Lance Taylor <iant@google.com>
Tue, 21 Aug 2007 21:03:50 +0000 (21:03 +0000)
gold/layout.cc
gold/output.h

index 2f85db4..1e8df22 100644 (file)
@@ -610,6 +610,10 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
 
          uint64_t aligned_addr = addr;
          uint64_t abi_pagesize = target->abi_pagesize();
+
+          // FIXME: This should depend on the -n and -N options.
+          (*p)->set_minimum_addralign(target->common_pagesize());
+
          if (was_readonly && ((*p)->flags() & elfcpp::PF_W) != 0)
            {
              uint64_t align = (*p)->addralign();
index 3147080..49cc7ca 100644 (file)
@@ -1674,6 +1674,15 @@ class Output_segment
   uint64_t
   set_section_addresses(uint64_t addr, off_t* poff, unsigned int* pshndx);
 
+  // Set the minimum alignment of this segment.  This may be adjusted
+  // upward based on the section alignments.
+  void
+  set_minimum_addralign(uint64_t align)
+  {
+    gold_assert(!this->is_align_known_);
+    this->align_ = align;
+  }
+
   // Set the offset of this segment based on the section.  This should
   // only be called for a non-PT_LOAD segment.
   void
@@ -1735,7 +1744,9 @@ class Output_segment
   uint64_t paddr_;
   // The size of the segment in memory.
   uint64_t memsz_;
-  // The segment alignment.
+  // The segment alignment.  The is_align_known_ field indicates
+  // whether this has been finalized.  It can be set to a minimum
+  // value before it is finalized.
   uint64_t align_;
   // The offset of the segment data within the file.
   off_t offset_;
@@ -1745,7 +1756,7 @@ class Output_segment
   elfcpp::Elf_Word type_;
   // The segment flags.
   elfcpp::Elf_Word flags_;
-  // Whether we have set align_.
+  // Whether we have finalized align_.
   bool is_align_known_;
 };