1
0
mirror of https://github.com/golang/go synced 2024-11-12 08:10:21 -07:00

cmd/link: nice error message on ABI mismatch

Currently, if a symbol is only defined under one ABI and referenced
under another ABI, you simply get a "relocation target X not defined".
This is confusing because it seems like the symbol is defined.

This CL enhances the error message in this case to be "relocation
target X not defined for <ABI> (but is defined for <ABI>)".

For #27539.

Change-Id: If857a1882c3fe9af5346797d5295ca1fe50ae565
Reviewed-on: https://go-review.googlesource.com/c/147159
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Austin Clements 2018-10-31 20:42:38 -04:00
parent 16e6cd9a4d
commit 1794ee6829

View File

@ -32,6 +32,7 @@ package ld
import ( import (
"bufio" "bufio"
"cmd/internal/obj"
"cmd/internal/objabi" "cmd/internal/objabi"
"cmd/internal/sys" "cmd/internal/sys"
"cmd/link/internal/sym" "cmd/link/internal/sym"
@ -108,9 +109,27 @@ func (ctxt *Link) ErrorUnresolved(s *sym.Symbol, r *sym.Reloc) {
k := unresolvedSymKey{from: s, to: r.Sym} k := unresolvedSymKey{from: s, to: r.Sym}
if !ctxt.unresolvedSymSet[k] { if !ctxt.unresolvedSymSet[k] {
ctxt.unresolvedSymSet[k] = true ctxt.unresolvedSymSet[k] = true
// Try to find symbol under another ABI.
var reqABI, haveABI obj.ABI
haveABI = ^obj.ABI(0)
for abi := obj.ABI(0); abi < obj.ABICount; abi++ {
v := sym.ABIToVersion(abi)
if v == -1 {
continue
}
if v == int(r.Sym.Version) {
reqABI = abi
} else if ctxt.Syms.ROLookup(r.Sym.Name, v) != nil {
haveABI = abi
}
}
// Give a special error message for main symbol (see #24809). // Give a special error message for main symbol (see #24809).
if r.Sym.Name == "main.main" { if r.Sym.Name == "main.main" {
Errorf(s, "function main is undeclared in the main package") Errorf(s, "function main is undeclared in the main package")
} else if haveABI != ^obj.ABI(0) {
Errorf(s, "relocation target %s not defined for %s (but is defined for %s)", r.Sym.Name, reqABI, haveABI)
} else { } else {
Errorf(s, "relocation target %s not defined", r.Sym.Name) Errorf(s, "relocation target %s not defined", r.Sym.Name)
} }