aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/obj')
-rw-r--r--src/cmd/internal/obj/line.go5
-rw-r--r--src/cmd/internal/obj/link.go5
-rw-r--r--src/cmd/internal/obj/objfile.go5
-rw-r--r--src/cmd/internal/obj/objfile2.go14
-rw-r--r--src/cmd/internal/obj/sym.go10
5 files changed, 29 insertions, 10 deletions
diff --git a/src/cmd/internal/obj/line.go b/src/cmd/internal/obj/line.go
index fecf90c491..79ecb0068f 100644
--- a/src/cmd/internal/obj/line.go
+++ b/src/cmd/internal/obj/line.go
@@ -5,12 +5,13 @@
package obj
import (
+ "cmd/internal/goobj2"
"cmd/internal/src"
)
// AddImport adds a package to the list of imported packages.
-func (ctxt *Link) AddImport(pkg string) {
- ctxt.Imports = append(ctxt.Imports, pkg)
+func (ctxt *Link) AddImport(pkg string, fingerprint goobj2.FingerprintType) {
+ ctxt.Imports = append(ctxt.Imports, goobj2.ImportedPkg{Pkg: pkg, Fingerprint: fingerprint})
}
func linkgetlineFromPos(ctxt *Link, xpos src.XPos) (f string, l int32) {
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go
index 046ad53ac7..e6f917dedb 100644
--- a/src/cmd/internal/obj/link.go
+++ b/src/cmd/internal/obj/link.go
@@ -33,6 +33,7 @@ package obj
import (
"bufio"
"cmd/internal/dwarf"
+ "cmd/internal/goobj2"
"cmd/internal/objabi"
"cmd/internal/src"
"cmd/internal/sys"
@@ -666,7 +667,7 @@ type Link struct {
PosTable src.PosTable
InlTree InlTree // global inlining tree used by gc/inl.go
DwFixups *DwarfFixupTable
- Imports []string
+ Imports []goobj2.ImportedPkg
DiagFunc func(string, ...interface{})
DiagFlush func()
DebugInfo func(fn *LSym, info *LSym, curfn interface{}) ([]dwarf.Scope, dwarf.InlCalls) // if non-nil, curfn is a *gc.Node
@@ -698,6 +699,8 @@ type Link struct {
defs []*LSym // list of defined symbols in the current package
nonpkgdefs []*LSym // list of defined non-package symbols
nonpkgrefs []*LSym // list of referenced non-package symbols
+
+ Fingerprint goobj2.FingerprintType // fingerprint of symbol indices, to catch index mismatch
}
func (ctxt *Link) Diag(format string, args ...interface{}) {
diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go
index 2b0c45d6b2..6d7f42ed0b 100644
--- a/src/cmd/internal/obj/objfile.go
+++ b/src/cmd/internal/obj/objfile.go
@@ -98,8 +98,9 @@ func WriteObjFile(ctxt *Link, bout *bio.Writer, pkgpath string) {
w.wr.WriteByte(1)
// Autolib
- for _, pkg := range ctxt.Imports {
- w.writeString(pkg)
+ for _, p := range ctxt.Imports {
+ w.writeString(p.Pkg)
+ // This object format ignores p.Fingerprint.
}
w.writeString("")
diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go
index 9792ef0846..061e43c434 100644
--- a/src/cmd/internal/obj/objfile2.go
+++ b/src/cmd/internal/obj/objfile2.go
@@ -38,7 +38,11 @@ func WriteObjFile2(ctxt *Link, b *bio.Writer, pkgpath string) {
if ctxt.Flag_shared {
flags |= goobj2.ObjFlagShared
}
- h := goobj2.Header{Magic: goobj2.Magic, Flags: flags}
+ h := goobj2.Header{
+ Magic: goobj2.Magic,
+ Fingerprint: ctxt.Fingerprint,
+ Flags: flags,
+ }
h.Write(w.Writer)
// String table
@@ -46,8 +50,8 @@ func WriteObjFile2(ctxt *Link, b *bio.Writer, pkgpath string) {
// Autolib
h.Offsets[goobj2.BlkAutolib] = w.Offset()
- for _, pkg := range ctxt.Imports {
- w.StringRef(pkg)
+ for i := range ctxt.Imports {
+ ctxt.Imports[i].Write(w.Writer)
}
// Package references
@@ -180,8 +184,8 @@ func (w *writer) init() {
func (w *writer) StringTable() {
w.AddString("")
- for _, pkg := range w.ctxt.Imports {
- w.AddString(pkg)
+ for _, p := range w.ctxt.Imports {
+ w.AddString(p.Pkg)
}
for _, pkg := range w.pkglist {
w.AddString(pkg)
diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go
index 03ce8ddc5a..4a8b0ebb6f 100644
--- a/src/cmd/internal/obj/sym.go
+++ b/src/cmd/internal/obj/sym.go
@@ -34,6 +34,7 @@ package obj
import (
"cmd/internal/goobj2"
"cmd/internal/objabi"
+ "crypto/md5"
"fmt"
"log"
"math"
@@ -241,6 +242,15 @@ func (ctxt *Link) NumberSyms(asm bool) {
ctxt.pkgIdx[pkg] = ipkg
ipkg++
})
+
+ // Compute a fingerprint of the indices, for exporting.
+ if !asm {
+ h := md5.New()
+ for _, s := range ctxt.defs {
+ h.Write([]byte(s.Name))
+ }
+ copy(ctxt.Fingerprint[:], h.Sum(nil)[:])
+ }
}
// Returns whether s is a non-package symbol, which needs to be referenced