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.
- abseil 20260107.1. Small patch to change pointer tagging code.
- acl 2.3.2. No changes, works out of the box.
- ada url. No changes, works out of the box.
- attr 2.5.2. Requires a tiny change to build system (version scripts), and a tiny change to a symbol versioning macro.
- audit-userspace 4.1.2. 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. - blink. Required a 27KB patch.
- brotli 1.1.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.9.1. Build system changes only (version script handling).
- daemon 0.6.4. No changes, works out of the box.
- dash 0.5.12. One tiny change: use
fork(2)instead ofvfork(2). - diffutils 3.10. Needs tiny changes (ignoring warnings, disabling hacky stack overflow handling).
- 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.
- expect 5.45.4. No changes, works out of the box.
- expat 2.7.1 and 2.6.2. Build system changes only (version script handling).
- file 5.45. No changes, works out of the box.
- findutils 4.10.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.3.0. 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.46.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. - glibc 2.40. 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.2.32. Requires a one line change due to a flex array alignment issue.
- GNU binutils 2.43.1. Requires a 9KB patch mostly due to uses of
intptr_twhere a pointer type is required. - GNU coreutils 9.5. No changes, works out of the box.
- GNU Emacs 30.1. Replaced the elisp GC with calls to zgc_alloc. Disabled dumping, for now.
- GNU m4 1.4.19. Needs a 11KB patch, mostly to turn off bizarre gnulib tests. If you didn't care about the test suite, the patch would be much smaller.
- 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.11. 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.
- gtk 4.14.5. Needs ~72KB 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. - gzip 1.13. No changes, works out of the box.
- harfbuzz 9.0.0. Adopt glib API for pointers in two places that lazily create
GTypes. - icu4c 76.1. Tiny changes (roughly 4KB 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.
- 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.21.3. One-line change to the build system (version scripts) and 3-line change to use Fil-C API for fences instead of inline assembly.
- less 661. No changes, works out of the box.
- 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.
- libarchive 3.7.4. Tiny changes (red-black tree and resizable array need to use pointer type instead of
uintptr_t). - 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 20240808-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.
- libevent 2.1.12. Changes to test suite only, works out of the box otherwise.
- libevdev 1.11.0. Requires 3KB patch (mostly to test suite's usage of append sections).
- libffi 3.4.6. Moderate changes needed because libffi under Fil-C has to use Fil-C reflection API instead of assembly and JITing.
- 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.12.5. No changes, works out of the box.
- libselinux 3.9. Only build system changes (version scripts).
- libsepol 3.9. Only build system changes (version scripts).
- libtasn1 4.19.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.2. No changes, works out of the box.
- libuv 1.48.0 and 1.51.0. Tiny change required for passing pointers across a
write(2)syscall (this can be done using thezexact_ptrtableAPI). - libwebp 1.4.0. Needed to change some inline assembly for
cpuidwith a call to__get_cpuid. - libxcrypt 4.4.36. 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).
- libxml2 2.14.4. One line change (missing
_Atomicon a pointer field that gets raced). - 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.6.1 and 1.7.1. Build system changes only (version scripts).
- lua 5.4.7. Build system changes only (disable libreadline dependency).
- 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.
- 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 3.7. 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.5-20240720. 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.62.1. 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.3p1. 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.3.1. Build system changes only (version script handling). Also added an assertion that
mem_secisn't used (nobody seems to use it anyway, so adding that assertion isn't necessary to have a working OpenSSL). About 90KB of additional changes are needed to support constant-time crypto. - p11-kit 0.25.5. Two line change to build system (version scripts).
- pango 1.54.0. Adopt glib API for pointers in three places that lazily create
GTypes. - patch 2.7.6. No changes, works out of the box.
- pcre 8.39. No changes, works out of the box.
- pcre2 10.44. 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 2.3.0. Build system changes only (version script handling).
- procps-ng 4.0.4. 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.2.13. 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. - rsync 3.4.3. No changes, works out of the box.
- seatd 0.9.1. Requires <1KB patch (version scripts).
- sed 4.9. 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.
- simdutf 5.5.0. Tiny change only (use Fil-C API for
cpuidandxgetbvinstead of assembly). - simdjson. Tiny change only (use Fil-C API for
cpuidandxgetbvinstead of assembly). - sqlite 3.46.0. No changes required, works out of the box - unless you want to run the test suite. The sqlite test suite uses pointer-integer cast idioms that require moderate changes (roughly 16KB patch).
- sudo 1.9.15p5. 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.5a. 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.
- util-linux 2.40.2. Requires small changes to build system (version scripts).
- 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).
- weston 12.0.5. Requires 8KB patch (due to test suite's usage of append sections).
- wget 1.24.5. No changes, works out of the box.
- wg14_signals. No changes, works out of the box.
- which 2.21. No changes, works out of the box.
- xkbcommon 1.11.0. Requires 2KB patch (due to version scripts).
- XML Parser 2.47. Needs a one line change to Perl bindings due to pointer-as-integer usage.
- xz 5.6.2. Tiny changes (build system linker script changes, change one pointer arithmetic expression, align a union, and disable one assembly snippet).
- yaml 0.2.5. No changes, works out of the box.
- yosh 0.1.1. An LLM-enabled memorty safe version of bash. Build with Fil-C.
- zlib 1.3 and 1.3.1. No changes, works out of the box.
- zsh 5.8.0.1-dev. Tiny changes only (add a field to a struct to properly align some fields, disable custom malloc).
- zstd 1.5.6. Tiny changes only (use Fil-C cpuid API instead of assembly and disable some assembly snippets).