From: Than McIntosh Date: Thu, 2 Apr 2020 11:47:12 +0000 (-0400) Subject: [dev.link] cmd/link: convert gentext for S390 X-Git-Tag: go1.15beta1~556^2^2~34 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=587faf67d7e62c4f844cd2d1a8af3dd6ea7c3555;p=gostls13.git [dev.link] cmd/link: convert gentext for S390 Convert the gentext() hooks for the S390 architecture (requires generation of relocation variants). Change-Id: I468957eb9f909fb4e371ea4fcf7b52bbed22b755 Reviewed-on: https://go-review.googlesource.com/c/go/+/227019 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 7750da21cd..5d55a19072 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -51,59 +51,28 @@ import ( // undef // // The job of appending the moduledata is delegated to runtime.addmoduledata. -func gentext(ctxt *ld.Link) { - if !ctxt.DynlinkingGo() { +func gentext2(ctxt *ld.Link, ldr *loader.Loader) { + initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) + if initfunc == nil { return } - addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0) - if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin { - // we're linking a module containing the runtime -> no need for - // an init function - return - } - addmoduledata.Attr |= sym.AttrReachable - initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0) - initfunc.Type = sym.STEXT - initfunc.Attr |= sym.AttrLocal - initfunc.Attr |= sym.AttrReachable // larl %r2, initfunc.AddUint8(0xc0) initfunc.AddUint8(0x20) - lmd := initfunc.AddRel() - lmd.InitExt() - lmd.Off = int32(initfunc.Size) - lmd.Siz = 4 - lmd.Sym = ctxt.Moduledata - lmd.Type = objabi.R_PCREL - lmd.Variant = sym.RV_390_DBL - lmd.Add = 2 + int64(lmd.Siz) - initfunc.AddUint32(ctxt.Arch, 0) + initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata2, 6, objabi.R_PCREL, 4) + r1 := initfunc.Relocs() + ldr.SetRelocVariant(initfunc.Sym(), r1.Count()-1, sym.RV_390_DBL) // jg initfunc.AddUint8(0xc0) initfunc.AddUint8(0xf4) - rel := initfunc.AddRel() - rel.InitExt() - rel.Off = int32(initfunc.Size) - rel.Siz = 4 - rel.Sym = ctxt.Syms.Lookup("runtime.addmoduledata", 0) - rel.Type = objabi.R_CALL - rel.Variant = sym.RV_390_DBL - rel.Add = 2 + int64(rel.Siz) - initfunc.AddUint32(ctxt.Arch, 0) + initfunc.AddSymRef(ctxt.Arch, addmoduledata, 6, objabi.R_CALL, 4) + r2 := initfunc.Relocs() + ldr.SetRelocVariant(initfunc.Sym(), r2.Count()-1, sym.RV_390_DBL) // undef (for debugging) initfunc.AddUint32(ctxt.Arch, 0) - if ctxt.BuildMode == ld.BuildModePlugin { - ctxt.Textp = append(ctxt.Textp, addmoduledata) - } - ctxt.Textp = append(ctxt.Textp, initfunc) - initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0) - initarray_entry.Attr |= sym.AttrLocal - initarray_entry.Attr |= sym.AttrReachable - initarray_entry.Type = sym.SINITARR - initarray_entry.AddAddr(ctxt.Arch, initfunc) } func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool { diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 3454476b0f..e463c5e727 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -54,7 +54,7 @@ func Init() (*sys.Arch, ld.Arch) { Asmb2: asmb2, // in asm.go Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext: gentext, + Gentext2: gentext2, Machoreloc1: machoreloc1, Linuxdynld: "/lib64/ld64.so.1",