在Android下,共享库中的Go代码无法读取环境变量,

imzjd6km  于 10个月前  发布在  Go
关注(0)|答案(4)|浏览(104)

你使用的Go版本是什么( go version )?

  1. $ go version
  2. go version go1.20.3 android/arm64

这个问题在最新版本中是否重现?

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

  1. $ go env
  2. GO111MODULE=""
  3. GOARCH="arm64"
  4. GOBIN=""
  5. GOCACHE="/data/data/com.termux/files/home/.cache/go-build"
  6. GOENV="/data/data/com.termux/files/home/.config/go/env"
  7. GOEXE=""
  8. GOEXPERIMENT=""
  9. GOFLAGS=""
  10. GOHOSTARCH="arm64"
  11. GOHOSTOS="android"
  12. GOINSECURE=""
  13. GOMODCACHE="/data/data/com.termux/files/home/go/pkg/mod"
  14. GONOPROXY=""
  15. GONOSUMDB=""
  16. GOOS="android"
  17. GOPATH="/data/data/com.termux/files/home/go"
  18. GOPRIVATE=""
  19. GOPROXY="https://proxy.golang.org,direct"
  20. GOROOT="/data/data/com.termux/files/usr/lib/go"
  21. GOSUMDB="sum.golang.org"
  22. GOTMPDIR=""
  23. GOTOOLDIR="/data/data/com.termux/files/usr/lib/go/pkg/tool/android_arm64"
  24. GOVCS=""
  25. GOVERSION="go1.20.3"
  26. GCCGO="gccgo"
  27. AR="ar"
  28. CC="aarch64-linux-android-clang"
  29. CXX="aarch64-linux-android-clang++"
  30. CGO_ENABLED="1"
  31. GOMOD="/dev/null"
  32. GOWORK=""
  33. CGO_CFLAGS="-O2 -g"
  34. CGO_CPPFLAGS=""
  35. CGO_CXXFLAGS="-O2 -g"
  36. CGO_FFLAGS="-O2 -g"
  37. CGO_LDFLAGS="-O2 -g"
  38. PKG_CONFIG="pkg-config"
  39. GOGCCFLAGS="-fPIC -pthread -fno-caret-diagnostics -Qunused-arguments -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/data/data/com.termux/files/usr/tmp/go-build3459929408=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

我编写了一个名为Foo()的Go函数,它调用os.UserConfigDir()并打印结果或错误。通过CGO将Foo()函数导出到共享库,然后在c程序中调用它。

  1. ~/issue $ ls -R
  2. .:
  3. foo.c test
  4. ./test:
  5. go.mod test.go
  6. ~/issue $ cat foo.c
  7. #include
  8. #include
  9. #include
  10. #include
  11. int main() {
  12. // Call the Foo() function and print the result
  13. char* result = Foo();
  14. printf("Result: %s\n", result);
  15. return 0;
  16. }
  17. ~/issue $ cat test/test.go
  18. package main
  19. import (
  20. "C"
  21. "os"
  22. )
  23. func main() {
  24. }
  25. //export Foo
  26. func Foo() *C.char{
  27. dir, err := os.UserConfigDir()
  28. if err != nil {
  29. return C.CString(err.Error())
  30. }
  31. return C.CString(dir)
  32. }
  33. ~/issue $ cat test/go.mod
  34. module mytest
  35. go 1.20
  36. ~/issue $ cd test
  37. ~/issue/test $ go build -v -buildmode=c-shared -o libtest.so
  38. runtime/cgo
  39. mytest
  40. ~/issue/test $ cd ../
  41. ~/issue $ cc foo.c -I./test -L./test -ltest
  42. ~/issue $ LD_LIBRARY_PATH=./test ./a.out
  43. Result: neither $XDG_CONFIG_HOME nor $HOME are defined

你期望看到什么?

  1. $ LD_LIBRARY_PATH=./test ./a.out
  2. /data/data/com.termux/files/home/.config

你实际看到了什么?

  1. $ LD_LIBRARY_PATH=./test ./a.out
  2. Result: neither $XDG_CONFIG_HOME nor $HOME are defined
jbose2ul

jbose2ul1#

CC @golang/android。

pgvzfuti

pgvzfuti2#

相同的代码在Linux和Mac下运行正常。

4dc9hkyq

4dc9hkyq3#

A Go共享库使用-buildmode=c-shared构建,依赖动态链接器支持获取命令行参数和环境变量。可能Android动态链接器不支持这一点。这基本上与#13492的问题相同。

hts6caw3

hts6caw34#

不确定go build是否使用与c相同的链接器。但我确实在c中编写了一个类似的共享库,该库的代码也在库中读取环境变量,在Android下运行正常。

相关问题