你使用的Go版本是什么( go version
)?
$ go version
go version go1.16.7 android/arm64
这个问题在最新版本中是否会重现?
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="/data/data/com.termux/files/home/.cache/go-build"
GOENV="/data/data/com.termux/files/home/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="android"
GOINSECURE=""
GOMODCACHE="/data/data/com.termux/files/home/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="android"
GOPATH="/data/data/com.termux/files/home/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/data/data/com.termux/files/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/data/data/com.termux/files/usr/lib/go/pkg/tool/android_arm64"
GOVCS=""
GOVERSION="go1.16.7"
GCCGO="gccgo"
AR="ar"
CC="aarch64-linux-android-clang"
CXX="aarch64-linux-android-clang++"
CGO_ENABLED="1"
GOMOD="/data/data/com.termux/files/home/Applications/go/src/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/data/data/com.termux/files/usr/tmp/go-build2204854682=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
./make.bash
你期望看到什么?
Installed Go for android/arm64 in /data/data/com.termux/files/home/Applications/go
Installed commands in /data/data/com.termux/files/home/Applications/go/bin
你看到了什么?
Building Go cmd/dist using /data/data/com.termux/files/usr/lib/go. (go1.16.7 android/arm64)
Building Go toolchain1 using /data/data/com.termux/files/usr/lib/go.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
Building Go toolchain2 using go_bootstrap and Go toolchain1.
Building Go toolchain3 using go_bootstrap and Go toolchain2.
Building packages and commands for android/arm64.
# runtime/cgo
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
/data/data/com.termux/files/usr/bin/ld: cannot find -llog
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
go tool dist: FAILED: /data/data/com.termux/files/home/Applications/go/pkg/tool/android_arm64/go_bootstrap install -gcflags=all= -ldflags=all= std cmd: exit status 2
7条答案
按热度按时间s3fp2yjn1#
这看起来像是Android链接器
/data/data/com.termux/files/usr/bin/ld
在读取Android库/system/lib64/liblog.so
时出现的问题。我不知道Termux是什么,但如果问题是Android链接器无法读取Android库,我认为我们不能在Go中解决这个问题。Go 1.16是否有效?它在runtime/cgo包中有与
-llog
相同的使用。这种使用是在Go 1.4中添加的。xzlaal3s2#
我的天啊。你是对的。这是Android 12开发者预览4中的一个回归问题。这里有一个
neofetch
。Termux是一个为Android设计的终端模拟器:https://github.com/termux/termux-app
谷歌长期以来一直在努力禁止执行任意代码,看起来他们终于翻转了开关。这里是来自Termux的最新更新
由于在Android上构建Go将不再可能,它是否会从Go的支持中被删除,还是Go将继续支持到Android 11?
hjzp0vay3#
CC @hyangah 查看一下
o7jaxewo4#
Go支持并可能会继续支持Android作为目标平台。
据我所知,Android主要不是一个开发者平台,大多数Android开发者并不在Android上构建。我也不确定是否有一个“标准”的开发环境。据我所知,在Android上构建并不是真正官方支持和测试的。
lkaoscv75#
在go/src/internal/testenv/testenv.go文件的第37行到第49行,我们可以看到以下代码:
这段代码定义了一个名为
funcHasGoBuild()
的函数,该函数返回一个布尔值。函数首先检查环境变量GO_GCFLAGS
是否为空,如果不为空,则返回false
,表示无法运行go build
命令。接下来,函数根据不同的操作系统(如Android、JS和iOS)返回相应的布尔值。最后,如果没有满足上述条件的情况,函数返回true
。omtl5h9j6#
-llog标志来自为termux交叉编译的golang。如果你想在termux中编译golang并能够成功使用它,你可能需要应用termux应用的all three patches。
由于在Android上构建Go将不再可能,它是否会从Go的支持中被删除,还是Go将继续支持Android 11?
潜在的问题/缺点只发生在针对Android 11或更新版本的应用上。目前(以及可能在可预见的未来)termux的目标是Android 10。这对目前来说没问题,只是应用程序不允许通过playstore进行更新(并且会在某个时候被移除)。
golang本身无法与android >= 11兼容,因为问题在于一个应用程序(如termux)运行golang("
exec()
s"),而不是golang本身。理论上,应该可以创建一个允许您在android >= 11上使用golang编译代码的android应用程序,但您将无法运行任何生成的二进制文件。moiiocjp7#
只有
src-runtime-cgo-cgo.go.patch
和src-runtime-cgo-gcc_android.c.patch
对我有效,但我能够构建go1.17
。go env
输出git diff
输出