Commit 0de359da authored by Michael Hudson-Doyle's avatar Michael Hudson-Doyle Committed by Ian Lance Taylor

cmd/internal/gc: directly produce importpath of package being compiled

Relying on an importing package being linked at the same time as the
imported package does not work in the shared library world.

This also lets us remove some obscure code from the linker.

Change-Id: I57cd5447b42a1a6129b02951d44efffb10cf64be
Reviewed-on: https://go-review.googlesource.com/7797Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent 8d267b9b
...@@ -472,12 +472,25 @@ func dimportpath(p *Pkg) { ...@@ -472,12 +472,25 @@ func dimportpath(p *Pkg) {
return return
} }
// If we are compiling the runtime package, there are two runtime packages around
// -- localpkg and Runtimepkg. We don't want to produce import path symbols for
// both of them, so just produce one for localpkg.
if myimportpath == "runtime" && p == Runtimepkg {
return
}
if dimportpath_gopkg == nil { if dimportpath_gopkg == nil {
dimportpath_gopkg = mkpkg("go") dimportpath_gopkg = mkpkg("go")
dimportpath_gopkg.Name = "go" dimportpath_gopkg.Name = "go"
} }
nam := "importpath." + p.Prefix + "." var nam string
if p == localpkg {
// Note: myimportpath != "", or else dgopkgpath won't call dimportpath.
nam = "importpath." + pathtoprefix(myimportpath) + "."
} else {
nam = "importpath." + p.Prefix + "."
}
n := Nod(ONAME, nil, nil) n := Nod(ONAME, nil, nil)
n.Sym = Pkglookup(nam, dimportpath_gopkg) n.Sym = Pkglookup(nam, dimportpath_gopkg)
...@@ -495,10 +508,11 @@ func dgopkgpath(s *Sym, ot int, pkg *Pkg) int { ...@@ -495,10 +508,11 @@ func dgopkgpath(s *Sym, ot int, pkg *Pkg) int {
return dgostringptr(s, ot, "") return dgostringptr(s, ot, "")
} }
// Emit reference to go.importpath.""., which 6l will if pkg == localpkg && myimportpath == "" {
// rewrite using the correct import path. Every package // If we don't know the full path of the package being compiled (i.e. -p
// that imports this one directly defines the symbol. // was not passed on the compiler command line), emit reference to
if pkg == localpkg { // go.importpath.""., which 6l will rewrite using the correct import path.
// Every package that imports this one directly defines the symbol.
var ns *Sym var ns *Sym
if ns == nil { if ns == nil {
......
...@@ -379,24 +379,6 @@ func loadlib() { ...@@ -379,24 +379,6 @@ func loadlib() {
if i < len(Ctxt.Library) { if i < len(Ctxt.Library) {
objfile(Ctxt.Library[i].File, Ctxt.Library[i].Pkg) objfile(Ctxt.Library[i].File, Ctxt.Library[i].Pkg)
} }
// Pretend that we really imported the package.
s := Linklookup(Ctxt, "go.importpath.runtime/cgo.", 0)
s.Type = SDATA
s.Dupok = 1
s.Reachable = true
// Provided by the code that imports the package.
// Since we are simulating the import, we have to provide this string.
cgostrsym := "go.string.\"runtime/cgo\""
if Linkrlookup(Ctxt, cgostrsym, 0) == nil {
s := Linklookup(Ctxt, cgostrsym, 0)
s.Type = SRODATA
s.Reachable = true
addstrdata(cgostrsym, "runtime/cgo")
}
} }
if Linkmode == LinkInternal { if Linkmode == LinkInternal {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment