Go:使用PIE编译为静态二进制文件



我希望创建一个二进制文件,它可以在没有链接的环境中执行,但也可以在有链接器但需要PIE的环境中运行。

我得到的闭包是链接器声明它是静态链接的,但"文件"仍然表示它是动态二进制文件。

有没有任何方法可以获得一个对链接器没有外部依赖并且不是LSB共享对象的二进制文件?

go1.15.2示例:

% echo "package main;import "fmt";func main() {fmt.Println("Simple Example")}" > main.go
% GOOS=linux go build  -ldflags "-linkmode=internal -s -w" -buildmode=pie -o mainProc main.go
% ldd mainProc
statically linked
% file mainProc
mainProc: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=8mM4GRs9zxgrVjDRg2Ch/efne9QJbJLpmKT6hRtJm/JWUYVr1m9OhJoV0v1uwq/1IZdDT8CvBOOywiI8eQq, stripped

解决了它:

go build  -ldflags '-linkmode external -s -w -extldflags "--static-pie"' -buildmode=pie -tags 'osusergo,netgo,static_build' -o /hello hello.go