summaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-11-21 21:31:14 +0000
committerH.J. Lu <hjl.tools@gmail.com>2012-11-21 21:31:14 +0000
commit192c507f72b4d0f41ccc95ef9b23c7f050323581 (patch)
treea90a36219087249eb41de4c54ca8c906a4785502 /bfd/elf.c
parent2d758a1cec5e3f4cf1d1d7ff7dab6984b0a418f4 (diff)
downloadgdb-192c507f72b4d0f41ccc95ef9b23c7f050323581.tar.gz
Set output maxpagesize when rewriting program header
bfd/ PR binutils/14493 * elf.c (copy_elf_program_header): When rewriting program header, set the output maxpagesize to the maximum alignment of input PT_LOAD segments. 2012-11-21 H.J. Lu <hongjiu.lu@intel.com> PR binutils/14493 * ld-elf/maxpage5.d: New file. * ld-elf/maxpage5.s: Likewise. * ld-elf/maxpage5.t: Likewise.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index b8bb6d3f93a..a93663619a1 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -6356,6 +6356,26 @@ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
}
rewrite:
+ if (ibfd->xvec == obfd->xvec)
+ {
+ /* When rewriting program header, set the output maxpagesize to
+ the maximum alignment of input PT_LOAD segments. */
+ Elf_Internal_Phdr *segment;
+ unsigned int i;
+ unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
+ bfd_vma maxpagesize = 0;
+
+ for (i = 0, segment = elf_tdata (ibfd)->phdr;
+ i < num_segments;
+ i++, segment++)
+ if (segment->p_type == PT_LOAD
+ && maxpagesize < segment->p_align)
+ maxpagesize = segment->p_align;
+
+ if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
+ bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
+ }
+
return rewrite_elf_program_header (ibfd, obfd);
}