From: Heschi Kreinick Date: Wed, 4 Oct 2017 22:30:38 +0000 (-0400) Subject: cmd/link: suppress unnecessary DWARF relocs that confuse dsymutil X-Git-Tag: go1.10beta1~745 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a0402b6bf84d7e51eb9181f5d39fb0037913384e;p=gostls13.git cmd/link: suppress unnecessary DWARF relocs that confuse dsymutil During Mach-O linking, dsymutil takes the DWARF from individual object files and combines it into a debug archive. Because it's content-aware, it doesn't need our help to do its job. Nonetheless, it does try to honor relocations that are present in its input. When dsymutil encounters a relocation, it uses the value of that relocation as an index into the debug map to find its final location. When it does that, it's assuming that the value is an address in the object file. But DWARF references are section-relative. So when it processes a relocation for a DWARF reference, it gets confused, and if the value happens to match the address of a function or data symbol, it will rewrite it incorrectly. Since the relocations don't help, and can hurt, drop them when externally linking a Mach-O binary. Fixes #22068 Change-Id: I8ec36da626575d9f6c8d0e7a0b76eab8ba22d62c Reviewed-on: https://go-review.googlesource.com/68330 Run-TryBot: Heschi Kreinick TryBot-Result: Gobot Gobot Reviewed-by: David Crawshaw --- diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 88e9193f58..a5a329b6f0 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -313,6 +313,16 @@ func relocsym(ctxt *Link, s *sym.Symbol) { if ctxt.LinkMode == LinkExternal { r.Done = false + + // On most platforms, the external linker needs to adjust DWARF references + // as it combines DWARF sections. However, on Darwin, dsymutil does the + // DWARF linking, and it understands how to follow section offsets. + // Leaving in the relocation records confuses it (see + // https://golang.org/issue/22068) so drop them for Darwin. + if Headtype == objabi.Hdarwin { + r.Done = true + } + // PE code emits IMAGE_REL_I386_SECREL and IMAGE_REL_AMD64_SECREL // for R_DWARFREF relocations, while R_ADDR is replaced with // IMAGE_REL_I386_DIR32, IMAGE_REL_AMD64_ADDR64 and IMAGE_REL_AMD64_ADDR32.