import (
"cmd/internal/obj"
+ "cmd/link/internal/loader"
"cmd/link/internal/sym"
+ "fmt"
+ "os"
"sync"
)
}
type lookupFn func(name string, version int) *sym.Symbol
+type symNameFn func(s loader.Sym) string
// ErrorReporter is used to make error reporting thread safe.
type ErrorReporter struct {
unresSyms map[unresolvedSymKey]bool
unresMutex sync.Mutex
lookup lookupFn
+ SymName symNameFn
}
// errorUnresolved prints unresolved symbol error for r.Sym that is referenced from s.
}
}
}
+
+// Errorf method logs an error message.
+//
+// If more than 20 errors have been printed, exit with an error.
+//
+// Logging an error means that on exit cmd/link will delete any
+// output file and return a non-zero error code.
+// TODO: consolidate the various different versions of Errorf (
+// function, Link method, and ErrorReporter method).
+func (reporter *ErrorReporter) Errorf(s loader.Sym, format string, args ...interface{}) {
+ if s != 0 && reporter.SymName != nil {
+ sn := reporter.SymName(s)
+ format = sn + ": " + format
+ } else {
+ format = fmt.Sprintf("sym %d: %s", s, format)
+ }
+ format += "\n"
+ fmt.Fprintf(os.Stderr, format, args...)
+ afterErrorAction()
+}
log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups)
}
ctxt.loader = loader.NewLoader(flags, elfsetstring)
+ ctxt.ErrorReporter.SymName = func(s loader.Sym) string {
+ return ctxt.loader.SymName(s)
+ }
ctxt.cgo_export_static = make(map[string]bool)
ctxt.cgo_export_dynamic = make(map[string]bool)