Go: скомпилировать в статический двоичный файл с помощью PIE

#go

#Вперед

Вопрос:

Я хочу создать двоичный файл, который может выполняться в среде без привязки, но также и там, где доступен компоновщик, но требуется круговой.

Закрытие, которое я получил, заключается в том, что компоновщик заявляет, что он статически связан, но «файл» по-прежнему говорит, что это динамический двоичный файл.

Есть ли какой-либо способ получить двоичный файл, который не имеет внешней зависимости от компоновщика и не является общим объектом 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
  

Ответ №1:

Решил это:

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