aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2007-08-21 21:03:50 +0000
committerIan Lance Taylor <iant@google.com>2007-08-21 21:03:50 +0000
commit0496d5e5b46976aa1cdbe55c6e833a6e7a04961d (patch)
tree7fc5c2f7d3c95a5ceba847de4d3587bcaf0ff16d
parent41f542e70b89b9ea2875c438b0c9a60ac46092dd (diff)
downloadfsf-binutils-gdb-0496d5e5b46976aa1cdbe55c6e833a6e7a04961d.zip
fsf-binutils-gdb-0496d5e5b46976aa1cdbe55c6e833a6e7a04961d.tar.gz
fsf-binutils-gdb-0496d5e5b46976aa1cdbe55c6e833a6e7a04961d.tar.bz2
Force PT_LOAD segments to be aligned to the page size.
-rw-r--r--gold/layout.cc4
-rw-r--r--gold/output.h15
2 files changed, 17 insertions, 2 deletions
diff --git a/gold/layout.cc b/gold/layout.cc
index 2f85db4..1e8df22 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 3147080..49cc7ca 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_;
};