mirror of
https://github.com/golang/go
synced 2024-11-25 10:57:58 -07:00
20ed603118
Currently, on Mach-O, the Go linker doesn't generate LC_UUID in internal linking mode. This causes some macOS system tools unable to track the binary, as well as in some cases the binary unable to access local network on macOS 15. This CL makes the linker start generate LC_UUID. Currently, the UUID is generated if the -B flag is specified. And we'll make it generate UUID by default in a later CL. The -B flag is currently for generating GNU build ID on ELF, which is a similar concept to Mach-O's UUID. Instead of introducing another flag, we just use the same flag and the same setting. Specifically, "-B gobuildid" will generate a UUID based on the Go build ID. For #68678. Cq-Include-Trybots: luci.golang.try:gotip-darwin-amd64_14,gotip-darwin-arm64_13 Change-Id: I90089a78ba144110bf06c1c6836daf2d737ff10a Reviewed-on: https://go-review.googlesource.com/c/go/+/618595 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Ingo Oeser <nightlyone@googlemail.com> Reviewed-by: Than McIntosh <thanm@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
52 lines
1.5 KiB
Go
52 lines
1.5 KiB
Go
// run
|
|
|
|
//go:build !nacl && !js && !wasip1 && !android && gc
|
|
|
|
// Copyright 2016 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"log"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
// The cannot open file error indicates that the parsing of -B flag
|
|
// succeeded and it failed at a later step.
|
|
checkLinkOutput("0", "-B argument must start with 0x")
|
|
checkLinkOutput("0x", "cannot open file nonexistent.o")
|
|
checkLinkOutput("0x0", "-B argument must have even number of digits")
|
|
checkLinkOutput("0x00", "cannot open file nonexistent.o")
|
|
checkLinkOutput("0xYZ", "-B argument contains invalid hex digit")
|
|
|
|
maxLen := 32
|
|
if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
|
|
maxLen = 16
|
|
}
|
|
checkLinkOutput("0x"+strings.Repeat("00", maxLen), "cannot open file nonexistent.o")
|
|
checkLinkOutput("0x"+strings.Repeat("00", maxLen+1), "-B option too long")
|
|
}
|
|
|
|
func checkLinkOutput(buildid string, message string) {
|
|
cmd := exec.Command("go", "tool", "link", "-B", buildid, "nonexistent.o")
|
|
out, err := cmd.CombinedOutput()
|
|
if err == nil {
|
|
log.Fatalf("expected cmd/link to fail")
|
|
}
|
|
|
|
firstLine := string(bytes.SplitN(out, []byte("\n"), 2)[0])
|
|
if strings.HasPrefix(firstLine, "panic") {
|
|
log.Fatalf("cmd/link panicked:\n%s", out)
|
|
}
|
|
|
|
if !strings.Contains(firstLine, message) {
|
|
log.Fatalf("%s: cmd/link output did not include expected message %q: %s", buildid, message, firstLine)
|
|
}
|
|
}
|