This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[patch 2/4] Fix go32 stub preservation by objcopy
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: binutils at sourceware dot org
- Date: Sun, 9 Aug 2009 23:40:05 +0200
- Subject: [patch 2/4] Fix go32 stub preservation by objcopy
Hi,
as coff-stgo32.c uses bfd_usrdata to preserve the exe stub (the first 2048
bytes starting with MZ) when I changed it I wanted to test no regressions.
Unfortunately I found the exec stub preservation already does not work.
( configure --target=i386-unknown-go32 )
: >1.s; ./gas/as-new -o 1.o 1.s; ./ld/ld-new -o 1 1.o
hexedit 1 # modify its exe stub
./binutils/objcopy 1 2
hexedit 2 # check its exe stub is modified
This patch fixes the stub preservation while still using deprecated
bfd_usrdata. The memory leak in adjust_filehdr_in_post is only temporary to
avoid freed memory referencing. The leak gets removed by the bfd_usrdata
usage removing patch.
go32_stubbed_coff_bfd_copy_private_bfd_d could not work as it expected
adjust_filehdr_out_pre was already called before. During my tests it happened
in this order:
#0 go32_stubbed_coff_bfd_copy_private_bfd_data (ibfd=0xc6bf00, obfd=0xc78ce0) at coff-stgo32.c:407
#1 0x0000000000405824 in copy_object (ibfd=0xc6bf00, obfd=0xc78ce0) at objcopy.c:1921
#2 0x000000000040624d in copy_file (input_filename=0x7fffffffd749 "1", output_filename=0x7fffffffd74b "2", input_target=0x0,
output_target=0x8ab6f8 "coff-go32-exe") at objcopy.c:2230
#3 0x0000000000409688 in copy_main (argc=3, argv=0x7fffffffd3f8) at objcopy.c:3865
#4 0x0000000000409969 in main (argc=3, argv=0x7fffffffd3f8) at objcopy.c:3961
(gdb) c
Continuing.
Breakpoint 2, adjust_filehdr_out_pre (abfd=0xc78ce0, in=0x7fffffffcdb0, out=0xc7a4b0) at coff-stgo32.c:156
156 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
(gdb) bt
#0 adjust_filehdr_out_pre (abfd=0xc78ce0, in=0x7fffffffcdb0, out=0xc7a4b0) at coff-stgo32.c:156
#1 0x000000000045c971 in coff_swap_filehdr_out (abfd=0xc78ce0, in=0x7fffffffcdb0, out=0xc7a4b0) at coffswap.h:285
#2 0x000000000045fb00 in coff_write_object_contents (abfd=0xc78ce0) at coffcode.h:4283
#3 0x000000000043e895 in bfd_close (abfd=0xc78ce0) at opncls.c:692
#4 0x0000000000406267 in copy_file (input_filename=0x7fffffffd749 "1", output_filename=0x7fffffffd74b "2", input_target=0x0,
output_target=0x8ab6f8 "coff-go32-exe") at objcopy.c:2233
#5 0x0000000000409688 in copy_main (argc=3, argv=0x7fffffffd3f8) at objcopy.c:3865
#6 0x0000000000409969 in main (argc=3, argv=0x7fffffffd3f8) at objcopy.c:3961
(gdb)
Thanks,
Jan
bfd/
2009-08-09 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix go32 stub preservation by objcopy.
* coff-stgo32.c (adjust_filehdr_in_post): Use bfd_malloc.
(go32_stubbed_coff_bfd_copy_private_bfd_data): Optionally allocate OBFD
go32stub.
ld/testsuite/
2009-08-09 Jan Kratochvil <jan.kratochvil@redhat.com>
Test go32 stub preservation by objcopy.
* ld-i386/i386.exp (go32 stub, go32 stub patch the source)
(go32 stub objcopy, go32 stub comparison after objcopy): New.
--- bfd/coff-stgo32.c 3 Jul 2007 14:26:40 -0000 1.18
+++ bfd/coff-stgo32.c 9 Aug 2009 18:02:11 -0000
@@ -141,8 +141,9 @@ adjust_filehdr_in_post (abfd, src, dst)
ADJUST_VAL (filehdr_dst->f_symptr, STUBSIZE);
- /* Save now the stub to be used later. */
- bfd_coff_go32stub (abfd) = (PTR) bfd_alloc (abfd, (bfd_size_type) STUBSIZE);
+ /* Save now the stub to be used later. FIXME: Memory leak as the caller
+ coff_object_p does bfd_release afterwards. */
+ bfd_coff_go32stub (abfd) = (PTR) bfd_malloc ((bfd_size_type) STUBSIZE);
/* Since this function returns no status, I do not set here
any bfd_error_...
@@ -403,13 +404,18 @@ go32_stubbed_coff_bfd_copy_private_bfd_d
if (ibfd->xvec != obfd->xvec)
return TRUE;
- /* Check if both have a valid stub. */
- if (bfd_coff_go32stub (ibfd) == NULL
- || bfd_coff_go32stub (obfd) == NULL)
+ /* Check if we have a source stub. */
+ if (bfd_coff_go32stub (ibfd) == NULL)
return TRUE;
+ /* As adjust_filehdr_out_pre may get called only after this function,
+ optionally allocate the output stub. */
+ if (bfd_coff_go32stub (obfd) == NULL)
+ bfd_coff_go32stub (obfd) = (PTR) bfd_alloc (obfd, (bfd_size_type) STUBSIZE);
+
/* Now copy the stub. */
- memcpy (bfd_coff_go32stub (obfd), bfd_coff_go32stub (ibfd), STUBSIZE);
+ if (bfd_coff_go32stub (obfd) != NULL)
+ memcpy (bfd_coff_go32stub (obfd), bfd_coff_go32stub (ibfd), STUBSIZE);
return TRUE;
}
--- ld/testsuite/ld-i386/i386.exp 2 Aug 2009 23:55:49 -0000 1.27
+++ ld/testsuite/ld-i386/i386.exp 9 Aug 2009 18:02:16 -0000
@@ -49,6 +49,54 @@ if {[istarget "i?86-*-vxworks"]} {
run_dump_test "vxworks1-static"
}
+if [istarget "*-*-go32*"] {
+ run_ld_link_tests {{"go32 stub" "" "" {zero.s} {} "go32stub"}}
+
+ set src "tmpdir/go32stub"
+ set dest "tmpdir/go32stub-copy"
+
+ set test "go32 stub patch the source"
+ set fi [open $src r+]
+ fconfigure $fi -translation binary
+ if {[read $fi 2] != "MZ"} {
+ fail $test
+ } else {
+ pass $test
+ seek $fi 0x40
+ puts -nonewline $fi "objcopy-test-go32stub"
+ }
+ close $fi
+
+ set test "go32 stub objcopy"
+ set status [remote_exec build $OBJCOPY "$OBJCOPYFLAGS $src $dest"]
+ set exec_output [lindex $status 1]
+ set exec_output [prune_warnings $exec_output]
+ if [string match "" $exec_output] then {
+ pass $test
+ } else {
+ send_log "$exec_output\n"
+ verbose "$exec_output" 1
+ fail $test
+ }
+
+ # cmp would compare the whole files and some data after the initial exe
+ # stub could differ.
+ set test "go32 stub comparison after objcopy"
+ set fi [open $src]
+ fconfigure $fi -translation binary
+ set src_stub [read $fi 2048]
+ close $fi
+ set fi [open $dest]
+ fconfigure $fi -translation binary
+ set dest_stub [read $fi 2048]
+ close $fi
+ if {$src_stub == $dest_stub} {
+ pass $test
+ } else {
+ fail $test
+ }
+}
+
if { !([istarget "i?86-*-elf*"]
|| ([istarget "i?86-*-linux*"]
&& ![istarget "*-*-*aout*"]