diff options
Diffstat (limited to 'src/internal/pkgbits')
| -rw-r--r-- | src/internal/pkgbits/decoder.go | 10 | ||||
| -rw-r--r-- | src/internal/pkgbits/encoder.go | 12 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/internal/pkgbits/decoder.go b/src/internal/pkgbits/decoder.go index 9c8ad446ca..5b4e8f69af 100644 --- a/src/internal/pkgbits/decoder.go +++ b/src/internal/pkgbits/decoder.go @@ -22,7 +22,7 @@ type PkgDecoder struct { elemEndsEnds [numRelocs]uint32 elemEnds []uint32 - elemData string + elemData string // last 8 bytes are fingerprint } func (pr *PkgDecoder) PkgPath() string { return pr.pkgPath } @@ -50,7 +50,7 @@ func NewPkgDecoder(pkgPath, input string) PkgDecoder { 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 } @@ -67,6 +67,12 @@ func (pr *PkgDecoder) TotalElems() int { 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 { diff --git a/src/internal/pkgbits/encoder.go b/src/internal/pkgbits/encoder.go index 820c707940..4780f01c39 100644 --- a/src/internal/pkgbits/encoder.go +++ b/src/internal/pkgbits/encoder.go @@ -8,6 +8,7 @@ package pkgbits import ( "bytes" + "crypto/md5" "encoding/binary" "go/constant" "io" @@ -30,7 +31,10 @@ func NewPkgEncoder(syncFrames int) PkgEncoder { } } -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) } @@ -57,6 +61,12 @@ func (pw *PkgEncoder) DumpTo(out io.Writer) { assert(err == nil) } } + + copy(fingerprint[:], h.Sum(nil)) + _, err := out0.Write(fingerprint[:]) + assert(err == nil) + + return } func (pw *PkgEncoder) StringIdx(s string) int { |
