From: Jan Kratochvil Date: Mon, 10 Aug 2009 21:38:36 +0000 (+0000) Subject: bfd/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e39e47bd251f5e5958750244d01eeb55b5e8bb1e;p=binutils-gdb.git bfd/ 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 779768c7e95..d34a4f27dc8 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2009-08-10 Jan Kratochvil + + 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 * elf32-arm.c (elf32_arm_size_stubs): Don't die on undefined local diff --git a/bfd/coff-stgo32.c b/bfd/coff-stgo32.c index b8928befa68..51ea732ed97 100644 --- a/bfd/coff-stgo32.c +++ b/bfd/coff-stgo32.c @@ -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; } diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 29457a6f8fb..25b52e5689b 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-08-10 Jan Kratochvil + + 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 * ld-powerpc/relax.s: New. diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index df2fcfcdbec..53e432958d8 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -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*"]