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",
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
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"
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
+ }
}
}
}
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