Programs That Work
Lots of programs work in Fil-C with zero or minimal changes. This page enumerates some of the programs and libraries that are known to have been ported to Fil-C along with notes about how many changes were required.
This list is incomplete. It doesn't include ports done by folks who haven't reached out. It doesn't include all of the programs that Fil-C devs have ported. It largely reflects what Pizlix, the memory safe Linux userland, builds.
Some of the programs here claim non-zero changes because I did the port before implementing memory safe inline assembly.
- abseil 20260107.1. Small patch to change pointer tagging code.
- acl 2.4.0. No changes, works out of the box.
- ada url. No changes, works out of the box.
- aspell 0.60.8.1. Requires a tiny patch. The aspell6-en English dictionary works out of the box.
- at-spi2-core 2.60.5. Requires a tiny patch.
- atk 2.38.0. Requires a tiny patch.
- attr 2.6.0. Requires a tiny change to build system (version scripts).
- audit-userspace 4.2.1. Test suite changes only (disable tests that rely on
ld --wrapor symbol interposition). - autoconf 2.72. No changes, works out of the box.
- automake 1.17. No changes, works out of the box.
- bc 6.7.6. No changes, works out of the box.
- bison 3.8.2. Requires fixes to
obstack.h. - blake3 1.8.7. No changes, works out of the box.
- blink. Required a 27KB patch.
- boost 1.86.0. Requires a tiny patch.
- brotli 1.2.0. No changes, works out of the box.
- bubblewrap 0.9.0. No changes, works out of the box.
- bzip2. No changes, works out of the box. Version 1.0.8 also works out of the box.
- bzip3. No changes, works out of the box.
- cairo 1.18.0. Requires 17KB patch due to
GTypechanges. - check 0.15.2. Needs a tiny change to configure script (version scripts).
- cmake 3.30.2. No changes, works out of the box.
- curl 8.22.0. Build system changes only (version script handling).
- daemon 0.6.4. No changes, works out of the box.
- dash 0.5.13.5. One tiny change: use
fork(2)instead ofvfork(2). - dejagnu 1.6.3. No changes, works out of the box.
- dhcpcd 10.0.8. Requires a small patch.
- diffutils 3.12. One line change: disable the hacky stack overflow handler (Fil-C catches stack overflows more rigorously).
- e2fsprogs 1.47.1. Remove silly use of
sbrkto measure memory usage. - elfutils 0.191. Needs changes to build system (version scripts) and two files need a pragma to ignore a warning.
- enchant 2.8.2. Requires a small patch.
- expat 2.7.1 and 2.6.2. Build system changes only (version script handling).
- expect 5.45.4. No changes, works out of the box.
- ffmpeg 8.0.1. Requires a tiny patch (use pointer types instead of
uintptr_tfor the muxer/demuxer/device lists inlibavformat/allformats.c). - file 5.45. No changes, works out of the box.
- findutils 4.11.0. No changes, works out of the box.
- flex 2.6.4. No changes, works out of the box.
- fontconfig 2.15.0. Changed how
FcOffsetToPtrandFcPtrToOffsetwork in the not-mmapped case (they now usezexact_ptrtable). - freetype 2.13.3. Version script changes. I also applied the BLFS 12.2 patch, but that's unrelated to Fil-C.
- fribidi 1.0.15. No changes, works out of the box.
- gawk 5.4.1. No changes, works out of the box.
- gdbm 1.24. No changes, works out of the box.
- gdk-pixbuf 2.42.12. Adopt glib API for pointers in one place that lazily creates
GTypes. - gettext 0.22.5. Needs build system changes (version scripts) and a two-line change due to an out-of-bounds-but-in-bounds pointer.
- git 2.55.0. Needs a 26KB patch, mostly because of how options processing uses
intptr_t. - glib 2.80.4. Requires 100KB patch mostly due to changing the type of
GTypeto a pointer type. - glib-networking 2.80.0. One line build system change (version scripts).
- glibc 2.44. Used as Fil-C's other libc, and what you get in an
/opt/filbinary release or in Pizlix. Significant changes required (due to syscalls). - gmp 6.3.0. Requires tiny change to configure script.
- GNU bash 5.3. Requires a one line change due to a flex array alignment issue.
- GNU binutils 2.47. Requires a 9KB patch mostly due to uses of
intptr_twhere a pointer type is required. - GNU coreutils 9.12. Requires fixes to
obstack.h; also includes the i18n patch. - GNU Emacs 30.1. Replaced the elisp GC with calls to zgc_alloc. Disabled dumping, for now.
- GNU m4 1.4.21. Needs a 15KB patch, mostly to turn off bizarre gnulib tests. If you didn't care about the test suite, the patch would be much smaller.
- gnutls 3.8.7.1. Requires a tiny patch.
- gobject-introspection 1.80.1. Needed a handful of changes because
GTypeis a pointer type now. - google benchmark. No changes, works out of the box.
- google test. No changes, works out of the box.
- gperf 3.1. No changes, works out of the box.
- graphene 1.10.8. Adopt glib API for pointers in one place that lazily creates
GTypes. - graphite2 1.3.14. No changes, works out of the box.
- grep 3.12. Requires fixes to
obstack.hand disabling hacky stack overflow handling (Fil-C catches stack overflows more rigorously). - groff 1.23.0. No changes, works out of the box.
- gsettings-desktop-schemas 46.1. No changes, works out of the box.
- gst-plugins-bad 1.24.7. Requires a patch to build.
- gst-plugins-base 1.24.7. Requires a patch to build.
- gstreamer 1.24.7. Small patch (fix misuses of
g_once_init_enterand pointer-casting inprctlcalls). - gtk3 3.24.52 and gtk4 4.14.5. gtk4 needs ~80KB patch: adopt
GTypebecoming a pointer, disable CPU detection (issue #153), disable use ofobjcopyto bake resources into the binary (issue #154), callmemfd_createdirectly (issue #155), and remove unused arguments from a couple callbacks. gtk3 needs a similarly-sized patch in the same spirit. - gzip 1.15. One tiny change (header include ordering on ARM64).
- harfbuzz 9.0.0. Adopt glib API for pointers in two places that lazily create
GTypes. - icu4c 78.3. Tiny changes (roughly 8KB patch).
- inetutils 2.5. No changes, works out of the box.
- intltool 0.51.0. No changes, works out of the box.
- iproute2 6.10.0. No changes, works out of the box.
- iso-codes 4.16.0. No changes, works out of the box.
- jpeg 6b. No changes, works out of the box.
- kbd 2.6.4. Requires tiny changes to
ioctlcalls (kbd was casting pointers to integers for no good reason). - keyutils 1.6.3. Small changes to use the Fil-C syscall ABI.
- kmod 33. Needs tiny changes to build system (version scripts).
- krb5 1.22.2. One-line change to the build system (version scripts) and 3-line change to use Fil-C API for fences instead of inline assembly.
- lcms2 2.16. No changes, works out of the box.
- less 710. No changes, works out of the box.
- libarchive 3.7.4. Tiny changes (red-black tree and resizable array need to use pointer type instead of
uintptr_t). - libc++. Tiny changes only, mostly to invoke futexes using Fil-C's syscall API.
- libc++abi. Required moderate changes to the C++ exception personality function so that it uses Fil-C's variant of libunwind and Fil-C's way of tracking exception tables.
- libcap 2.70. No changes, works out of the box.
- libdrm 2.4.122. Requires 4KB patch, mostly due to how
ioctl(2)is used. - libedit 20260512-3.1. Tiny changes (that are more about porting to musl than about Fil-C).
- libepoxy 1.5.10. No changes, works out of the box.
- libevdev 1.11.0. Requires 3KB patch (mostly to test suite's usage of append sections).
- libevent 2.1.13. Changes to test suite only, works out of the box otherwise.
- libffi 3.8.0. Moderate changes needed because libffi under Fil-C has to use Fil-C reflection API instead of assembly and JITing.
- libgcrypt 1.11.0. Requires a tiny patch.
- libgpg-error 1.50. Requires a tiny patch.
- libgudev 238. Requires a tiny patch.
- libICE 1.1.1. No changes, works out of the box.
- libidn2 2.3.8. One line build system change (version scripts).
- libinput 1.29.1. Requires 4KB patch (mostly to test suite's usage of append sections).
- libjpeg-turbo 3.0.1. Only a build system change for version scripts.
- libpipeline 1.5.7. Requires small changes to build system (version scripts).
- libpng 1.6.43. Requires 1KB patch (due to version scripts).
- libpsl 0.23.3. No changes, works out of the box.
- LibreOffice 24.8.0.3. Built with GTK3 and gstreamer support, and linked against system Fil-C libraries. Requires a ~4662-line patch (which includes the BLFS changes); the build also downloads ~136 external tarballs.
- libseccomp 2.5.5. No changes, works out of the box.
- libsecret 0.21.4. No changes, works out of the box.
- libselinux 3.11. Only build system changes (version scripts).
- libsepol 3.11. Only build system changes (version scripts).
- libSM 1.2.4. No changes, works out of the box.
- libsoup 3.4.4. Requires a small patch.
- libtasn1 4.21.0. One line change to build system (version scripts).
- libtool 2.4.7. No changes, works out of the box.
- libuev 2.4.1. No changes, works out of the box.
- libunistring 1.4.2. No changes, works out of the box.
- libuv 1.53.0. Small patch: convert the preadv/pwritev function-pointer cache from
atomic_uintptr_ttovoid*_Atomic, disable io_uring, filter signals withzis_unsafe_signal_for_handlers, work around missingvfork/posix_spawn, and fix the proctitle'scap(capacity) field usingzlength. - libwebp 1.4.0. Needed to change some inline assembly for
cpuidwith a call to__get_cpuid. - libX11 1.8.10. No changes, works out of the box.
- libXau 1.0.11. No changes, works out of the box.
- libxcb 1.17.0. No changes, works out of the box.
- libxcrypt 4.5.2. Requires small changes (one line build system change for version scripts, small change to disable an inline asm path, and another small change to symbol versioning).
- libXdmcp 1.1.4. No changes, works out of the box.
- libXext 1.3.6. No changes, works out of the box.
- libXinerama 1.1.5. No changes, works out of the box.
- libxml2 2.15.4. One line change (missing
_Atomicon a pointer field that gets raced). - libXrandr 1.5.4. No changes, works out of the box.
- libXrender 0.9.11. No changes, works out of the box.
- libxslt 1.1.42. Requires a small patch (symbol versioning).
- libXt 1.3.0. No changes, works out of the box.
- linux 6.10.5. Only the userland parts of the kernel source build with Fil-C, and those required small changes due to pointer tagging in the red-black tree.
- Linux-PAM 1.7.3. Build system changes (version scripts) plus a backport of Ubuntu's patches.
- lua 5.4.7. Build system changes only (disable libreadline dependency).
- lute 1.0.0. Small port: builds against system Fil-C libraries instead of the vendored ones (drops vendored boringssl, curl, libuv, and zlib in favor of the pizfix OpenSSL, curl, and zlib) and disables doctest's POSIX signal handling under Fil-C.
- lz4 1.10.0. No changes, works out of the box.
- make 4.4.1. Fix a silly and likely benign memory safety bug in environment variable handling.
- make-ca 1.16.1. No changes, works out of the box.
- man-db 2.12.1. One line change to how
ioctlis called (remove pointless pointer-to-integer cast). - mesa 24.1.5. Only building with gallium swrast for now. Needed a build system change to disable use of assembly.
- meson 1.5.1. Needed a change to a gnome code generator to match changes in glib.
- mg 4.1. No changes, works out of the box.
- mpc 1.3.1. No changes, works out of the box.
- mpfr 4.2.1. No changes, works out of the box.
- musl. Used as Fil-C's original libc, and the one you'll get if you download a pizfix binary release. Significant changes required (replacing musl's inline assembly for calling syscalls with usage of Fil-C's syscall API).
- ncurses 6.6. No changes, works out of the box.
- nettle 3.10. Needed a two-line change to the
configurescript due to version script issues. Also, disabling assembly for now (will have to apply changes similar to those in OpenSSL for constant-time crypto). - nghttp2 1.70.0. No changes, works out of the box.
- ninja 1.12.1. No changes, works out of the box.
- openjpeg 2.5.2. No changes, works out of the box.
- openssh 10.5p1. Requires small adjustments to the seccomp filter (need to allowlist
MAP_NORESERVEand need to callzlock_runtime_threads()before installing the filter, and a one-line change to crypto code). - openssl 3.6.5 with zunsafe crypto: the approach documented in Constant-Time Crypto, where Fil-C code calls the original hand-written assembly via
zunsafe_callintrinsics, so the assembly remains memory-unsafe native code but stays constant-time. Also available is openssl 3.6.4 with sarcastic crypto: the newer approach, where OpenSSL's assembly is assembled with Sarcasm, Fil-C's memory safe assembler, so the assembly itself becomes memory safe. - p11-kit 0.26.5. Two line change to build system (version scripts), plus a fix for an out-of-bounds ctype-table read in
short_option()that Fil-C caught. - pango 1.54.0. Adopt glib API for pointers in three places that lazily create
GTypes. - patch 2.8. No changes, works out of the box.
- patchelf 0.19.1. No changes, works out of the box.
- pcre 8.39. No changes, works out of the box.
- pcre2 10.49. Only test suite changes (needed because of musl locale handling). Works out of the box if you don't run the test suite.
- perl 5.40.0. Needs a 30KB patch, mostly because of how
SV(a perl innard you probably don't want to understand) uses integers as pointers. - pixman 0.43.4. No changes, works out of the box.
- pkgconf 3.0.7. Small build system changes to cope with Fil-C's
pizlonated_symbol prefixing. - PostgreSQL 18.6 (client only: libpq and pg_config, as shipped in
/opt/fil). No source changes; built from the release tarball with build tweaks so that libpq's pizlonated symbols stay exported (disable the version script and-fvisibility=hidden). - procps-ng 4.0.7. One line build system change (version scripts) and a one line change to fix benign out-of-bounds
va_arg. - psmisc 23.7. No changes, works out of the box.
- pycairo 1.26.1. No changes, works out of the box.
- pygobject 3.48.2. Needed about ~20KB patch due to
GTypenow being a pointer. - Python 3.12.5. Moderate changes required, mostly to switch the Python GC's headers from
uintptr_tto a pointer type so they preserve capability. - quickjs. Tiny changes only (change a
uintptr_tto avoid*and use the stdlib'sqsort_r). - readline 8.3. No changes, works out of the box.
- rsync 3.5.1. No changes, works out of the box.
- ruby 3.3.10. Requires ~1MB patch because I needed to change the typedef for
VALUEto be a pointer type. Also replaces Ruby's GC with calls to the FUGC API. - seatd 0.9.1. Requires <1KB patch (version scripts).
- sed 4.10. Requires fixes to
obstack.hand some bizarre gnulib tests. - shadow 4.16.0. Requires changes to build system (version scripts).
- shared-mime-info 2.4. No changes, works out of the box.
- simdjson. Tiny change only (use Fil-C API for
cpuidandxgetbvinstead of assembly). - simdutf 5.5.0. Tiny change only (use Fil-C API for
cpuidandxgetbvinstead of assembly). - sqlite 3.46.1. No changes required, works out of the box — unless you want to run the test suite. The test suite uses pointer-integer cast idioms that require moderate changes; a patched sqlite 3.46.0 (roughly 16KB patch) shows what that takes.
- sudo 1.9.17p2. Build system changes only (version script handling).
- sysklogd 2.6.1. No changes, works out of the box.
- sysvinit 3.10. No changes, works out of the box.
- tar 1.35. Requires fixes to
obstack.h. - tcl 8.6.15 and 8.6.14. No changes, works out of the box.
- texinfo 7.1. Requires fixes to
obstack.hand replacing aintptr_twith avoid*in a generic data structure. - tiff 4.6.0. Only a build system change for version scripts.
- tmux 3.7c. No changes, works out of the box.
- toybox 8.12. Tiny changes (use
fork(2)instead ofvfork(2)and use pointer types instead of integer types in a few places). - udev from systemd 256.4. I haven't checked if all of systemd works, but I know that udev works. Required changes to version scripts, a small change to how signal handlers are reset, and removal of section hacks for setting up the error map.
- unifdef 2.12. No changes, works out of the box.
- unzip 6.0. Requires a small patch (configure fixes for modern C compilers).
- util-linux 2.40.2. Requires small changes (version scripts, and a small fix to
lsfd's use ofbsearch). - util-macros 1.20.1. No changes, works out of the box.
- vim 9.1.0660. Requires just a tiny change (disable
sigaltstackusage and fix a bug where vim passedSIG_ERRas a new handler tosigaction). - wayland 1.24.0. Requires 4KB patch (mostly to test suite's usage of append sections).
- wayland-protocols 1.45. No changes, works out of the box.
- weston 12.0.5. Requires 8KB patch (due to test suite's usage of append sections).
- wg14_signals. No changes, works out of the box.
- wget 1.25.0. No changes, works out of the box.
- which 2.21. No changes, works out of the box.
- xcb-proto 1.17.0. No changes, works out of the box.
- xkbcommon 1.11.0. Requires 2KB patch (due to version scripts).
- xkeyboard-config 2.42. No changes, works out of the box.
- XML Parser 2.47. Needs a one line change to Perl bindings due to pointer-as-integer usage.
- xorgproto 2024.1. No changes, works out of the box.
- xtrans 1.5.0. No changes, works out of the box.
- xxHash 0.8.4. Tiny changes (use Fil-C API for
cpuidandxgetbvinstead of assembly). - xz 5.8.4. Tiny changes (roughly 4KB patch).
- yaml 0.2.5. No changes, works out of the box.
- yosh 0.1.1. An LLM-enabled memory safe version of bash. Built with Fil-C.
- zip 3.0. Requires a small patch (build fixes for modern C compilers).
- zlib 1.3.2. Tiny changes (disable the ARM CRC32 assembly path).
- zsh 5.9.2. Tiny changes only (add a field to
struct keyso it lays out likestruct hashnode, fix how an input buffer pointer is rebased after reallocation). - zstd 1.5.7. Tiny changes only (use Fil-C cpuid API instead of assembly and disable some assembly snippets).