]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: suppress unnecessary DWARF relocs that confuse dsymutil
authorHeschi Kreinick <heschi@google.com>
Wed, 4 Oct 2017 22:30:38 +0000 (18:30 -0400)
committerHeschi Kreinick <heschi@google.com>
Thu, 12 Oct 2017 18:51:54 +0000 (18:51 +0000)
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 <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/cmd/link/internal/ld/data.go

index 88e9193f58b85dc274156c105d5e162629455b08..a5a329b6f0e8698828c95abae4f8422bc2fa0360 100644 (file)
@@ -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.