diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go
index aa106e45c51834ac98eab3ac087edb2fe75b28f8..b50f3342fe8714b5f395a06fb5529db38017a045 100644
--- a/src/cmd/dist/build.go
+++ b/src/cmd/dist/build.go
@@ -673,7 +673,6 @@ var gentab = []struct {
 	file string
 	gen  func(dir, file string)
 }{
-	{"go/build", "zcgo.go", mkzcgo},
 	{"cmd/go/internal/cfg", "zdefaultcc.go", mkzdefaultcc},
 	{"internal/runtime/sys", "zversion.go", mkzversion},
 	{"time/tzdata", "zzipdata.go", mktzdata},
diff --git a/src/cmd/dist/buildgo.go b/src/cmd/dist/buildgo.go
index 884e9d729a6a3596c7713a30ebeee413fd2b3245..6bd8a9ce8dfa6bf2a15f221a15fc244db3141d8d 100644
--- a/src/cmd/dist/buildgo.go
+++ b/src/cmd/dist/buildgo.go
@@ -7,7 +7,6 @@ package main
 import (
 	"fmt"
 	"io"
-	"os"
 	"path/filepath"
 	"sort"
 	"strings"
@@ -108,22 +107,6 @@ func defaultCCFunc(name string, defaultcc map[string]string) string {
 	return buf.String()
 }
 
-// mkzcgo writes zcgo.go for the go/build package:
-//
-//	package build
-//	const defaultCGO_ENABLED = <CGO_ENABLED>
-//
-// It is invoked to write go/build/zcgo.go.
-func mkzcgo(dir, file string) {
-	var buf strings.Builder
-	writeHeader(&buf)
-	fmt.Fprintf(&buf, "package build\n")
-	fmt.Fprintln(&buf)
-	fmt.Fprintf(&buf, "const defaultCGO_ENABLED = %s\n", quote(os.Getenv("CGO_ENABLED")))
-
-	writefile(buf.String(), file, writeSkipSame)
-}
-
 // mktzdata src/time/tzdata/zzipdata.go:
 //
 //	package tzdata
diff --git a/src/cmd/dist/buildruntime.go b/src/cmd/dist/buildruntime.go
index 04b5b45410b70c5462ab4661c86aa75a95140176..87e88671763996604cfe5cbca1399ce1a323dc31 100644
--- a/src/cmd/dist/buildruntime.go
+++ b/src/cmd/dist/buildruntime.go
@@ -6,6 +6,7 @@ package main
 
 import (
 	"fmt"
+	"os"
 	"strings"
 )
 
@@ -66,6 +67,7 @@ func mkbuildcfg(file string) {
 	fmt.Fprintf(&buf, "const defaultGOOS = runtime.GOOS\n")
 	fmt.Fprintf(&buf, "const defaultGOARCH = runtime.GOARCH\n")
 	fmt.Fprintf(&buf, "const DefaultGOFIPS140 = `%s`\n", gofips140)
+	fmt.Fprintf(&buf, "const DefaultCGO_ENABLED = %s\n", quote(os.Getenv("CGO_ENABLED")))
 
 	writefile(buf.String(), file, writeSkipSame)
 }
diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go
index 3b9f27e91d517e765a0175290469f999f86e4ab4..49d87839f4a782444ad9924cbdc41df333ebe0d9 100644
--- a/src/cmd/go/internal/cfg/cfg.go
+++ b/src/cmd/go/internal/cfg/cfg.go
@@ -13,6 +13,7 @@ import (
 	"go/build"
 	"internal/buildcfg"
 	"internal/cfg"
+	"internal/platform"
 	"io"
 	"io/fs"
 	"os"
@@ -140,10 +141,12 @@ func defaultContext() build.Context {
 	// Recreate that logic here with the new GOOS/GOARCH setting.
 	// We need to run steps 2 and 3 to determine what the default value
 	// of CgoEnabled would be for computing CGOChanged.
-	defaultCgoEnabled := ctxt.CgoEnabled
-	if ctxt.GOOS != runtime.GOOS || ctxt.GOARCH != runtime.GOARCH {
-		defaultCgoEnabled = false
-	} else {
+	defaultCgoEnabled := false
+	if buildcfg.DefaultCGO_ENABLED == "1" {
+		defaultCgoEnabled = true
+	} else if buildcfg.DefaultCGO_ENABLED == "0" {
+	} else if runtime.GOARCH == ctxt.GOARCH && runtime.GOOS == ctxt.GOOS {
+		defaultCgoEnabled = platform.CgoSupported(ctxt.GOOS, ctxt.GOARCH)
 		// Use built-in default cgo setting for GOOS/GOARCH.
 		// Note that ctxt.GOOS/GOARCH are derived from the preference list
 		// (1) environment, (2) go/env file, (3) runtime constants,
diff --git a/src/cmd/go/testdata/script/env_changed.txt b/src/cmd/go/testdata/script/env_changed.txt
index 5ba13b4dbfa0851a4360abe493cfc9a72ce6400f..05fb71d020fc3ca1df91ef4152961f117d6c2d5d 100644
--- a/src/cmd/go/testdata/script/env_changed.txt
+++ b/src/cmd/go/testdata/script/env_changed.txt
@@ -11,6 +11,7 @@ env GO111MODULE=auto
 env CGO_CFLAGS=nodefault
 env CGO_CPPFLAGS=nodefault
 env GOFIPS140=latest
+[cgo] env CGO_ENABLED=0
 
 go env -changed
 # linux output like GOTOOLCHAIN='local'
@@ -22,6 +23,7 @@ stdout 'GO111MODULE=''?auto''?'
 stdout 'CGO_CFLAGS=''?nodefault''?'
 stdout 'CGO_CPPFLAGS=''?nodefault''?'
 stdout 'GOFIPS140=''?latest''?'
+[cgo] stdout 'CGO_ENABLED=''?0''?'
 
 go env -changed -json
 stdout '"GOTOOLCHAIN": "local"'
@@ -31,6 +33,7 @@ stdout '"GO111MODULE": "auto"'
 stdout '"CGO_CFLAGS": "nodefault"'
 stdout '"CGO_CPPFLAGS": "nodefault"'
 stdout '"GOFIPS140": "latest"'
+[cgo] stdout '"CGO_ENABLED": "0"'
 
 [GOOS:windows] env GOOS=linux
 [!GOOS:windows] env GOOS=windows
diff --git a/src/go/build/build.go b/src/go/build/build.go
index 0e5c7e512d794ccd29fa5995d35f1d44a641f50c..50288fcec64141f531920cc824592d314d8748b8 100644
--- a/src/go/build/build.go
+++ b/src/go/build/build.go
@@ -359,7 +359,7 @@ func defaultContext() Context {
 
 	env := os.Getenv("CGO_ENABLED")
 	if env == "" {
-		env = defaultCGO_ENABLED
+		env = buildcfg.DefaultCGO_ENABLED
 	}
 	switch env {
 	case "1":