This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
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*"]