From: Cherry Zhang Date: Sun, 22 Nov 2020 16:43:29 +0000 (-0500) Subject: cmd/link: invalidate kernel cache on darwin X-Git-Tag: go1.16beta1~121 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cf7aa585ac;p=gostls13.git cmd/link: invalidate kernel cache on darwin Apparently, the darwin kernel may cache the code signature at mmap. When we mmap the output buffer, it doesn't have a code signature (as we haven't generated one). Invalidate the kernel cache after writing the file. See https://github.com/golang/go/issues/42684#issuecomment-731704900 for more information. Updates #38485. Fixes #42684. Change-Id: Iac2ef756ca1454c856944423e5040b8e17a6b420 Reviewed-on: https://go-review.googlesource.com/c/go/+/272258 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Austin Clements --- diff --git a/src/cmd/link/internal/ld/outbuf.go b/src/cmd/link/internal/ld/outbuf.go index 6cae064679..530836ef7c 100644 --- a/src/cmd/link/internal/ld/outbuf.go +++ b/src/cmd/link/internal/ld/outbuf.go @@ -113,6 +113,7 @@ func (out *OutBuf) Close() error { } if out.isMmapped() { out.copyHeap() + out.purgeSignatureCache() out.munmap() } if out.f == nil { diff --git a/src/cmd/link/internal/ld/outbuf_darwin.go b/src/cmd/link/internal/ld/outbuf_darwin.go index d7e3372230..9444b6567e 100644 --- a/src/cmd/link/internal/ld/outbuf_darwin.go +++ b/src/cmd/link/internal/ld/outbuf_darwin.go @@ -36,3 +36,12 @@ func (out *OutBuf) fallocate(size uint64) error { return nil } + +func (out *OutBuf) purgeSignatureCache() { + // Apparently, the Darwin kernel may cache the code signature at mmap. + // When we mmap the output buffer, it doesn't have a code signature + // (as we haven't generated one). Invalidate the kernel cache now that + // we have generated the signature. See issue #42684. + syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(&out.buf[0])), uintptr(len(out.buf)), syscall.MS_INVALIDATE) + // Best effort. Ignore error. +} diff --git a/src/cmd/link/internal/ld/outbuf_notdarwin.go b/src/cmd/link/internal/ld/outbuf_notdarwin.go new file mode 100644 index 0000000000..8c5666f216 --- /dev/null +++ b/src/cmd/link/internal/ld/outbuf_notdarwin.go @@ -0,0 +1,9 @@ +// Copyright 2020 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. + +// +build !darwin + +package ld + +func (out *OutBuf) purgeSignatureCache() {}