diff options
author | Than McIntosh <thanm@google.com> | 2019-06-19 13:33:33 -0400 |
---|---|---|
committer | Alexander Rakoczy <alex@golang.org> | 2019-07-08 16:54:28 +0000 |
commit | e050fac971440e3e08bb82fb921d63d5851ac3bc (patch) | |
tree | a3746b4e0f6ad28160d382c5b1f733e2b1b39ac9 | |
parent | 39b533ed6634079a5c4f6a3488f4b01cdab2d833 (diff) | |
download | go-e050fac971440e3e08bb82fb921d63d5851ac3bc.tar.gz go-e050fac971440e3e08bb82fb921d63d5851ac3bc.zip |
[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 <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/+/183397
-rw-r--r-- | src/cmd/link/internal/ld/macho_combine_dwarf.go | 1 |
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 |