bfd/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 10 Aug 2009 21:38:36 +0000 (21:38 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 10 Aug 2009 21:38:36 +0000 (21:38 +0000)
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/
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/ChangeLog
bfd/coff-stgo32.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/i386.exp

index 779768c..d34a4f2 100644 (file)
@@ -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
index b8928be..51ea732 100644 (file)
@@ -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) = 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_data  (ibfd, obfd)
   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;
 }
index 29457a6..25b52e5 100644 (file)
@@ -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.
index df2fcfc..53e4329 100644 (file)
@@ -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*"]