summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2008-11-13 03:01:15 +0000
committerHans-Peter Nilsson <hp@axis.com>2008-11-13 03:01:15 +0000
commit79013c318fcd62ed97f51bfc9397e213976c40e9 (patch)
treee9e946ede6d0c1b21e3f617ab214e97c7b3f36c4
parent9e7ec9992618f7824040d0f54bd436968b9223ee (diff)
downloadbinutils-redhat-79013c318fcd62ed97f51bfc9397e213976c40e9.tar.gz
PR ld/7028
* elf.c (assign_file_positions_for_load_sections): Allocate phrds with bfd_zalloc2 instead of bfd_alloc2. For the amount, use the possibly-preset header-size, not the computed one.
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf.c16
2 files changed, 22 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3d5c0226b9..461033407b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2008-11-13 Hans-Peter Nilsson <hp@axis.com>
+
+ PR ld/7028
+ * elf.c (assign_file_positions_for_load_sections): Allocate phrds
+ with bfd_zalloc2 instead of bfd_alloc2. For the amount, use
+ the possibly-preset header-size, not the computed one.
+
2008-11-13 Alan Modra <amodra@bigpond.net.au>
PR 7023
diff --git a/bfd/elf.c b/bfd/elf.c
index cb7d2fc3e4..3d52724010 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4183,7 +4183,21 @@ assign_file_positions_for_load_sections (bfd *abfd,
return TRUE;
}
- phdrs = bfd_alloc2 (abfd, alloc, sizeof (Elf_Internal_Phdr));
+ /* We're writing the size in elf_tdata (abfd)->program_header_size,
+ see assign_file_positions_except_relocs, so make sure we have
+ that amount allocated, with trailing space cleared.
+ The variable alloc contains the computed need, while elf_tdata
+ (abfd)->program_header_size contains the size used for the
+ layout.
+ See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
+ where the layout is forced to according to a larger size in the
+ last iterations for the testcase ld-elf/header. */
+ BFD_ASSERT (elf_tdata (abfd)->program_header_size % bed->s->sizeof_phdr
+ == 0);
+ phdrs = bfd_zalloc2 (abfd,
+ (elf_tdata (abfd)->program_header_size
+ / bed->s->sizeof_phdr),
+ sizeof (Elf_Internal_Phdr));
elf_tdata (abfd)->phdr = phdrs;
if (phdrs == NULL)
return FALSE;