]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: default to internal linking for android/arm64
authorElias Naur <mail@eliasnaur.com>
Fri, 15 Nov 2019 23:30:19 +0000 (18:30 -0500)
committerElias Naur <mail@eliasnaur.com>
Wed, 26 Feb 2020 09:47:21 +0000 (09:47 +0000)
The bootstrapping process (make.bash) on all other platforms use
internal linking. This change brings android/arm64 in line, fixing the
scary warning on our self-hosted Corellium builders:

warning: unable to find runtime/cgo.a

The linkmode default is changed to internal for all Android programs,
but in practice that won't matter outside our builders: using Go with
Android apps requires buildmode=c-shared which uses linkmode external.

Fixes #31343
Updates #31819

Change-Id: I3b3ada5ed69a7989e6d8e5960bbebf5e1c22aada
Reviewed-on: https://go-review.googlesource.com/c/go/+/207299
Run-TryBot: Elias Naur <mail@eliasnaur.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/go/internal/load/pkg.go
src/cmd/internal/sys/supported.go
src/cmd/link/internal/arm64/obj.go
src/cmd/link/internal/ld/config.go
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ld/lib.go

index 369a79b7164d3779152b511d2b8c29808cd45ea9..3e5d1f40237085169b149ebac4c0c9f659f3c55e 100644 (file)
@@ -1871,7 +1871,9 @@ func externalLinkingForced(p *Package) bool {
        // Some targets must use external linking even inside GOROOT.
        switch cfg.BuildContext.GOOS {
        case "android":
-               return true
+               if cfg.BuildContext.GOARCH != "arm64" {
+                       return true
+               }
        case "darwin":
                switch cfg.BuildContext.GOARCH {
                case "arm", "arm64":
index 02f833e945e96e6acc3c05639489f2ffe1505d61..c8ab2181b524c669fc6d2af5e73de4326a583a6d 100644 (file)
@@ -35,7 +35,9 @@ func MSanSupported(goos, goarch string) bool {
 func MustLinkExternal(goos, goarch string) bool {
        switch goos {
        case "android":
-               return true
+               if goarch != "arm64" {
+                       return true
+               }
        case "darwin":
                if goarch == "arm" || goarch == "arm64" {
                        return true
index 13157be4325043490542252543d144e696b58063..4ed05c087a04ca89b3bcefa3bc6f6fe672e4ec33 100644 (file)
@@ -57,7 +57,8 @@ func Init() (*sys.Arch, ld.Arch) {
                Gentext:          gentext,
                Machoreloc1:      machoreloc1,
 
-               Linuxdynld: "/lib/ld-linux-aarch64.so.1",
+               Androiddynld: "/system/bin/linker64",
+               Linuxdynld:   "/lib/ld-linux-aarch64.so.1",
 
                Freebsddynld:   "/usr/libexec/ld-elf.so.1",
                Openbsddynld:   "/usr/libexec/ld.so",
index 86d8779512bd07b6c5a94e638aff5d48f564f610..1420a86fd1c559ec213ca96e61e563d9b6726137 100644 (file)
@@ -189,6 +189,9 @@ func mustLinkExternal(ctxt *Link) (res bool, reason string) {
        if iscgo && ctxt.Arch.InFamily(sys.MIPS64, sys.MIPS, sys.PPC64) {
                return true, objabi.GOARCH + " does not support internal cgo"
        }
+       if iscgo && objabi.GOOS == "android" {
+               return true, objabi.GOOS + " does not support internal cgo"
+       }
 
        // When the race flag is set, the LLVM tsan relocatable file is linked
        // into the final binary, which means external linking is required because
@@ -205,7 +208,7 @@ func mustLinkExternal(ctxt *Link) (res bool, reason string) {
                return true, "buildmode=c-shared"
        case BuildModePIE:
                switch objabi.GOOS + "/" + objabi.GOARCH {
-               case "linux/amd64", "linux/arm64":
+               case "linux/amd64", "linux/arm64", "android/arm64":
                default:
                        // Internal linking does not support TLS_IE.
                        return true, "buildmode=pie"
@@ -244,10 +247,16 @@ func determineLinkMode(ctxt *Link) {
                        ctxt.LinkMode = LinkExternal
                        via = "via GO_EXTLINK_ENABLED "
                default:
-                       if extNeeded || (iscgo && externalobj) {
+                       ctxt.LinkMode = LinkInternal
+                       switch {
+                       case extNeeded, iscgo && externalobj:
                                ctxt.LinkMode = LinkExternal
-                       } else {
-                               ctxt.LinkMode = LinkInternal
+                       case ctxt.BuildMode == BuildModePIE:
+                               // Android always use BuildModePIE, and needs internal linking for
+                               // bootstrapping.
+                               if objabi.GOOS != "android" || objabi.GOARCH != "arm64" {
+                                       ctxt.LinkMode = LinkExternal
+                               }
                        }
                }
        }
index 69cad383d0380967df40d216f61b32de4261240a..3ede5df170196469639e52d623f0f7d1f47721ef 100644 (file)
@@ -1851,7 +1851,14 @@ func Asmbelf(ctxt *Link, symo int64) {
                if interpreter == "" {
                        switch ctxt.HeadType {
                        case objabi.Hlinux:
-                               interpreter = thearch.Linuxdynld
+                               if objabi.GOOS == "android" {
+                                       interpreter = thearch.Androiddynld
+                                       if interpreter == "" {
+                                               Exitf("ELF interpreter not set")
+                                       }
+                               } else {
+                                       interpreter = thearch.Linuxdynld
+                               }
 
                        case objabi.Hfreebsd:
                                interpreter = thearch.Freebsddynld
index c2c08389001c108d7833c820655e419acc01d730..7c5877bfbd01a996afc4e0f492f043664a742a26 100644 (file)
@@ -101,6 +101,7 @@ type Arch struct {
        Minalign       int
        Dwarfregsp     int
        Dwarfreglr     int
+       Androiddynld   string
        Linuxdynld     string
        Freebsddynld   string
        Netbsddynld    string