]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: prefix Go syms with _ on darwin
authorJeremy Faller <jeremy@golang.org>
Wed, 18 Sep 2019 17:59:52 +0000 (13:59 -0400)
committerJeremy Faller <jeremy@golang.org>
Wed, 18 Sep 2019 18:26:00 +0000 (18:26 +0000)
RELNOTE=This change adds an underscore to all Go symbols in darwin, and
the behavior might be confusing to users of tools like "nm", etc.

Fixes #33808

Change-Id: I1849e6618c81215cb9bfa62b678f6f389cd009d5
Reviewed-on: https://go-review.googlesource.com/c/go/+/196217
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
src/debug/macho/file.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..77eaeb4
--- /dev/null
@@ -0,0 +1,54 @@
+// 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)
+       testenv.MustHaveCGO(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('_')
                }
 
index 16708e5247fdfec4155779785a934528d5c1a08c..085b0c8219bad436e5438e3aae5190dc2510583b 100644 (file)
@@ -473,7 +473,12 @@ func (f *File) parseSymtab(symdat, strtab, cmddat []byte, hdr *SymtabCmd, offset
                if n.Name >= uint32(len(strtab)) {
                        return nil, &FormatError{offset, "invalid name in symbol table", n.Name}
                }
-               sym.Name = cstring(strtab[n.Name:])
+               // We add "_" to Go symbols. Strip it here. See issue 33808.
+               name := cstring(strtab[n.Name:])
+               if strings.Contains(name, ".") && name[0] == '_' {
+                       name = name[1:]
+               }
+               sym.Name = name
                sym.Type = n.Type
                sym.Sect = n.Sect
                sym.Desc = n.Desc