diff --git a/gold/layout.cc b/gold/layout.cc index 2f85db4d30..1e8df2288e 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -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(); diff --git a/gold/output.h b/gold/output.h index 3147080320..49cc7ca073 100644 --- a/gold/output.h +++ b/gold/output.h @@ -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_; };