From 815a120572fd0025c606dbb0b7ab5d137d07d036 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 10 Sep 2012 23:10:41 +0000 Subject: [PATCH] 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. --- gold/ChangeLog | 10 ++++++++++ gold/layout.cc | 2 ++ gold/output.cc | 6 +++--- 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 + 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 + * 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()) { -- 2.7.4