Commit 06da8fd8 authored by Michael Hudson-Doyle's avatar Michael Hudson-Doyle Committed by Ian Lance Taylor

cmd/link: only embed runtime.goarm in the module that contains the runtime package

And do it properly so freebsd and nacl still work.

Change-Id: I6f9f30e93ceae6dee59215ed608c6a158bdbdbb0
Reviewed-on: https://go-review.googlesource.com/14280
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
parent dac87e9e
...@@ -169,10 +169,4 @@ func archinit() { ...@@ -169,10 +169,4 @@ func archinit() {
if ld.INITDAT != 0 && ld.INITRND != 0 { if ld.INITDAT != 0 && ld.INITRND != 0 {
fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND)) fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
} }
// embed goarm to runtime.goarm
s := ld.Linklookup(ld.Ctxt, "runtime.goarm", 0)
s.Type = obj.SRODATA
ld.Adduint8(ld.Ctxt, s, uint8(ld.Ctxt.Goarm))
} }
...@@ -558,19 +558,31 @@ func loadlib() { ...@@ -558,19 +558,31 @@ func loadlib() {
Ctxt.Tlsg = tlsg Ctxt.Tlsg = tlsg
moduledata := Linklookup(Ctxt, "runtime.firstmoduledata", 0) moduledata := Linklookup(Ctxt, "runtime.firstmoduledata", 0)
if moduledata.Type == 0 || moduledata.Type == obj.SDYNIMPORT { if moduledata.Type != 0 && moduledata.Type != obj.SDYNIMPORT {
// If the module we are linking does not define the // If the module (toolchain-speak for "executable or shared
// runtime.firstmoduledata symbol, create a local symbol for // library") we are linking contains the runtime package, it
// the moduledata. // will define the runtime.firstmoduledata symbol and we
// truncate it back to 0 bytes so we can define its entire
// contents in symtab.go:symtab().
moduledata.Size = 0
// In addition, on ARM, the runtime depends on the linker
// recording the value of GOARM.
if Thearch.Thechar == '5' {
s := Linklookup(Ctxt, "runtime.goarm", 0)
s.Type = obj.SRODATA
s.Size = 0
Adduint8(Ctxt, s, uint8(Ctxt.Goarm))
}
} else {
// If OTOH the module does not contain the runtime package,
// create a local symbol for the moduledata.
moduledata = Linklookup(Ctxt, "local.moduledata", 0) moduledata = Linklookup(Ctxt, "local.moduledata", 0)
moduledata.Local = true moduledata.Local = true
} else {
// If OTOH the module does define the symbol, we truncate the
// symbol back to 0 bytes so we can define its entire
// contents.
moduledata.Size = 0
} }
// Either way we mark it as noptrdata to hide it from the GC. // In all cases way we mark the moduledata as noptrdata to hide it from
// the GC.
moduledata.Type = obj.SNOPTRDATA moduledata.Type = obj.SNOPTRDATA
moduledata.Reachable = true moduledata.Reachable = true
Ctxt.Moduledata = moduledata Ctxt.Moduledata = moduledata
......
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