diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index 7ec4d8ccf965f7bcc84406b6409eb905dea50c00..04d95f0b9b0bbd7ad596b34aaac58e883b6e65ad 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -20,7 +20,6 @@ import (
 	"go/parser"
 	"go/token"
 	"os"
-	"runtime"
 	"strconv"
 	"strings"
 	"unicode"
@@ -91,9 +90,9 @@ NextLine:
 		case 2:
 			k = kf[1]
 			switch kf[0] {
-			case runtime.GOOS:
-			case runtime.GOARCH:
-			case runtime.GOOS + "/" + runtime.GOARCH:
+			case goos:
+			case goarch:
+			case goos + "/" + goarch:
 			default:
 				continue NextLine
 			}
@@ -688,7 +687,7 @@ func (p *Package) gccName() (ret string) {
 
 // gccMachine returns the gcc -m flag to use, either "-m32" or "-m64".
 func (p *Package) gccMachine() []string {
-	switch runtime.GOARCH {
+	switch goarch {
 	case "amd64":
 		return []string{"-m64"}
 	case "386":
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
index be9c2bc4fbdbd45eddb3488c3dd72e19b6c2c583..106698114508ff79e6424cb91b9c99b6c3af3ccc 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -20,6 +20,7 @@ import (
 	"os"
 	"path/filepath"
 	"reflect"
+	"runtime"
 	"strings"
 )
 
@@ -122,6 +123,8 @@ var fset = token.NewFileSet()
 
 var dynobj = flag.String("dynimport", "", "if non-empty, print dynamic import data for that file")
 
+var goarch, goos string
+
 func main() {
 	flag.Usage = usage
 	flag.Parse()
@@ -162,13 +165,17 @@ func main() {
 
 	goFiles := args[i:]
 
-	arch := os.Getenv("GOARCH")
-	if arch == "" {
-		fatalf("$GOARCH is not set")
+	goarch = runtime.GOARCH
+	if s := os.Getenv("GOARCH"); s != "" {
+		goarch = s
+	}
+	goos = runtime.GOOS
+	if s := os.Getenv("GOOS"); s != "" {
+		goos = s
 	}
-	ptrSize := ptrSizeMap[arch]
+	ptrSize := ptrSizeMap[goarch]
 	if ptrSize == 0 {
-		fatalf("unknown $GOARCH %q", arch)
+		fatalf("unknown $GOARCH %q", goarch)
 	}
 
 	// Clear locale variables so gcc emits English errors [sic].