From 928623ca953151451d7c780d3b634da3b792f038 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 9 Oct 2019 10:22:02 -0400 Subject: [PATCH] [dev.link] cmd/internal/goobj2: separate Autolib from Pkglist in new object file In CL 196030 we decided to combine the imported package list (Autolib) and referenced package list (PkgIdx, or Pkglist). However, in some cases the Autolib list may contain file name, instead of package path, e.g. https://go.googlesource.com/go/+/refs/heads/dev.link/src/cmd/compile/internal/gc/main.go#1181 And the linker needs that to locate the file. This mostly happens with direct invocation of the compiler and linker (i.e., not through "go build"). Instead of letting the linker make guess of the file name based on the package path, make Autolib a separate list. Change-Id: If195a69462d04db515346ee67cdec925f5a69e2e Reviewed-on: https://go-review.googlesource.com/c/go/+/200157 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/internal/goobj/readnew.go | 3 ++- src/cmd/internal/goobj2/objfile.go | 16 ++++++++++++++-- src/cmd/internal/obj/objfile2.go | 13 ++++++------- src/cmd/link/internal/objfile/objfile2.go | 6 +----- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/cmd/internal/goobj/readnew.go b/src/cmd/internal/goobj/readnew.go index f33bbf73b1..6e6ec02f60 100644 --- a/src/cmd/internal/goobj/readnew.go +++ b/src/cmd/internal/goobj/readnew.go @@ -21,8 +21,9 @@ func (r *objReader) readNew() { } // Imports + r.p.Imports = rr.Autolib() + pkglist := rr.Pkglist() - r.p.Imports = pkglist[1:] // index 0 is a dummy invalid package abiToVer := func(abi uint16) int64 { var vers int64 diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index c92b9dd9af..e15dbdca69 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -29,7 +29,8 @@ import ( // Data [...]byte // } // -// PkgIndex [...]stringOff // TODO: add fingerprints +// Autolib [...]stringOff // imported packages (for file loading) // TODO: add fingerprints +// PkgIndex [...]stringOff // referenced packages by index // // DwarfFiles [...]stringOff // XXX as a separate block for now // @@ -127,7 +128,8 @@ const ( // Blocks const ( - BlkPkgIdx = iota + BlkAutolib = iota + BlkPkgIdx BlkDwarfFile BlkSymdef BlkNonpkgdef @@ -469,6 +471,16 @@ func (r *Reader) StringRef(off uint32) string { return r.StringAt(r.uint32At(off)) } +func (r *Reader) Autolib() []string { + n := (r.h.Offsets[BlkAutolib+1] - r.h.Offsets[BlkAutolib]) / 4 + s := make([]string, n) + for i := range s { + off := r.h.Offsets[BlkAutolib] + uint32(i)*4 + s[i] = r.StringRef(off) + } + return s +} + func (r *Reader) Pkglist() []string { n := (r.h.Offsets[BlkPkgIdx+1] - r.h.Offsets[BlkPkgIdx]) / 4 s := make([]string, n) diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 39e2a4f224..caa442c0d3 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -40,6 +40,12 @@ func WriteObjFile2(ctxt *Link, b *bio.Writer, pkgpath string) { // String table w.StringTable() + // Autolib + h.Offsets[goobj2.BlkAutolib] = w.Offset() + for _, pkg := range ctxt.Imports { + w.StringRef(pkg) + } + // Package references h.Offsets[goobj2.BlkPkgIdx] = w.Offset() for _, pkg := range w.pkglist { @@ -172,13 +178,6 @@ func (w *writer) init() { for pkg, i := range w.ctxt.pkgIdx { w.pkglist[i] = pkg } - - // Also make sure imported packages appear in the list (even if no symbol is referenced). - for _, pkg := range w.ctxt.Imports { - if _, ok := w.ctxt.pkgIdx[pkg]; !ok { - w.pkglist = append(w.pkglist, pkg) - } - } } func (w *writer) StringTable() { diff --git a/src/cmd/link/internal/objfile/objfile2.go b/src/cmd/link/internal/objfile/objfile2.go index cc472954ab..00c996c341 100644 --- a/src/cmd/link/internal/objfile/objfile2.go +++ b/src/cmd/link/internal/objfile/objfile2.go @@ -366,11 +366,7 @@ func LoadNew(l *Loader, arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *s or := &oReader{r, unit, localSymVersion, pkgprefix} // Autolib - npkg := r.NPkg() - lib.ImportStrings = append(lib.ImportStrings, make([]string, npkg-1)...)[:len(lib.ImportStrings)] - for i := 1; i < npkg; i++ { - lib.ImportStrings = append(lib.ImportStrings, r.Pkg(i)) - } + lib.ImportStrings = append(lib.ImportStrings, r.Autolib()...) // DWARF file table nfile := r.NDwarfFile() -- 2.48.1