1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
Description: Properly set the output maxpagesize
when rewriting program header.
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.
From: H. J. Lu <hongjiu.lu@intel.com>
Bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14493
Index: binutils/bfd/elf.c
===================================================================
--- binutils.orig/bfd/elf.c 2012-11-09 21:15:06.155929071 +0000
+++ binutils/bfd/elf.c 2012-11-21 08:53:00.311430441 +0000
@@ -6179,6 +6179,8 @@
static bfd_boolean
copy_private_bfd_data (bfd *ibfd, bfd *obfd)
{
+ bfd_vma maxpagesize = 0;
+
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
return TRUE;
@@ -6207,10 +6209,18 @@
section = section->next)
section->segment_mark = FALSE;
+ /* Find the maximum alignment of input PT_LOAD segments. */
num_segments = elf_elfheader (ibfd)->e_phnum;
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;
+
+ for (i = 0, segment = elf_tdata (ibfd)->phdr;
+ i < num_segments;
+ i++, segment++)
{
/* PR binutils/3535. The Solaris linker always sets the p_paddr
and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
@@ -6263,6 +6273,12 @@
}
rewrite:
+ /* When rewriting program header, set the output maxpagesize to the
+ maximum alignment of input PT_LOAD segments. */
+ if (maxpagesize &&
+ maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
+ bfd_emul_set_maxpagesize (obfd->xvec->name, maxpagesize);
+
return rewrite_elf_program_header (ibfd, obfd);
}
|