mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: don't generate .exe extension for external Windows link
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>
This commit is contained in:
parent
37a097519f
commit
ad84f84cb4
1 changed files with 14 additions and 2 deletions
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue