aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2012-09-10 23:10:41 +0000
committerAlan Modra <amodra@gmail.com>2012-09-10 23:10:41 +0000
commit815a120572fd0025c606dbb0b7ab5d137d07d036 (patch)
treee19cbdce076c9e977eb83d8ca5132dd115907008
parentbd73a62d774b7c9a77be60ccfc4ff0dd7641970f (diff)
downloadgdb-815a120572fd0025c606dbb0b7ab5d137d07d036.zip
gdb-815a120572fd0025c606dbb0b7ab5d137d07d036.tar.gz
gdb-815a120572fd0025c606dbb0b7ab5d137d07d036.tar.bz2
PR gold/14566
* layout.cc (Layout::set_segment_offsets): When using common-page-size alignment, ensure we are on a new max-page-size page. * output.cc (Output_segment::set_section_addresses): Use abi_pagesize, not common_pagesize for relro boundary. (Output_segment::set_offset): Likewise.
-rw-r--r--gold/ChangeLog10
-rw-r--r--gold/layout.cc2
-rw-r--r--gold/output.cc6
3 files changed, 15 insertions, 3 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index e6ee0d6..ed1a8d4 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,15 @@
2012-09-11 Alan Modra <amodra@gmail.com>
+ PR gold/14566
+ * layout.cc (Layout::set_segment_offsets): When using
+ common-page-size alignment, ensure we are on a new max-page-size
+ page.
+ * output.cc (Output_segment::set_section_addresses): Use
+ abi_pagesize, not common_pagesize for relro boundary.
+ (Output_segment::set_offset): Likewise.
+
+2012-09-11 Alan Modra <amodra@gmail.com>
+
* output.h (Output_data_got::add_global_tls, add_local_tls,
add_local_tls_pair): New functions.
(Output_data_got::add_local_pair_with_rel): Remove second
diff --git a/gold/layout.cc b/gold/layout.cc
index 808dd94..86e39eb 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -3420,6 +3420,8 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
*pshndx = shndx_hold;
addr = align_address(aligned_addr, common_pagesize);
addr = align_address(addr, (*p)->maximum_alignment());
+ if ((addr & (abi_pagesize - 1)) != 0)
+ addr = addr + abi_pagesize;
off = orig_off + ((addr - orig_addr) & (abi_pagesize - 1));
off = align_file_offset(off, addr, abi_pagesize);
diff --git a/gold/output.cc b/gold/output.cc
index d75579b..fa6d808 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -4239,7 +4239,7 @@ Output_segment::set_section_addresses(Layout* layout, bool reset,
bool in_tls = false;
// If we have relro sections, we need to pad forward now so that the
- // relro sections plus INCREASE_RELRO end on a common page boundary.
+ // relro sections plus INCREASE_RELRO end on an abi page boundary.
if (parameters->options().relro()
&& this->is_first_section_relro()
&& (!this->are_addresses_set_ || reset))
@@ -4294,7 +4294,7 @@ Output_segment::set_section_addresses(Layout* layout, bool reset,
last_relro_pad = aligned_size - relro_size;
*has_relro = true;
- uint64_t page_align = parameters->target().common_pagesize();
+ uint64_t page_align = parameters->target().abi_pagesize();
// Align to offset N such that (N + RELRO_SIZE) % PAGE_ALIGN == 0.
uint64_t desired_align = page_align - (aligned_size % page_align);
@@ -4604,7 +4604,7 @@ Output_segment::set_offset(unsigned int increase)
// page boundary.
if (this->type_ == elfcpp::PT_GNU_RELRO)
{
- uint64_t page_align = parameters->target().common_pagesize();
+ uint64_t page_align = parameters->target().abi_pagesize();
uint64_t segment_end = this->vaddr_ + this->memsz_;
if (parameters->incremental_update())
{