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.