aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2019-06-19 13:33:33 -0400
committerAlexander Rakoczy <alex@golang.org>2019-07-08 17:03:39 +0000
commit2782ffc84d9938fc11ad9dfe897ef6466afbd4d4 (patch)
tree7bcc6589ea79321d266c3727cf1b940a925001cc
parentf0569288652b16feb471a742194803874c55ddec (diff)
downloadgo-2782ffc84d9938fc11ad9dfe897ef6466afbd4d4.tar.gz
go-2782ffc84d9938fc11ad9dfe897ef6466afbd4d4.zip
[release-branch.go1.11] cmd/link: macos: set initial protection of 0 for __DWARF segment
For later versions of MacOS, the dynamic loader is more picky about enforcing restrictions on __DWARF MachO load commands/segments, triggering aborts of the form dyld: malformed mach-o image: segment __DWARF has vmsize < filesize for Go programs that use cgo on Darwin. The error is being triggered because the Go linker is setting "vmsize" in the DWARF segment entry to zero as a way to signal that the DWARF doesn't need to be mapped into memory at runtime (which we need to continue to do). This patch changes the initial protection on the __DWARF segment to zero, which dyld seems to be happy with (this is used for other similar non-loadable sections such as __LLVM). Updates #32696 Change-Id: I9a73449c6d26c172f3d70361719943af381f37e6 Reviewed-on: https://go-review.googlesource.com/c/go/+/182958 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-on: https://go-review.googlesource.com/c/go/+/183399
-rw-r--r--src/cmd/link/internal/ld/macho_combine_dwarf.go1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/macho_combine_dwarf.go b/src/cmd/link/internal/ld/macho_combine_dwarf.go
index 95bd4c7c36..7d33f75b54 100644
--- a/src/cmd/link/internal/ld/macho_combine_dwarf.go
+++ b/src/cmd/link/internal/ld/macho_combine_dwarf.go
@@ -429,6 +429,7 @@ func machoUpdateDwarfHeader(r *loadCmdReader, buildmode BuildMode, compressedSec
segv := reflect.ValueOf(seg).Elem()
segv.FieldByName("Offset").SetUint(uint64(dwarfstart))
segv.FieldByName("Addr").SetUint(uint64(dwarfaddr))
+ segv.FieldByName("Prot").SetUint(0)
if compressedSects != nil {
var segSize uint64