From 4e548f2c8e489a408033c8aab336077b16bc8cf7 Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Fri, 21 Jun 2024 11:56:45 -0400 Subject: [PATCH] [release-branch.go1.22] cmd/link: don't let dsymutil delete our temp directory To work around #59026, where dsymutil may not clean up its temp directory at exit, we set DSYMUTIL_REPRODUCER_PATH to our temp directory so it uses that, and we can delete it at the end. In Xcode 16 beta, dsymutil deletes the DSYMUTIL_REPRODUCER_PATH directory even if it is not empty. We still need our tmpdir at the point, so give a subdirectory to dsymutil instead. Updates #68088. Fixes #68198. Change-Id: I18759cc39512819bbd0511793ce917eae72245d6 Reviewed-on: https://go-review.googlesource.com/c/go/+/593659 Reviewed-by: Than McIntosh LUCI-TryBot-Result: Go LUCI (cherry picked from commit 5f319b75075a62ab176ab8c25f0e45f2ae4f0704) Reviewed-on: https://go-review.googlesource.com/c/go/+/596455 --- src/cmd/link/internal/ld/lib.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index eab74dc328..7af88869d2 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1954,7 +1954,15 @@ func (ctxt *Link) hostlink() { cmd := exec.Command(dsymutilCmd, "-f", *flagOutfile, "-o", dsym) // dsymutil may not clean up its temp directory at exit. // Set DSYMUTIL_REPRODUCER_PATH to work around. see issue 59026. - cmd.Env = append(os.Environ(), "DSYMUTIL_REPRODUCER_PATH="+*flagTmpdir) + // dsymutil (Apple LLVM version 16.0.0) deletes the directory + // even if it is not empty. We still need our tmpdir, so give a + // subdirectory to dsymutil. + dsymDir := filepath.Join(*flagTmpdir, "dsymutil") + err = os.MkdirAll(dsymDir, 0777) + if err != nil { + Exitf("fail to create temp dir: %v", err) + } + cmd.Env = append(os.Environ(), "DSYMUTIL_REPRODUCER_PATH="+dsymDir) if ctxt.Debugvlog != 0 { ctxt.Logf("host link dsymutil:") for _, v := range cmd.Args { -- 2.48.1