交叉编译时动态链接的 Go 程序

Dynamic linked Go program when cross compile

提问人:user1929999 提问时间:10/14/2023 更新时间:10/15/2023 访问量:74

问:

如何交叉编译 Go 程序并仍然保留链接到 libc 的动态?

上下文:编译主机为 macOS M1,目标是 Linux amd64。结果是静态链接的。但是我仍然希望有动态链接,尤其是 libc 部分具有LD_PRELOAD能力)。default

尝试像这样强制动态链接

❯ CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build -o main cmd/server/main.go

# runtime/cgo
linux_syscall.c:67:13: error: call to undeclared function 'setresgid'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
linux_syscall.c:67:13: note: did you mean 'setregid'?
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/unistd.h:593:6: note: 'setregid' declared here
linux_syscall.c:73:13: error: call to undeclared function 'setresuid'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
linux_syscall.c:73:13: note: did you mean 'setreuid'?
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/unistd.h:595:6: note: 'setreuid' declared here

有什么建议可以解决这个问题吗?非常感谢

go cgo ld-预加载

评论


答:

2赞 Kalis 10/15/2023 #1

根据文档:将 cgo 与 go 命令一起使用

指定 GOOS 和 GOARCH 是不够的,您还需要指定 CC_FOR_TARGET 或 CC_FOR_${GOOS}_${GOARCH}。 检查这个:

交叉编译时,必须指定 C 交叉编译器供 cgo 使用。为此,您可以在使用 make.bash 构建工具链时设置通用CC_FOR_TARGET或更具体的 CC_FOR_${GOOS}_${GOARCH}(例如 CC_FOR_linux_arm)环境变量,也可以在运行 go 工具时随时设置 CC 环境变量。

0赞 user1929999 10/15/2023 #2

感谢@Kalis建议。我错过的是交叉编译器。

  1. 安装交叉编译器 gcc
brew tap SergioBenitez/osxct
brew install x86_64-unknown-linux-gnu

来源:https://github.com/SergioBenitez/homebrew-osxct 另一个来源:https://github.com/messense/homebrew-macos-cross-toolchains(尚未测试)。

  1. 编译时提供抄送
❯ CC=x86_64-unknown-linux-gnu-gcc CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build main.go