mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: avoid crash on undefined func sym with external linking
Fix a buglet in relocation processing that crops up with external linking when you have an undefined function symbol that also has a prototype (as if it were being defined in assembly src). Fixes #47993. Change-Id: Ib655492a63b205ffdc124cfd0cb7f7b731571821 Reviewed-on: https://go-review.googlesource.com/c/go/+/345473 Trust: Than McIntosh <thanm@google.com> Run-TryBot: Than McIntosh <thanm@google.com> Reviewed-by: Austin Clements <austin@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
parent
37d4532867
commit
014a9720f9
2 changed files with 53 additions and 0 deletions
48
src/cmd/go/testdata/script/link_external_undef.txt
vendored
Normal file
48
src/cmd/go/testdata/script/link_external_undef.txt
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
|
||||||
|
# Test case for issue 47993, in which the linker crashes
|
||||||
|
# on a bad input instead of issuing an error and exiting.
|
||||||
|
|
||||||
|
# This test requires external linking, so use cgo as a proxy
|
||||||
|
[!cgo] skip
|
||||||
|
|
||||||
|
! go build -ldflags='-linkmode=external' .
|
||||||
|
! stderr 'panic'
|
||||||
|
stderr '^.*unreachable sym in relocation.*'
|
||||||
|
|
||||||
|
-- go.mod --
|
||||||
|
|
||||||
|
module issue47993
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
-- main.go --
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
type M struct {
|
||||||
|
b bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note the body-less func def here. This is what causes the problems.
|
||||||
|
func (m *M) run(fp func())
|
||||||
|
|
||||||
|
func doit(m *M) {
|
||||||
|
InAsm()
|
||||||
|
m.run(func() {
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m := &M{true}
|
||||||
|
doit(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func InAsm()
|
||||||
|
|
||||||
|
-- main.s --
|
||||||
|
|
||||||
|
// Add an assembly function so as to leave open the possibility
|
||||||
|
// that body-less functions in Go might be defined in assembly.
|
||||||
|
|
||||||
|
// Currently we just need an empty file here.
|
||||||
|
|
||||||
|
|
@ -436,6 +436,11 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
|
||||||
if weak && !ldr.AttrReachable(rs) {
|
if weak && !ldr.AttrReachable(rs) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if ldr.SymSect(rs) == nil {
|
||||||
|
st.err.Errorf(s, "unreachable sym in relocation: %s", ldr.SymName(rs))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// The method offset tables using this relocation expect the offset to be relative
|
// The method offset tables using this relocation expect the offset to be relative
|
||||||
// to the start of the first text section, even if there are multiple.
|
// to the start of the first text section, even if there are multiple.
|
||||||
if ldr.SymSect(rs).Name == ".text" {
|
if ldr.SymSect(rs).Name == ".text" {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue