go/build/constraint, go/doc, go/parser, internal/buildcfg, internal/goroot, internal/goversion
< go/build;
- DEBUG, go/build, go/types, text/scanner
- < internal/pkgbits
- < go/internal/gcimporter, go/internal/gccgoimporter, go/internal/srcimporter
- < go/importer;
-
# databases
FMT
< database/sql/internal
# crypto-aware packages
+ CRYPTO, DEBUG, go/build, go/types, text/scanner
+ < internal/pkgbits
+ < go/internal/gcimporter, go/internal/gccgoimporter, go/internal/srcimporter
+ < go/importer;
+
NET, crypto/rand, mime/quotedprintable
< mime/multipart;
elemEndsEnds [numRelocs]uint32
elemEnds []uint32
- elemData string
+ elemData string // last 8 bytes are fingerprint
}
func (pr *PkgDecoder) PkgPath() string { return pr.pkgPath }
assert(err == nil)
pr.elemData = input[pos:]
- assert(len(pr.elemData) == int(pr.elemEnds[len(pr.elemEnds)-1]))
+ assert(len(pr.elemData)-8 == int(pr.elemEnds[len(pr.elemEnds)-1]))
return pr
}
return len(pr.elemEnds)
}
+func (pr *PkgDecoder) Fingerprint() [8]byte {
+ var fp [8]byte
+ copy(fp[:], pr.elemData[len(pr.elemData)-8:])
+ return fp
+}
+
func (pr *PkgDecoder) AbsIdx(k RelocKind, idx int) int {
absIdx := idx
if k > 0 {
import (
"bytes"
+ "crypto/md5"
"encoding/binary"
"go/constant"
"io"
}
}
-func (pw *PkgEncoder) DumpTo(out io.Writer) {
+func (pw *PkgEncoder) DumpTo(out0 io.Writer) (fingerprint [8]byte) {
+ h := md5.New()
+ out := io.MultiWriter(out0, h)
+
writeUint32 := func(x uint32) {
assert(binary.Write(out, binary.LittleEndian, x) == nil)
}
assert(err == nil)
}
}
+
+ copy(fingerprint[:], h.Sum(nil))
+ _, err := out0.Write(fingerprint[:])
+ assert(err == nil)
+
+ return
}
func (pw *PkgEncoder) StringIdx(s string) int {