Кажется, что среда выполнения Go имеет некоторые явные зависимости GNU lib c, о чем свидетельствуют ошибки ссылки:
Error relocating /usr/local/go/pkg/linux_amd64_dynlink/libstd.so: __libc_malloc: symbol not found
Error relocating /usr/local/go/pkg/linux_amd64_dynlink/libstd.so: __libc_realloc: symbol not found
Error relocating /usr/local/go/pkg/linux_amd64_dynlink/libstd.so: __libc_free: symbol not found
Error relocating /usr/local/go/pkg/linux_amd64_dynlink/libstd.so: main.main: symbol not found
Error relocating /usr/local/go/pkg/linux_amd64_dynlink/libstd.so: __libc_stack_end: symbol not found
Совместимость с облегченным glib c (установка пакета libc6-compat
) в этом случае, вероятно, этого не произойдет, так как он в основном добавляет заглушки, а некоторые функции glib c по-прежнему будут отсутствовать.
Попытка найти модуль Go, вызывающий сбой, выбирая в сборке Go кэш, следующий за go install -a -buildmode=shared -linkshared std
(объектные файлы в .cache/go-build
, ища зависимости glib c с grep -R libc
), выделялся один большой объектный файл. Список объектов с символами nm
показал, что это тот, который потребляет необходимые символы:
U __libc_free
U __libc_malloc
U __libc_realloc
U __libc_stack_end
Этот объект оказался race. go.
Поиск в Google показал, что совместимость с Alpine lib c действительно известная проблема для расы, документально подтвержденная здесь:
https://github.com/golang/go/issues/14481
К счастью, в билете упоминается несколько предложенных обходных путей, таких как сборка compiler-rt из исходного кода.