]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: don't generate .exe extension for external Windows link
authorIan Lance Taylor <iant@golang.org>
Wed, 15 Jul 2015 16:05:33 +0000 (09:05 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 23 Jul 2015 17:49:44 +0000 (17:49 +0000)
On Windows, gcc -o foo will generate foo.exe.  Prevent that from
happening by adding a final '.' if necessary so that GCC thinks that
the file already has an extension.

Also remove the initial output file when doing an external link, and
use mayberemoveoutfile, not os.Remove, when building an archive
(otherwise we will do the wrong thing for -buildmode=c-archive -o
/dev/null).

I didn't add a test, as it requires using cgo and -o on Windows.

Fixes #11725.

Change-Id: I6ea12437bb6b4b9b8ee5c3b52d83509fa2437b2d
Reviewed-on: https://go-review.googlesource.com/12243
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/link/internal/ld/lib.go

index bd0fbc567da79287fd6234015ea899bb76b9b603..728e78260cae459f6712cf821d671ddd269b2c73 100644 (file)
@@ -44,6 +44,7 @@ import (
        "os"
        "os/exec"
        "path/filepath"
+       "runtime"
        "strings"
 )
 
@@ -836,6 +837,7 @@ func hostlinksetup() {
 
        // change our output to temporary object file
        coutbuf.f.Close()
+       mayberemoveoutfile()
 
        p := fmt.Sprintf("%s/go.o", tmpdir)
        var err error
@@ -882,7 +884,7 @@ func archive() {
                return
        }
 
-       os.Remove(outfile)
+       mayberemoveoutfile()
        argv := []string{"ar", "-q", "-c", "-s", outfile}
        argv = append(argv, hostobjCopy()...)
        argv = append(argv, fmt.Sprintf("%s/go.o", tmpdir))
@@ -984,8 +986,18 @@ func hostlink() {
                argv = append(argv, fmt.Sprintf("-Wl,--build-id=0x%x", buildinfo))
        }
 
+       // On Windows, given -o foo, GCC will append ".exe" to produce
+       // "foo.exe".  We have decided that we want to honor the -o
+       // option.  To make this work, we append a '.' so that GCC
+       // will decide that the file already has an extension.  We
+       // only want to do this when producing a Windows output file
+       // on a Windows host.
+       outopt := outfile
+       if goos == "windows" && runtime.GOOS == "windows" && filepath.Ext(outopt) == "" {
+               outopt += "."
+       }
        argv = append(argv, "-o")
-       argv = append(argv, outfile)
+       argv = append(argv, outopt)
 
        if rpath.val != "" {
                argv = append(argv, fmt.Sprintf("-Wl,-rpath,%s", rpath.val))