Skip to content

Commit

Permalink
cmd/link: invalidate kernel cache on darwin
Browse files Browse the repository at this point in the history
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 #42684 (comment)
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>
  • Loading branch information
cherrymui committed Dec 1, 2020
1 parent 8cd35e0 commit cf7aa58
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/cmd/link/internal/ld/outbuf.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ func (out *OutBuf) Close() error {
}
if out.isMmapped() {
out.copyHeap()
out.purgeSignatureCache()
out.munmap()
}
if out.f == nil {
Expand Down
9 changes: 9 additions & 0 deletions src/cmd/link/internal/ld/outbuf_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 9 additions & 0 deletions src/cmd/link/internal/ld/outbuf_notdarwin.go
Original file line number Diff line number Diff line change
@@ -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() {}

0 comments on commit cf7aa58

Please sign in to comment.