Binfmtc – binfmt_misc C scripting interface
15 comments
·June 8, 2025rwmj
mananaysiempre
Compiler errors won’t cause as many funny consequences with
gcc "$0" -o "$@".out && exec ./"$@".out || exit $? # I'd use ${0%.c} not $@
Love this trick too, but the difference, as far as I understand, is that it only works with a Bourne(-compatible) shell, whereas shebangs or binfmt_misc also work with exec().AlotOfReading
You can also #embed the compiler binary, and execve it to much the same effect as binfmtc. I explored that trick for an IOCC entry that was never submitted because it ended up far too readable.
zx2c4
Similar project of mine from a long while ago: https://git.zx2c4.com/cscript/about/
monocasa
There's also tcc, which has a shebang compatible extension to allow it to be used by scripts.
radiospiel
Amazing; when I tried something similar I used a "#!" line pointing to a C compiler + runner of sorts (https://github.com/radiospiel/jit). https://git.zx2c4.com/cscript/about/ is also following that approach.
What is the benefit of registering an extension via binfmt_misc?
lmz
It's still valid C source code? Is the #! sequence valid C?
codr7
I did a simple hack for doing the same thing from inside a C program for my book:
kazinator
This is doable entirely without a Linux-specific binfmt-misc hack.
enriquto
was surprised that "sudo apt install binfmtc" works out of the box on my box (linux mint) and i can do the magic just as described here
JSR_FDED
C is still my first love. You can hold the whole language in your head, and it’s fast. Yes there are footguns but it’s a libertarian programming language - you’re responsible for what you build. No hand holding.
ykonstant
I like that too, but the problem is that C doesn't keep its end of the deal. No hand holding, but make what you are doing transparent. It used to be the case back in the 80s, but not anymore. Not with our optimizing compilers and oodles of UB and spec subtleties and implicit actions.
throwaway984393
[dead]
Surac
So lovely
You can already do this without using binfmt ...
Usage: (Could be better to use a temporary file though.)There's a similar cute trick for compiled OCaml scripts that we use with nbdkit: https://libguestfs.org/nbdkit-cc-plugin.3.html#Using-this-pl...