}
// 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
// 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
//
// Blocks
const (
- BlkPkgIdx = iota
+ BlkAutolib = iota
+ BlkPkgIdx
BlkDwarfFile
BlkSymdef
BlkNonpkgdef
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)
// 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 {
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() {
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()