// linux-arm64 is missing because it causes the external linker
// to crash, see https://golang.org/issue/17138
switch pair {
- case "linux-386", "linux-amd64", "linux-arm", "linux-s390x":
+ case "linux-386", "linux-amd64", "linux-arm", "linux-s390x", "linux-ppc64le":
return true
case "darwin-amd64":
return true
codegenArg = "-fPIC"
} else {
switch platform {
- case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x",
+ case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x", "linux/ppc64le",
"android/amd64", "android/arm", "android/arm64", "android/386":
case "darwin/amd64":
// Skip DWARF generation due to #21647
switch objabi.GOOS {
case "linux":
switch objabi.GOARCH {
- case "386", "amd64", "arm", "arm64", "s390x":
+ case "386", "amd64", "arm", "arm64", "s390x", "ppc64le":
default:
return badmode()
}
if !ctxt.Loaded {
panic("DynlinkingGo called before all symbols loaded")
}
- canUsePlugins := ctxt.Syms.ROLookup("plugin.Open", 0) != nil
- return Buildmode == BuildmodeShared || *FlagLinkshared || Buildmode == BuildmodePlugin || canUsePlugins
+ return Buildmode == BuildmodeShared || *FlagLinkshared || Buildmode == BuildmodePlugin || ctxt.CanUsePlugins()
+}
+
+// CanUsePlugins returns whether a plugins can be used
+func (ctxt *Link) CanUsePlugins() bool {
+ return ctxt.Syms.ROLookup("plugin.Open", 0) != nil
}
// UseRelro returns whether to make use of "read only relocations" aka
func genaddmoduledata(ctxt *ld.Link) {
addmoduledata := ctxt.Syms.ROLookup("runtime.addmoduledata", 0)
- if addmoduledata.Type == ld.STEXT {
+ if addmoduledata.Type == ld.STEXT && ld.Buildmode != ld.BuildmodePlugin {
return
}
addmoduledata.Attr |= ld.AttrReachable
rel.Off = int32(initfunc.Size)
rel.Siz = 8
rel.Sym = ctxt.Syms.Lookup(".TOC.", 0)
+ rel.Sym.Attr |= ld.AttrReachable
rel.Type = objabi.R_ADDRPOWER_PCREL
o(0x3c4c0000)
// addi r2, r2, .TOC.-func@l
rel = ld.Addrel(initfunc)
rel.Off = int32(initfunc.Size)
rel.Siz = 8
- rel.Sym = ctxt.Syms.Lookup("local.moduledata", 0)
+ if !ctxt.CanUsePlugins() {
+ rel.Sym = ctxt.Syms.Lookup("local.moduledata", 0)
+ } else {
+ rel.Sym = ctxt.Syms.Lookup("runtime.firstmoduledata", 0)
+ }
+ rel.Sym.Attr |= ld.AttrReachable
+ rel.Sym.Attr |= ld.AttrLocal
rel.Type = objabi.R_ADDRPOWER_GOT
o(0x3c620000)
// ld r3, local.moduledata@got@l(r3)
// blr
o(0x4e800020)
+ if ld.Buildmode == ld.BuildmodePlugin {
+ ctxt.Textp = append(ctxt.Textp, addmoduledata)
+ }
initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
ctxt.Textp = append(ctxt.Textp, initfunc)
initarray_entry.Attr |= ld.AttrReachable