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]

Re: [patch 2/4] Fix go32 stub preservation by objcopy


Hi Nick,

On Mon, 10 Aug 2009 17:02:22 +0200, Nick Clifton wrote:
>> 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.
>
> Approved - please apply - but:

Checked-in:
	http://sourceware.org/ml/binutils-cvs/2009-08/msg00064.html


> The use of the PTR macro is deprecated.  Please either remove it, if it  
> is unnecessary or replace it with "void *" where it is necessary.

Removed as unnecessary in this case, thanks for the notice.


Thanks,
Jan


--- src/bfd/ChangeLog	2009/08/10 15:56:29	1.4731
+++ src/bfd/ChangeLog	2009/08/10 21:38:35	1.4732
@@ -1,3 +1,10 @@
+2009-08-10  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.
+
 2009-08-10  Nathan Sidwell  <nathan@codesourcery.com>
 
 	* elf32-arm.c (elf32_arm_size_stubs): Don't die on undefined local
--- src/bfd/coff-stgo32.c	2007/07/03 14:26:40	1.18
+++ src/bfd/coff-stgo32.c	2009/08/10 21:38:35	1.19
@@ -141,8 +141,9 @@
 
   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) = bfd_malloc ((bfd_size_type) STUBSIZE);
 
   /* Since this function returns no status, I do not set here
      any bfd_error_...
@@ -403,13 +404,18 @@
   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) = 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;
 }
--- src/ld/testsuite/ChangeLog	2009/08/10 13:38:44	1.1144
+++ src/ld/testsuite/ChangeLog	2009/08/10 21:38:36	1.1145
@@ -1,3 +1,9 @@
+2009-08-10  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.
+
 2009-08-10  Nathan Sidwell  <nathan@codesourcery.com>
 
 	* ld-powerpc/relax.s: New.
--- src/ld/testsuite/ld-i386/i386.exp	2009/08/02 23:55:49	1.27
+++ src/ld/testsuite/ld-i386/i386.exp	2009/08/10 21:38:36	1.28
@@ -49,6 +49,54 @@
     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]