From 4eca0898ec724f1318295b1ebed45e12bddb203c Mon Sep 17 00:00:00 2001 From: Hiroshi Ioka Date: Mon, 28 Aug 2017 15:10:25 +0900 Subject: [PATCH] cmd/link: refactor addlib * extract pkgname() and findlib() from the function for #18190. * rename const pkgname to const pkgdef to avoid confliction. Change-Id: Ie62509bfbddcf19cf92b5b12b598679a069e6e74 Reviewed-on: https://go-review.googlesource.com/59417 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/ld.go | 29 +++++++++++++++++++++-------- src/cmd/link/internal/ld/lib.go | 4 ++-- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/cmd/link/internal/ld/ld.go b/src/cmd/link/internal/ld/ld.go index fc4137213f..9bbc94faa6 100644 --- a/src/cmd/link/internal/ld/ld.go +++ b/src/cmd/link/internal/ld/ld.go @@ -86,19 +86,18 @@ func (ctxt *Link) readImportCfg(file string) { } } -func addlib(ctxt *Link, src string, obj string, pathname string) *Library { - name := path.Clean(pathname) - +func pkgname(lib string) string { + name := path.Clean(lib) // runtime.a -> runtime, runtime.6 -> runtime pkg := name if len(pkg) >= 2 && pkg[len(pkg)-2] == '.' { pkg = pkg[:len(pkg)-2] } + return pkg +} - // already loaded? - if l := ctxt.LibraryByPkg[pkg]; l != nil { - return l - } +func findlib(ctxt *Link, lib string) (string, bool) { + name := path.Clean(lib) var pname string isshlib := false @@ -110,12 +109,13 @@ func addlib(ctxt *Link, src string, obj string, pathname string) *Library { pname = ctxt.PackageFile[name] if pname == "" { ctxt.Logf("cannot find package %s (using -importcfg)\n", name) - return nil + return "", false } } else { if filepath.IsAbs(name) { pname = name } else { + pkg := pkgname(lib) // try dot, -L "libdir", and then goroot. for _, dir := range ctxt.Libdir { if *FlagLinkshared { @@ -134,6 +134,19 @@ func addlib(ctxt *Link, src string, obj string, pathname string) *Library { pname = path.Clean(pname) } + return pname, isshlib +} + +func addlib(ctxt *Link, src string, obj string, lib string) *Library { + pkg := pkgname(lib) + + // already loaded? + if l := ctxt.LibraryByPkg[pkg]; l != nil { + return l + } + + pname, isshlib := findlib(ctxt, lib) + if ctxt.Debugvlog > 1 { ctxt.Logf("%5.2f addlib: %s %s pulls in %s isshlib %v\n", elapsed(), obj, src, pname, isshlib) } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 1977ea5173..d9034a6527 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -242,7 +242,7 @@ func (w *outBuf) Offset() int64 { var coutbuf outBuf -const pkgname = "__.PKGDEF" +const pkgdef = "__.PKGDEF" var ( // Set if we see an object compiled by the host compiler that is not @@ -811,7 +811,7 @@ func objfile(ctxt *Link, lib *Library) { goto out } - if !strings.HasPrefix(arhdr.name, pkgname) { + if !strings.HasPrefix(arhdr.name, pkgdef) { Errorf(nil, "%s: cannot find package header", lib.File) goto out }