From 1794ee682994ed2efbb9371060856cd7b146f405 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 31 Oct 2018 20:42:38 -0400 Subject: [PATCH] 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 (but is defined for )". For #27539. Change-Id: If857a1882c3fe9af5346797d5295ca1fe50ae565 Reviewed-on: https://go-review.googlesource.com/c/147159 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/link/internal/ld/link.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 48b92724b6f..f3f1bba773a 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) }