This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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*"]


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]