From: Than McIntosh Date: Wed, 19 Jun 2019 17:33:33 +0000 (-0400) Subject: [release-branch.go1.12] cmd/link: macos: set initial protection of 0 for __DWARF... X-Git-Tag: go1.12.7~5 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e050fac971440e3e08bb82fb921d63d5851ac3bc;p=gostls13.git [release-branch.go1.12] 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 #32697 Change-Id: I9a73449c6d26c172f3d70361719943af381f37e6 Reviewed-on: https://go-review.googlesource.com/c/go/+/182958 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-on: https://go-review.googlesource.com/c/go/+/183397 --- 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