Skip to content

Custom binary compilation pains 😢 #1479

Open
@divine

Description

@divine

What happened?

Hello,

This is list of custom binary compilation pains that I've encountered. Let's go:

  1. build-static.sh should check go version >= 1.23.0 before even trying to compile:
go: github.com/dunglas/mercure/[email protected] requires go >= 1.23.0 (running go 1.22.9; GOTOOLCHAIN=local)
2025/04/02 23:54:48 [FATAL] exit status 1
  1. cgo: #cgo nocallback disabled until Go 1.23 ?
2025/04/02 23:00:30 [INFO] Build environment ready
2025/04/02 23:00:30 [INFO] Building Caddy
2025/04/02 23:00:30 [INFO] exec (timeout=0s): /usr/bin/go mod tidy -e
2025/04/02 23:00:30 [INFO] exec (timeout=0s): /usr/bin/go build -o /root/frankenphp/dist/frankenphp-linux-x86_64 -buildmode=pie -tags cgo,netgo,osusergo,static_build,nobadger,nomysql,nopgx -ldflags -linkmode=external -extldflags '-static-pie -Wl,-z,stack-size=0x80000' -w -s -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP 729cf9bba15e80e5f78f2a6f5ff1ea52a72fef10 PHP 8.4.5 Caddy'
# github.com/dunglas/frankenphp
cgo: #cgo nocallback disabled until Go 1.23
2025/04/02 23:00:46 [INFO] Cleaning up temporary folder: /tmp/buildenv_2025-04-02-2300.2171042982
2025/04/02 23:00:46 [FATAL] exit status 1
  1. running gcc failed?
2025/04/03 00:47:52 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /root/frankenphp/dist/frankenphp-linux-x86_64 -buildmode=pie -tags cgo,netgo,osusergo,static_build,nobadger,nomysql,nopgx -ldflags -linkmode=external -extldflags '-static-pie -Wl,-z,stack-size=0x80000' -w -s -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP 729cf9bba15e80e5f78f2a6f5ff1ea52a72fef10 PHP 8.4.5 Caddy'
# caddy
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/gcc -m64 -s -Wl,-z,relro -pie -Wl,--build-id=0xe1fdbad1d1cdc7b23ce9ea6066a3a543e51f4276 -o $WORK/b001/exe/a.out -Wl,--export-dynamic-symbol=_cgo_panic -Wl,--export-dynamic-symbol=_cgo_topofstack -Wl,--export-dynamic-symbol=crosscall2 -Wl,--export-dynamic-symbol=go_apache_request_headers -Wl,--export-dynamic-symbol=go_frankenphp_after_script_execution -Wl,--export-dynamic-symbol=go_frankenphp_before_script_execution -Wl,--export-dynamic-symbol=go_frankenphp_finish_php_request -Wl,--export-dynamic-symbol=go_frankenphp_finish_worker_request -Wl,--export-dynamic-symbol=go_frankenphp_main_thread_is_ready -Wl,--export-dynamic-symbol=go_frankenphp_on_thread_shutdown -Wl,--export-dynamic-symbol=go_frankenphp_shutdown_main_thread -Wl,--export-dynamic-symbol=go_frankenphp_worker_handle_request_start -Wl,--export-dynamic-symbol=go_get_custom_php_ini -Wl,--export-dynamic-symbol=go_getenv -Wl,--export-dynamic-symbol=go_getfullenv -Wl,--export-dynamic-symbol=go_handle_file_watcher_event -Wl,--export-dynamic-symbol=go_is_context_done -Wl,--export-dynamic-symbol=go_log -Wl,--export-dynamic-symbol=go_putenv -Wl,--export-dynamic-symbol=go_read_cookies -Wl,--export-dynamic-symbol=go_read_post -Wl,--export-dynamic-symbol=go_register_variables -Wl,--export-dynamic-symbol=go_sapi_flush -Wl,--export-dynamic-symbol=go_ub_write -Wl,--export-dynamic-symbol=go_write_headers -Wl,--compress-debug-sections=zlib /tmp/go-link-611883084/go.o /tmp/go-link-611883084/000000.o /tmp/go-link-611883084/000001.o /tmp/go-link-611883084/000002.o /tmp/go-link-611883084/000003.o /tmp/go-link-611883084/000004.o /tmp/go-link-611883084/000005.o /tmp/go-link-611883084/000006.o /tmp/go-link-611883084/000007.o /tmp/go-link-611883084/000008.o /tmp/go-link-611883084/000009.o /tmp/go-link-611883084/000010.o /tmp/go-link-611883084/000011.o /tmp/go-link-611883084/000012.o /tmp/go-link-611883084/000013.o /tmp/go-link-611883084/000014.o /tmp/go-link-611883084/000015.o /tmp/go-link-611883084/000016.o /tmp/go-link-611883084/000017.o /tmp/go-link-611883084/000018.o /tmp/go-link-611883084/000019.o /tmp/go-link-611883084/000020.o /tmp/go-link-611883084/000021.o /tmp/go-link-611883084/000022.o /tmp/go-link-611883084/000023.o /tmp/go-link-611883084/000024.o /tmp/go-link-611883084/000025.o /tmp/go-link-611883084/000026.o /tmp/go-link-611883084/000027.o /tmp/go-link-611883084/000028.o /tmp/go-link-611883084/000029.o /tmp/go-link-611883084/000030.o /tmp/go-link-611883084/000031.o /tmp/go-link-611883084/000032.o -Wl,-O1 -pie /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlicommon.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlienc.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlidec.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libwatcher-c.a -L/root/frankenphp/dist/static-php-cli/buildroot/lib -lphp -lc -lyaml -ltidy -llz4 -lsqlite3 -lpq -lpgport -lpgcommon -lreadline -lonig -llber -lldap -lsodium -lMagick++-7.Q16HDRI -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -lzip -lheif -laom -lde265 -ltiff -lintl -lncurses -lgmp -lfreetype -ljpeg -lturbojpeg -lwebp -lwebpdecoder -lwebpdemux -lwebpmux -lsharpyuv -lavif -lpng16 -lcurl -lzstd -lnghttp2 -lxml2 -licui18n -licuio -licuuc -licudata -liconv -lcharset -lbrotlidec -lbrotlienc -lbrotlicommon -lssh2 -lssl -lcrypto -lz -lbz2 -lgomp -lstdc++ -lresolv -L/usr/local/lib -L/usr/lib -lphp -ldl -lm -lutil -Wl,-O1 -pie /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlicommon.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlienc.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlidec.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libwatcher-c.a -L/root/frankenphp/dist/static-php-cli/buildroot/lib -lphp -lc -lyaml -ltidy -llz4 -lsqlite3 -lpq -lpgport -lpgcommon -lreadline -lonig -llber -lldap -lsodium -lMagick++-7.Q16HDRI -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -lzip -lheif -laom -lde265 -ltiff -lintl -lncurses -lgmp -lfreetype -ljpeg -lturbojpeg -lwebp -lwebpdecoder -lwebpdemux -lwebpmux -lsharpyuv -lavif -lpng16 -lcurl -lzstd -lnghttp2 -lxml2 -licui18n -licuio -licuuc -licudata -liconv -lcharset -lbrotlidec -lbrotlienc -lbrotlicommon -lssh2 -lssl -lcrypto -lz -lbz2 -lgomp -lstdc++ -lbrotlicommon -lbrotlidec -lbrotlienc -Wl,-O1 -pie /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlicommon.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlienc.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlidec.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libwatcher-c.a -L/root/frankenphp/dist/static-php-cli/buildroot/lib -lphp -lc -lyaml -ltidy -llz4 -lsqlite3 -lpq -lpgport -lpgcommon -lreadline -lonig -llber -lldap -lsodium -lMagick++-7.Q16HDRI -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -lzip -lheif -laom -lde265 -ltiff -lintl -lncurses -lgmp -lfreetype -ljpeg -lturbojpeg -lwebp -lwebpdecoder -lwebpdemux -lwebpmux -lsharpyuv -lavif -lpng16 -lcurl -lzstd -lnghttp2 -lxml2 -licui18n -licuio -licuuc -licudata -liconv -lcharset -lbrotlidec -lbrotlienc -lbrotlicommon -lssh2 -lssl -lcrypto -lz -lbz2 -lgomp -lstdc++ -lpthread -Wl,-O1 -pie /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlicommon.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlienc.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlidec.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libwatcher-c.a -L/root/frankenphp/dist/static-php-cli/buildroot/lib -lphp -lc -lyaml -ltidy -llz4 -lsqlite3 -lpq -lpgport -lpgcommon -lreadline -lonig -llber -lldap -lsodium -lMagick++-7.Q16HDRI -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -lzip -lheif -laom -lde265 -ltiff -lintl -lncurses -lgmp -lfreetype -ljpeg -lturbojpeg -lwebp -lwebpdecoder -lwebpdemux -lwebpmux -lsharpyuv -lavif -lpng16 -lcurl -lzstd -lnghttp2 -lxml2 -licui18n -licuio -licuuc -licudata -liconv -lcharset -lbrotlidec -lbrotlienc -lbrotlicommon -lssh2 -lssl -lcrypto -lz -lbz2 -lgomp -lstdc++ -Wl,-O1 -pie /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlicommon.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlienc.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libbrotlidec.a /root/frankenphp/dist/static-php-cli/buildroot/lib/libwatcher-c.a -L/root/frankenphp/dist/static-php-cli/buildroot/lib -lphp -lc -lyaml -ltidy -llz4 -lsqlite3 -lpq -lpgport -lpgcommon -lreadline -lonig -llber -lldap -lsodium -lMagick++-7.Q16HDRI -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -lzip -lheif -laom -lde265 -ltiff -lintl -lncurses -lgmp -lfreetype -ljpeg -lturbojpeg -lwebp -lwebpdecoder -lwebpdemux -lwebpmux -lsharpyuv -lavif -lpng16 -lcurl -lzstd -lnghttp2 -lxml2 -licui18n -licuio -licuuc -licudata -liconv -lcharset -lbrotlidec -lbrotlienc -lbrotlicommon -lssh2 -lssl -lcrypto -lz -lbz2 -lgomp -lstdc++ -lwatcher-c -lstdc++ -static-pie -Wl,-z,stack-size=0x80000
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lresolv
/usr/bin/ld: cannot find -lm
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
2025/04/03 00:49:12 [INFO] Cleaning up temporary folder: /tmp/buildenv_2025-04-03-0047.2774774831
2025/04/03 00:49:12 [FATAL] exit status 1
  1. Try running commands from: https://frankenphp.dev/docs/static/#glibc-based-mostly-static-build-with-dynamic-extension-support:
docker buildx bake --load static-builder-gnu
docker cp $(docker create --name static-builder-gnu dunglas/frankenphp:static-builder-gnu):/go/src/app/dist/frankenphp-linux-$(uname -m) frankenphp ; docker rm static-builder-gnu

Not found as dunglas/frankenphp:static-builder-gnu should be dunglas/frankenphp:static-builder-gnu-gnu ?

That's all for now.

Sadly, moving back again to php-fpm 😢.

Hopefully, Mongodb extension will accepted.

Build Type

Standalone binary

Worker Mode

No

Operating System

GNU/Linux

CPU Architecture

x86_64

PHP configuration

not applicable

Relevant log output

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions