Build audit
Per-target CI verification: the binary's file(1)
output, archive size, and the ldd / otool -L
report that proves it's fully self-contained.
Linux (musl-static)
The two Linux targets are built inside alpine:3.20
via scripts/build-alpine.sh, which delegates to
scripts/build.sh with the host-Linux branch applying
--build-static. ldd on the resulting
binary must report not a dynamic executable.
x86_64-linux-musl
$ file dist/fio-x86_64-linux-musl/bin/fio
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), \
statically linked, BuildID[sha1]=..., stripped
$ ldd dist/fio-x86_64-linux-musl/bin/fio
not a dynamic executable
$ du -h dist/fio-x86_64-linux-musl.tar.gz
~400 KB
aarch64-linux-musl
$ file dist/fio-aarch64-linux-musl/bin/fio
ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), \
statically linked, BuildID[sha1]=..., stripped
$ ldd dist/fio-aarch64-linux-musl/bin/fio
not a dynamic executable
$ du -h dist/fio-aarch64-linux-musl.tar.gz
~400 KB
macOS
macOS targets build with system clang via scripts/build.sh
with FIO_OS_HINT=darwin. otool -L must show
only system libraries (/usr/lib and
/System/Library); no Homebrew dylibs.
aarch64-macos
$ file dist/fio-aarch64-macos/bin/fio
Mach-O 64-bit executable arm64
$ otool -L dist/fio-aarch64-macos/bin/fio
dist/fio-aarch64-macos/bin/fio:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 0.0.0)
$ du -h dist/fio-aarch64-macos.tar.gz
~400 KB
x86_64-macos
Same shape, but x86_64 architecture. Cross-compiled from the
macos-14 aarch64 host via clang -arch x86_64.
$ file dist/fio-x86_64-macos/bin/fio
Mach-O 64-bit executable x86_64
$ otool -L dist/fio-x86_64-macos/bin/fio
dist/fio-x86_64-macos/bin/fio:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 0.0.0)
Windows (MinGW x86_64)
Built inside MSYS2 MINGW64 via scripts/build.sh
with FIO_OS_HINT=windows. The MinGW toolchain defaults
to /MT static CRT, so no DLLs are bundled.
x86_64-windows
$ file dist/fio-x86_64-windows/bin/fio.exe
PE32+ executable (GUI) x86-64, for MS Windows
$ ls dist/fio-x86_64-windows/bin/
fio.exe
aarch64-windows
In the CI matrix as the 6th target, but gated with
continue-on-error: true because MSYS2 MINGW64 does not
currently ship mingw-w64-aarch64-gcc (verified empty
as of 2026-07-15). When MSYS2 catches up, drop the
continue-on-error exemption and the target builds
normally.
CI flow
Each build-and-test.yml matrix entry runs the
corresponding verification above. On tag push, release.yml
runs the same matrix and ships the artifacts via
softprops/action-gh-release@v2.
Failures at this stage (e.g. ldd showing dynamic
libs, otool -L showing Homebrew dylibs) gate the
release — the binary never gets shipped.