mirror of
https://github.com/golang/go
synced 2024-11-26 13:48:05 -07: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:
parent
8cd35e00bd
commit
cf7aa585ac
@ -113,6 +113,7 @@ func (out *OutBuf) Close() error {
|
||||
}
|
||||
if out.isMmapped() {
|
||||
out.copyHeap()
|
||||
out.purgeSignatureCache()
|
||||
out.munmap()
|
||||
}
|
||||
if out.f == nil {
|
||||
|
@ -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.
|
||||
}
|
||||
|
9
src/cmd/link/internal/ld/outbuf_notdarwin.go
Normal file
9
src/cmd/link/internal/ld/outbuf_notdarwin.go
Normal 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() {}
|
Loading…
Reference in New Issue
Block a user