]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: prefix syms with "_" on external darwin links
authorJeremy Faller <jeremy@golang.org>
Mon, 9 Sep 2019 20:39:43 +0000 (16:39 -0400)
committerJeremy Faller <jeremy@golang.org>
Thu, 12 Sep 2019 18:44:26 +0000 (18:44 +0000)
Fixes #33808

Change-Id: If1f30bc80004093ffdf9121768464dfb3a6e1f63
Reviewed-on: https://go-review.googlesource.com/c/go/+/194381
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/link/internal/ld/issue33808_test.go [new file with mode: 0644]
src/cmd/link/internal/ld/macho.go

diff --git a/src/cmd/link/internal/ld/issue33808_test.go b/src/cmd/link/internal/ld/issue33808_test.go
new file mode 100644 (file)
index 0000000..df928a7
--- /dev/null
@@ -0,0 +1,53 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ld
+
+import (
+       "internal/testenv"
+       "io/ioutil"
+       "os"
+       "runtime"
+       "strings"
+       "testing"
+)
+
+const prog = `
+package main
+
+import "log"
+
+func main() {
+       log.Fatalf("HERE")
+}
+`
+
+func TestIssue33808(t *testing.T) {
+       if runtime.GOOS != "darwin" {
+               return
+       }
+       testenv.MustHaveGoBuild(t)
+
+       dir, err := ioutil.TempDir("", "TestIssue33808")
+       if err != nil {
+               t.Fatalf("could not create directory: %v", err)
+       }
+       defer os.RemoveAll(dir)
+
+       f := gobuild(t, dir, prog, "-ldflags=-linkmode=external")
+       f.Close()
+
+       syms, err := f.Symbols()
+       if err != nil {
+               t.Fatalf("Error reading symbols: %v", err)
+       }
+
+       name := "log.Fatalf"
+       for _, sym := range syms {
+               if strings.Contains(sym.Name, name) {
+                       return
+               }
+       }
+       t.Fatalf("Didn't find %v", name)
+}
index 02e133e31d45952ee63875893effbe13a6a7d216..7453f37c62fec81c459eaa43cd24bed5e96a9b1f 100644 (file)
@@ -869,6 +869,7 @@ func machosymtab(ctxt *Link) {
                symtab.AddUint32(ctxt.Arch, uint32(symstr.Size))
 
                export := machoShouldExport(ctxt, s)
+               isGoSymbol := strings.Contains(s.Extname(), ".")
 
                // In normal buildmodes, only add _ to C symbols, as
                // Go symbols have dot in the name.
@@ -877,8 +878,8 @@ func machosymtab(ctxt *Link) {
                // symbols like crosscall2 are in pclntab and end up
                // pointing at the host binary, breaking unwinding.
                // See Issue #18190.
-               cexport := !strings.Contains(s.Extname(), ".") && (ctxt.BuildMode != BuildModePlugin || onlycsymbol(s))
-               if cexport || export {
+               cexport := !isGoSymbol && (ctxt.BuildMode != BuildModePlugin || onlycsymbol(s))
+               if cexport || export || isGoSymbol {
                        symstr.AddUint8('_')
                }