diff options
author | Ian Lance Taylor <iant@google.com> | 2007-08-21 21:03:50 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-08-21 21:03:50 +0000 |
commit | 0496d5e5b46976aa1cdbe55c6e833a6e7a04961d (patch) | |
tree | 7fc5c2f7d3c95a5ceba847de4d3587bcaf0ff16d /gold | |
parent | 41f542e70b89b9ea2875c438b0c9a60ac46092dd (diff) | |
download | gdb-0496d5e5b46976aa1cdbe55c6e833a6e7a04961d.zip gdb-0496d5e5b46976aa1cdbe55c6e833a6e7a04961d.tar.gz gdb-0496d5e5b46976aa1cdbe55c6e833a6e7a04961d.tar.bz2 |
Force PT_LOAD segments to be aligned to the page size.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/layout.cc | 4 | ||||
-rw-r--r-- | gold/output.h | 15 |
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_; }; |