From 4cd6c3bac77a4c35cdc9c6c7ca63f09d8747254b Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 8 May 2019 09:36:07 +0200 Subject: [PATCH] cmd/link/internal/ld: bump macOS and macOS SDK version to 10.9 Satisfies the Apple Notary. Fixes #30488 Change-Id: I91cf2d706a3ebe79bafdb759a0d32266ed6b9096 Reviewed-on: https://go-review.googlesource.com/c/go/+/175918 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/link/internal/ld/macho.go | 6 ++- src/cmd/link/link_test.go | 65 +++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 1c54d59295..cbf88e43d2 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -414,9 +414,11 @@ func (ctxt *Link) domacho() { // and we can assume OS X. // // See golang.org/issues/12941. + // + // The version must be at least 10.9; see golang.org/issues/30488. ml := newMachoLoad(ctxt.Arch, LC_VERSION_MIN_MACOSX, 2) - ml.data[0] = 10<<16 | 7<<8 | 0<<0 // OS X version 10.7.0 - ml.data[1] = 10<<16 | 7<<8 | 0<<0 // SDK 10.7.0 + ml.data[0] = 10<<16 | 9<<8 | 0<<0 // OS X version 10.9.0 + ml.data[1] = 10<<16 | 9<<8 | 0<<0 // SDK 10.9.0 } } diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index a428e758d7..2916d72207 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -1,6 +1,7 @@ package main import ( + "debug/macho" "internal/testenv" "io/ioutil" "os" @@ -257,3 +258,67 @@ func TestXFlag(t *testing.T) { t.Errorf("%v: %v:\n%s", cmd.Args, err, out) } } + +var testMacOSVersionSrc = ` +package main +func main() { } +` + +func TestMacOSVersion(t *testing.T) { + testenv.MustHaveGoBuild(t) + + tmpdir, err := ioutil.TempDir("", "TestMacOSVersion") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpdir) + + src := filepath.Join(tmpdir, "main.go") + err = ioutil.WriteFile(src, []byte(testMacOSVersionSrc), 0666) + if err != nil { + t.Fatal(err) + } + + exe := filepath.Join(tmpdir, "main") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-ldflags=-linkmode=internal", "-o", exe, src) + cmd.Env = append(os.Environ(), + "CGO_ENABLED=0", + "GOOS=darwin", + "GOARCH=amd64", + ) + if out, err := cmd.CombinedOutput(); err != nil { + t.Fatalf("%v: %v:\n%s", cmd.Args, err, out) + } + exef, err := os.Open(exe) + if err != nil { + t.Fatal(err) + } + exem, err := macho.NewFile(exef) + if err != nil { + t.Fatal(err) + } + found := false + const LC_VERSION_MIN_MACOSX = 0x24 + checkMin := func(ver uint32) { + major, minor := (ver>>16)&0xff, (ver>>8)&0xff + if major != 10 || minor < 9 { + t.Errorf("LC_VERSION_MIN_MACOSX version %d.%d < 10.9", major, minor) + } + } + for _, cmd := range exem.Loads { + raw := cmd.Raw() + type_ := exem.ByteOrder.Uint32(raw) + if type_ != LC_VERSION_MIN_MACOSX { + continue + } + osVer := exem.ByteOrder.Uint32(raw[8:]) + checkMin(osVer) + sdkVer := exem.ByteOrder.Uint32(raw[12:]) + checkMin(sdkVer) + found = true + break + } + if !found { + t.Errorf("no LC_VERSION_MIN_MACOSX load command found") + } +} -- 2.50.0