1
0
mirror of https://github.com/golang/go synced 2024-09-25 01:10:13 -06:00

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 <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
Cherry Zhang 2020-11-22 11:43:29 -05:00
parent 8cd35e00bd
commit cf7aa585ac
3 changed files with 19 additions and 0 deletions

View File

@ -113,6 +113,7 @@ func (out *OutBuf) Close() error {
}
if out.isMmapped() {
out.copyHeap()
out.purgeSignatureCache()
out.munmap()
}
if out.f == nil {

View File

@ -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.
}

View File

@ -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() {}