From: Hiroshi Ioka Date: Wed, 21 Jun 2017 09:35:38 +0000 (+0900) Subject: cmd/link: don't emit default entry symbol in some situations X-Git-Tag: go1.10beta1~1611 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6424c40c2251fdf55e3696933d0e0494a347edd9;p=gostls13.git cmd/link: don't emit default entry symbol in some situations Also, fix comment. Change-Id: Ieb7ba21f34730dc51ab45a652d225e4145d4b861 Reviewed-on: https://go-review.googlesource.com/54870 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index dbb96fb77f..119e406080 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -215,18 +215,29 @@ func (d *deadcodepass) init() { } else { // In a normal binary, start at main.main and the init // functions and mark what is reachable from there. - names = append(names, *flagEntrySymbol) + if *FlagLinkshared && (Buildmode == BuildmodeExe || Buildmode == BuildmodePIE) { names = append(names, "main.main", "main.init") - } else if Buildmode == BuildmodePlugin { - names = append(names, *flagPluginPath+".init", *flagPluginPath+".main", "go.plugin.tabs") + } else { + // The external linker refers main symbol directly. + if Linkmode == LinkExternal && (Buildmode == BuildmodeExe || Buildmode == BuildmodePIE) { + if Headtype == objabi.Hwindows && SysArch.Family == sys.I386 { + *flagEntrySymbol = "_main" + } else { + *flagEntrySymbol = "main" + } + } + names = append(names, *flagEntrySymbol) + if Buildmode == BuildmodePlugin { + names = append(names, *flagPluginPath+".init", *flagPluginPath+".main", "go.plugin.tabs") - // We don't keep the go.plugin.exports symbol, - // but we do keep the symbols it refers to. - exports := d.ctxt.Syms.ROLookup("go.plugin.exports", 0) - if exports != nil { - for _, r := range exports.R { - d.mark(r.Sym, nil) + // We don't keep the go.plugin.exports symbol, + // but we do keep the symbols it refers to. + exports := d.ctxt.Syms.ROLookup("go.plugin.exports", 0) + if exports != nil { + for _, r := range exports.R { + d.mark(r.Sym, nil) + } } } } @@ -240,7 +251,7 @@ func (d *deadcodepass) init() { } } -// flood flood fills symbols reachable from the markQueue symbols. +// flood fills symbols reachable from the markQueue symbols. // As it goes, it collects methodref and interface method declarations. func (d *deadcodepass) flood() { for len(d.markQueue) > 0 {