From ff866c4ca37287af82edf33d1e1d6f7c52931e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslavas=20Po=C4=8Depko?= Date: Fri, 14 Oct 2011 20:37:07 +0100 Subject: [PATCH] ld: Fixes issue 1899 ("cannot create 8.out.exe") http://code.google.com/p/go/issues/detail?id=1899 R=rsc, alex.brainman, bsiegert, hectorchu, bradfitz CC=golang-dev https://golang.org/cl/4978047 --- doc/progs/run | 11 ++++++++--- src/cmd/ld/lib.c | 5 +++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/progs/run b/doc/progs/run index 9d56049a885..7a6a603bb89 100755 --- a/doc/progs/run +++ b/doc/progs/run @@ -42,9 +42,13 @@ for i in \ $GC $i done +# Write to temporary file to avoid mingw bash bug. +TMPFILE="/tmp/gotest3" + function testit { $LD $1.$O - x=$(echo $(./$O.out $2 2>&1)) # extra echo canonicalizes + ./$O.out $2 2>&1 >"$TMPFILE" || true + x=$(echo $(cat "$TMPFILE")) # extra echo canonicalizes if [ "$x" != "$3" ] then echo $1 failed: '"'$x'"' is not '"'$3'"' @@ -53,7 +57,8 @@ function testit { function testitpipe { $LD $1.$O - x=$(echo $(./$O.out | $2 2>&1)) # extra echo canonicalizes + ./$O.out | $2 2>&1 >"$TMPFILE" || true + x=$(echo $(cat "$TMPFILE")) # extra echo canonicalizes if [ "$x" != "$3" ] then echo $1 failed: '"'$x'"' is not '"'$3'"' @@ -88,4 +93,4 @@ testit server1 "" "" testit eff_bytesize "" "1.00YB 9.09TB" testit eff_sequence "" "[-1 2 6 16 44]" -rm -f $O.out *.$O +rm -f $O.out $O.out.exe *.$O "$TMPFILE" diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index 37379e18633..456d41f5a14 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -70,7 +70,12 @@ libinit(void) // add goroot to the end of the libdir list. libdir[nlibdir++] = smprint("%s/pkg/%s_%s", goroot, goos, goarch); + // Unix doesn't like it when we write to a running (or, sometimes, + // recently run) binary, so remove the output file before writing it. + // On Windows 7, remove() can force the following create() to fail. +#ifndef _WIN32 remove(outfile); +#endif cout = create(outfile, 1, 0775); if(cout < 0) { diag("cannot create %s", outfile);