aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2021-04-21 19:12:38 -0400
committerCherry Zhang <cherryyz@google.com>2021-04-22 14:40:40 +0000
commitd5b2d809b09b5a7404ad334a5e56b2210a06254c (patch)
tree798266d76be14961f5121222d1b6856c6c5ddb7a /src
parentb2a032add8e46ca03af0b2c1c72052b75e056101 (diff)
downloadgo-d5b2d809b09b5a7404ad334a5e56b2210a06254c.tar.xz
cmd/link: emit LC_BUILD_VERSION on Mach-O
LC_VERSION_MIN_MACOSX seems deprecated. Emit LC_BUILD_VERSION instead. Also emit it on darwin/arm64, where it was not emitted before. Fixes #45091. Change-Id: I18fb80d571f681da3bd258e53beb520e68f354bd Reviewed-on: https://go-review.googlesource.com/c/go/+/312550 Trust: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/link/internal/ld/macho.go28
-rw-r--r--src/cmd/link/link_test.go18
2 files changed, 21 insertions, 25 deletions
diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go
index 1c88c05dd4..85269b30d0 100644
--- a/src/cmd/link/internal/ld/macho.go
+++ b/src/cmd/link/internal/ld/macho.go
@@ -472,24 +472,20 @@ func (ctxt *Link) domacho() {
if buildcfg.GOOS == "ios" {
machoPlatform = PLATFORM_IOS
}
- switch ctxt.Arch.Family {
- default:
- if ctxt.LinkMode == LinkInternal {
- // For lldb, must say LC_VERSION_MIN_MACOSX or else
- // it won't know that this Mach-O binary is from OS X
- // (could be iOS or WatchOS instead).
- // Go on iOS uses linkmode=external, and linkmode=external
- // adds this itself. So we only need this code for linkmode=internal
- // and we can assume OS X.
- //
- // See golang.org/issues/12941.
- //
+ if ctxt.LinkMode == LinkInternal && machoPlatform == PLATFORM_MACOS {
+ var version uint32
+ switch ctxt.Arch.Family {
+ case sys.AMD64:
// 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 | 9<<8 | 0<<0 // OS X version 10.9.0
- ml.data[1] = 10<<16 | 9<<8 | 0<<0 // SDK 10.9.0
+ version = 10<<16 | 9<<8 | 0<<0 // 10.9.0
+ case sys.ARM64:
+ version = 11<<16 | 0<<8 | 0<<0 // 11.0.0
}
- case sys.ARM64:
+ ml := newMachoLoad(ctxt.Arch, LC_BUILD_VERSION, 4)
+ ml.data[0] = uint32(machoPlatform)
+ ml.data[1] = version // OS version
+ ml.data[2] = version // SDK version
+ ml.data[3] = 0 // ntools
}
}
diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go
index 9369e550f4..985aed49e2 100644
--- a/src/cmd/link/link_test.go
+++ b/src/cmd/link/link_test.go
@@ -333,12 +333,12 @@ func TestXFlag(t *testing.T) {
}
}
-var testMacOSVersionSrc = `
+var testMachOBuildVersionSrc = `
package main
func main() { }
`
-func TestMacOSVersion(t *testing.T) {
+func TestMachOBuildVersion(t *testing.T) {
testenv.MustHaveGoBuild(t)
t.Parallel()
@@ -346,7 +346,7 @@ func TestMacOSVersion(t *testing.T) {
tmpdir := t.TempDir()
src := filepath.Join(tmpdir, "main.go")
- err := ioutil.WriteFile(src, []byte(testMacOSVersionSrc), 0666)
+ err := ioutil.WriteFile(src, []byte(testMachOBuildVersionSrc), 0666)
if err != nil {
t.Fatal(err)
}
@@ -371,28 +371,28 @@ func TestMacOSVersion(t *testing.T) {
t.Fatal(err)
}
found := false
- const LC_VERSION_MIN_MACOSX = 0x24
+ const LC_BUILD_VERSION = 0x32
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)
+ t.Errorf("LC_BUILD_VERSION 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 {
+ if type_ != LC_BUILD_VERSION {
continue
}
- osVer := exem.ByteOrder.Uint32(raw[8:])
+ osVer := exem.ByteOrder.Uint32(raw[12:])
checkMin(osVer)
- sdkVer := exem.ByteOrder.Uint32(raw[12:])
+ sdkVer := exem.ByteOrder.Uint32(raw[16:])
checkMin(sdkVer)
found = true
break
}
if !found {
- t.Errorf("no LC_VERSION_MIN_MACOSX load command found")
+ t.Errorf("no LC_BUILD_VERSION load command found")
}
}