]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: fix plugin on linux/arm64
authorCherry Zhang <cherryyz@google.com>
Fri, 27 Apr 2018 14:57:14 +0000 (10:57 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 27 Apr 2018 17:18:14 +0000 (17:18 +0000)
The init function and runtime.addmoduledata were not added when
building plugin, which caused the runtime could not find the
module.

Testplugin is still not enabled on linux/arm64
(https://go.googlesource.com/go/+/master/src/cmd/dist/test.go#948)
because the gold linker on the builder is too old, which fails
with an internal error (see issue #17138). I tested locally and
it passes.

Fixes #24940.
Updates #17138.

Change-Id: I26aebca6c38a3443af0949471fa12b6d550e8c6c
Reviewed-on: https://go-review.googlesource.com/109917
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/link/internal/arm64/asm.go

index 858363e45a9ba5114e434a1db536ab341a6a8ba2..0151fa7e0d64e73c280266daf4315e117356ac45 100644 (file)
@@ -46,7 +46,7 @@ func gentext(ctxt *ld.Link) {
                return
        }
        addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0)
-       if addmoduledata.Type == sym.STEXT {
+       if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin {
                // we're linking a module containing the runtime -> no need for
                // an init function
                return
@@ -72,7 +72,7 @@ func gentext(ctxt *ld.Link) {
        rel.Sym = ctxt.Moduledata
        rel.Type = objabi.R_ADDRARM64
 
-       // 8:   14000000        bl      0 <runtime.addmoduledata>
+       // 8:   14000000        b       0 <runtime.addmoduledata>
        //      8: R_AARCH64_CALL26     runtime.addmoduledata
        o(0x14000000)
        rel = initfunc.AddRel()
@@ -81,6 +81,9 @@ func gentext(ctxt *ld.Link) {
        rel.Sym = ctxt.Syms.Lookup("runtime.addmoduledata", 0)
        rel.Type = objabi.R_CALLARM64 // Really should be R_AARCH64_JUMP26 but doesn't seem to make any difference
 
+       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.AttrReachable