mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: always mark runtime.unreachableMethod symbol
In the deadcode path we mark runtime.unreachableMethod symbol, which is a special symbol used for redirecting unreachable methods. Currently this code is conditioned on not -linkshared. This is wrong. It should be marked with -linkshared mode as well. In fact, -linkshared should only affect the entry symbol. Change the code accordingly. Change-Id: I252abf850212a930f275589ef0035a43e52cb9cc Reviewed-on: https://go-review.googlesource.com/c/go/+/319893 Trust: Cherry Mui <cherryyz@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
parent
92c189f211
commit
b4833f7c06
1 changed files with 19 additions and 19 deletions
|
|
@ -65,26 +65,26 @@ func (d *deadcodePass) init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
names = append(names, *flagEntrySymbol)
|
names = append(names, *flagEntrySymbol)
|
||||||
// runtime.unreachableMethod is a function that will throw if called.
|
}
|
||||||
// We redirect unreachable methods to it.
|
// runtime.unreachableMethod is a function that will throw if called.
|
||||||
names = append(names, "runtime.unreachableMethod")
|
// We redirect unreachable methods to it.
|
||||||
if !d.ctxt.linkShared && d.ctxt.BuildMode != BuildModePlugin {
|
names = append(names, "runtime.unreachableMethod")
|
||||||
// runtime.buildVersion and runtime.modinfo are referenced in .go.buildinfo section
|
if !d.ctxt.linkShared && d.ctxt.BuildMode != BuildModePlugin {
|
||||||
// (see function buildinfo in data.go). They should normally be reachable from the
|
// runtime.buildVersion and runtime.modinfo are referenced in .go.buildinfo section
|
||||||
// runtime. Just make it explicit, in case.
|
// (see function buildinfo in data.go). They should normally be reachable from the
|
||||||
names = append(names, "runtime.buildVersion", "runtime.modinfo")
|
// runtime. Just make it explicit, in case.
|
||||||
}
|
names = append(names, "runtime.buildVersion", "runtime.modinfo")
|
||||||
if d.ctxt.BuildMode == BuildModePlugin {
|
}
|
||||||
names = append(names, objabi.PathToPrefix(*flagPluginPath)+"..inittask", objabi.PathToPrefix(*flagPluginPath)+".main", "go.plugin.tabs")
|
if d.ctxt.BuildMode == BuildModePlugin {
|
||||||
|
names = append(names, objabi.PathToPrefix(*flagPluginPath)+"..inittask", objabi.PathToPrefix(*flagPluginPath)+".main", "go.plugin.tabs")
|
||||||
|
|
||||||
// We don't keep the go.plugin.exports symbol,
|
// We don't keep the go.plugin.exports symbol,
|
||||||
// but we do keep the symbols it refers to.
|
// but we do keep the symbols it refers to.
|
||||||
exportsIdx := d.ldr.Lookup("go.plugin.exports", 0)
|
exportsIdx := d.ldr.Lookup("go.plugin.exports", 0)
|
||||||
if exportsIdx != 0 {
|
if exportsIdx != 0 {
|
||||||
relocs := d.ldr.Relocs(exportsIdx)
|
relocs := d.ldr.Relocs(exportsIdx)
|
||||||
for i := 0; i < relocs.Count(); i++ {
|
for i := 0; i < relocs.Count(); i++ {
|
||||||
d.mark(relocs.At(i).Sym(), 0)
|
d.mark(relocs.At(i).Sym(), 0)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue