diff options
| author | Austin Clements <austin@google.com> | 2018-10-31 20:42:38 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2018-11-12 20:46:52 +0000 |
| commit | 1794ee682994ed2efbb9371060856cd7b146f405 (patch) | |
| tree | e40726bb83e7b1c359c0f1a9acdc095e7c132572 /src/cmd | |
| parent | 16e6cd9a4dc499db164624a048f25e2f382ac016 (diff) | |
| download | go-1794ee682994ed2efbb9371060856cd7b146f405.tar.xz | |
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>
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/link/internal/ld/link.go | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 48b92724b6..f3f1bba773 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -32,6 +32,7 @@ package ld import ( "bufio" + "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/sys" "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} if !ctxt.unresolvedSymSet[k] { 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). if r.Sym.Name == "main.main" { 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 { Errorf(s, "relocation target %s not defined", r.Sym.Name) } |
