Как CGO_ENABLED влияет на динамическое c и статическое c связывание? - PullRequest
2 голосов
/ 09 июля 2020

Мы компилируем наш код Go для запуска на docker, и мы выясняли, почему наш двоичный файл не выполняется. Мы обнаружили, что в нем не хватает некоторых динамических c библиотек (хотя нам нужны статически связанные двоичные файлы).

Вот как он был скомпилирован.

env GOOS=linux CGO_ENABLED=1 GO111MODULE=on GOPRIVATE=github.com/ourrepo GOPROXY=https://proxy.golang.org go build --installsuffix cgo --ldflags='-extldflags=-static' -o program main.go

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

Теперь странно то, что у нас есть другая программа, которая использует та же команда сборки , на этот раз с CGO_ENABLED=1 и ... она статически связана!

Поэтому меня очень смущает, почему в некоторых случаях CGO_ENABLED=1 производит динамическое связывание c, а иногда stati c ссылка. Рад предоставить более подробную информацию.

1 Ответ

1 голос
/ 09 июля 2020

Некоторые пакеты Go используют CGO под капотом, используя (очень) общие C библиотеки для более широкой совместимости между средами и крайними случаями, встречающимися во время выполнения.

Эти общие библиотеки являются найдены в большинстве основных дистрибутивов ОС, но, очевидно, не включены в образ Scratch (который по своей природе полностью пустой).

CGO_ENABLED установлен в 1 по умолчанию, что означает, что он должен быть явно отключен с помощью CGO_ENABLED=0, чтобы избежать этого, даже при использовании флага -static.

...