This is the mail archive of the
mailing list for the binutils project.
Fix objcopy on prelinked MIPS binaries
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: binutils at sourceware dot org
- Date: Wed, 24 Oct 2007 23:36:30 +0000 (UTC)
- Subject: Fix objcopy on prelinked MIPS binaries
When a MIPS binary is linked, a spare PT_NULL program header is inserted
in case the prelinker needs to add another program header.
If the prelinker does need to add another header (so the PT_NULL is no
longer present in the prelinked binary), and you try to objcopy or strip
the prelinked binary, _bfd_mips_elf_modify_segment_map called from
elf_modify_segment_map called from assign_file_positions_for_load_sections
tries to add a new PT_NULL on finding the binary doesn't already have one.
This messes up a series of computations of section addresses because of
off = bed->s->sizeof_ehdr;
off += alloc * bed->s->sizeof_phdr;
where alloc is the new increased number of program headers, and so yields
a series of errors of the form
BFD: output-file: section .interp lma 0x10000134 overlaps previous sections
(where it's decided to add a page alignment and wants that section to go
at 0x10010134 because of the increased number of program headers).
objcopy should copy the program as-is and not try to insert extra headers
for future prelinking. This patch disables the addition of this program
header in the objcopy case. Tested with no regressions with cross to
mips-linux-gnu; OK to commit?
(I don't think the bug this patch fixes is readily testable in the
binutils testsuite, given that ld won't create a binary without this spare
header in order to test copying it.)
2007-10-24 Joseph Myers <firstname.lastname@example.org>
* elfxx-mips.c (_bfd_mips_elf_modify_segment_map): Do not add
PT_NULL header when not linking.
RCS file: /cvs/src/src/bfd/elfxx-mips.c,v
retrieving revision 1.216
diff -u -r1.216 elfxx-mips.c
--- bfd/elfxx-mips.c 12 Oct 2007 15:59:19 -0000 1.216
+++ bfd/elfxx-mips.c 24 Oct 2007 22:53:46 -0000
@@ -9555,8 +9555,12 @@
header instead, and avoid the need to move any sections.
There is a long tradition of allocating spare dynamic tags,
so allocating a spare program header seems like a natural
- extension. */
- if (!SGI_COMPAT (abfd)
+ If INFO is NULL, we may be copying an already prelinked binary
+ with objcopy or strip, so do not add this header. */
+ if (info != NULL
+ && !SGI_COMPAT (abfd)
&& bfd_get_section_by_name (abfd, ".dynamic"))
for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next)
Joseph S. Myers