{"id":22049,"date":"2025-11-03T04:47:50","date_gmt":"2025-11-03T04:47:50","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=22049"},"modified":"2025-11-03T04:47:50","modified_gmt":"2025-11-03T04:47:50","slug":"notes-by-djb-on-using-fil-c-2025","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/22049\/","title":{"rendered":"Notes by djb on using Fil-C (2025)"},"content":{"rendered":"\n<\/p>\n<div>\n<head><br \/>\n<meta http-equiv=\"content-type\" content=\"text\/html; charset=utf-8\"\/><br \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\/><\/p>\n<p><\/head><br \/>\n<body id=\"wp_automatic_ReadabilityBody\"><\/p>\n<p>\nI&#8217;m impressed with the level of compatibility<br \/>\nof the new memory-safe C\/C++ compiler<br \/>\n<a target=\"_blank\" href=\"https:\/\/fil-c.org\">Fil-C<\/a><br \/>\n(filcc, fil++).<br \/>\nMany libraries and applications that I&#8217;ve tried<br \/>\nwork under Fil-C without changes, and the exceptions haven&#8217;t been hard to get working.\n<\/p>\n<p>\nI&#8217;ve started accumulating miscellaneous notes on this page regarding usage of Fil-C.<br \/>\nMy selfish objective here is to protect various machines that I manage<br \/>\nby switching them over to code compiled with Fil-C,<br \/>\nbut maybe you&#8217;ll find something useful here too.\n<\/p>\n<p>\nTimings below are from a mini-PC named <tt>phoenix<\/tt> except where otherwise mentioned.<br \/>\nThis mini-PC has a 6-core (12-thread) AMD Ryzen 5 7640HS (Zen 4) CPU, 12GB RAM, and 36GB swap.<br \/>\nThe OS is Debian 13.<br \/>\n(I normally run LTS software,<br \/>\nperiodically upgrading from software that&#8217;s 4\u20135 years old such as Debian 11 today<br \/>\nto software that&#8217;s 2\u20133 years old such as Debian 12 today;<br \/>\nbut some of the packages included in Fil-C expect newer utilities to be available.)\n<\/p>\n<p>\nRelated:\n<\/p>\n<ul>\n<li>\nI&#8217;ve posted a<br \/>\n<a target=\"_blank\" href=\"https:\/\/cr.yp.to\/2025\/filc-diffs-20251027.sh\">script<\/a><br \/>\nto help auditors see how Fil-C differs from upstream sources (clang, glibc, &#8230;).\n<\/li>\n<li>\nI&#8217;ve posted a self-contained<br \/>\n<a target=\"_blank\" href=\"https:\/\/cr.yp.to\/2025\/20251030-filian-install-compiler.sh\"><tt>filian-install-compiler<\/tt><\/a><br \/>\nscript<br \/>\n(replacing the<br \/>\n<a target=\"_blank\" href=\"https:\/\/cr.yp.to\/2025\/20251029-filian-install-compiler.sh\">20251029 version<\/a>)<br \/>\nto download+compile+install Fil-C on Debian 13 in what I think are Debian-appropriate locations,<br \/>\nalong with glibc and binutils compiled with Fil-C.<br \/>\nA run took 86 minutes real time (for 477 minutes user time and 52 minutes system time).\n<\/li>\n<li>\nI&#8217;ve posted the start of a<br \/>\n<a target=\"_blank\" href=\"https:\/\/cr.yp.to\/2025\/20251030-filian-install-packages.sh\"><tt>filian-install-packages<\/tt><\/a><br \/>\nscript to download+compile+install Debian source packages, using Fil-C as the compiler<br \/>\n(after <tt>filian-install-compiler<\/tt> has finished).<br \/>\nThis script has various limitations that need fixing,<br \/>\nbut it does work for a few packages already<br \/>\n(e.g., <tt>.\/filian-install-packages bzip2<\/tt>),<br \/>\nafter the installation of <tt>dh-exec<\/tt> etc. described below.\n<\/li>\n<li>\nI&#8217;ve posted a<br \/>\n<a target=\"_blank\" href=\"https:\/\/cr.yp.to\/2025\/20251028-filcc-vs-clang.html\">graph<\/a><br \/>\nshowing nearly 9000 microbenchmarks of Fil-C vs. clang on cryptographic software (each run pinned to 1 core on the same Zen 4).<br \/>\nTypically code compiled with Fil-C takes between 1x and 4x as many cycles as the same code compiled with clang.\n<\/li>\n<\/ul>\n<p>\nAnother way to run Fil-C is via<br \/>\n<a target=\"_blank\" href=\"https:\/\/github.com\/mbrock\/filnix\">Filnix<\/a><br \/>\nfrom Mikael Brockman.<br \/>\nFor example,<br \/>\nan unprivileged user under Debian 12 with about 10GB of free disk space<br \/>\ncan download, compile, and install Fil-C,<br \/>\nand run a Fil-C-compiled Nethack, as follows:\n<\/p>\n<pre><code>unshare --user --pid echo YES # just to test\ngit clone https:\/\/github.com\/nix-community\/nix-user-chroot\ncd nix-user-chroot\ncargo build --release\nmkdir -m 0755 ~\/nix\n~\/nix-user-chroot\/target\/release\/nix-user-chroot ~\/nix \\\n  bash -c 'curl -L https:\/\/nixos.org\/nix\/install | sh'\nenv TERM=vt102 \\\n  ~\/nix-user-chroot\/target\/release\/nix-user-chroot ~\/nix \\\n  ~\/nix\/store\/*-nix-2*\/bin\/nix \\\n  --extra-experimental-features 'nix-command flakes' \\\n  run 'github:mbrock\/filnix#nethack'\n<\/code><\/pre>\n<p>\nCurrent recommendations for things to do at the beginning as <tt>root<\/tt>:\n<\/p>\n<pre><code>mkdir -p \/var\/empty\napt install \\\n  autoconf-dickey build-essential bison clang cmake flex gawk \\\n  gettext ninja-build patchelf quilt ruby texinfo time\n<\/code><\/pre>\n<p>\nI created an unprivileged <tt>filc<\/tt> user.<br \/>\nEverything else is as that user.\n<\/p>\n<p>\nI downloaded the Fil-C source package:\n<\/p>\n<pre><code>git clone https:\/\/github.com\/pizlonator\/fil-c.git\ncd fil-c\n<\/code><\/pre>\n<p>\nThis isn&#8217;t just the compiler;<br \/>\nthere&#8217;s also glibc and quite a few higher-level libraries and applications.<br \/>\nThere are also binary Fil-C packages,<br \/>\nbut I&#8217;ve worked primarily with the source package at this point.\n<\/p>\n<p>\nI compiled Fil-C and glibc:\n<\/p>\n<pre><code>time .\/build_all_fast_glibc.sh\n<\/code><\/pre>\n<p>\nThere are also options to use musl instead of glibc,<br \/>\nbut musl is incompatible with some of the packages shipped with Fil-C:<br \/>\n<tt>attr<\/tt> needs <tt>basename<\/tt>,<br \/>\n<tt>elfutils<\/tt> needs <tt>argp_parse<\/tt>,<br \/>\n<tt>sed<\/tt>&#8216;s test suite needs the glibc variant of <tt>calloc<\/tt>,<br \/>\nand<br \/>\n<tt>vim<\/tt>&#8216;s build needs <tt>iconv<\/tt><br \/>\nto be able to convert from CP932 to UTF-8.\n<\/p>\n<p>\nI had originally configured the server <tt>phoenix<\/tt> with only 12GB swap.<br \/>\nI then had to restart <tt>.\/build_all_fast_glibc.sh<\/tt> a few times<br \/>\nbecause the Fil-C compilation ran out of memory.<br \/>\nSwitching to 36GB swap made everything work with no restarts;<br \/>\nmonitoring showed that almost 19GB swap (plus 12GB RAM) was used at one point.<br \/>\nA larger server, 128 cores with 512GB RAM, took 8 minutes for Fil-C plus 6 minutes for musl,<br \/>\nwith no restarts needed.\n<\/p>\n<p>\nFil-C includes a<br \/>\n<tt>.\/build_all_slow.sh<\/tt><br \/>\nthat builds many more libraries and applications<br \/>\n(sometimes with patches from the Fil-C author).<br \/>\nI wrote a replacement script<br \/>\n<a target=\"_blank\" href=\"https:\/\/cr.yp.to\/2025\/build-parallel-20251023.py\">https:\/\/cr.yp.to\/2025\/build-parallel-20251023.py<\/a><br \/>\nwith the following differences:\n<\/p>\n<ul>\n<li>The <tt>build-parallel<\/tt> script<br \/>\n  runs through everything, putting results into <tt>build\/logs\/*<\/tt>,<br \/>\n  whereas <tt>build_all_slow<\/tt> stops at the first error.\n<\/li>\n<li>The <tt>build-parallel<\/tt> script tries to use multiple cores,<br \/>\n  while <tt>build_all_slow<\/tt> runs through targets serially,<br \/>\n  parallelizing only to the extent that each target&#8217;s build mechanism is parallelized.\n<\/li>\n<li>The <tt>build-parallel<\/tt> script might produce wrong results if it&#8217;s parallelizing things<br \/>\n  that shouldn&#8217;t be parallelized.<br \/>\n  But this should be easy to fix via tweaking the dependencies listed in the script.\n<\/li>\n<\/ul>\n<p>\nOn <tt>phoenix<\/tt>,<br \/>\nrunning<br \/>\n<tt>time PATH=\"$HOME\/bin:$HOME\/fil-c\/build\/bin:$HOME\/fil-c\/pizfix\/bin:$PATH\" .\/build-parallel.py<\/tt><br \/>\nwent through 61 targets in 101 minutes real time (467 minutes user time, 55 minutes system time),<br \/>\nsuccessfully compiling 60 of them.\n<\/p>\n<p>\n<b>libcap.<\/b><br \/>\nThis is the one that didn&#8217;t compile:<br \/>\n<tt>\/home\/filc\/fil-c\/pizfix\/bin\/ld: \/usr\/libexec\/gcc\/x86_64-linux-gnu\/14\/liblto_plugin.so: error loading plugin: libc.so.6: cannot open shared object file: No such file or directory<\/tt>\n<\/p>\n<p>\n<b>util-linux.<\/b><br \/>\nI skipped this one.<br \/>\nIt does compile,<br \/>\nbut the compiled <tt>taskset<\/tt> utility needs to be patched to use<br \/>\n<tt>sched_getaffinity<\/tt> and <tt>sched_setaffinity<\/tt><br \/>\nas library functions rather than via <tt>syscall<\/tt>,<br \/>\nor Fil-C needs to be patched for those syscalls.<br \/>\nThis is an issue for <tt>build-parallel<\/tt><br \/>\nsince <tt>build-parallel<\/tt> relies on <tt>taskset<\/tt>;<br \/>\nmaybe <tt>build-parallel<\/tt> should instead use Python&#8217;s affinity functions.\n<\/p>\n<p>\n<b><br \/>\nattr, bash, benchmarks, binutils, bison, brotli, bzip2, bzip3, check, cmake, coreutils, cpython, curl, dash, diffutils, elfutils, emacs, expat, ffi, gettext, git,<br \/>\ngmp, grep, icu, jpeg-6b, libarchive, libcap, libedit, libevent, libpipeline, libuev, libuv, lua, lz4, m4, make, mg, ncurses, nghttp2, openssh, openssl, pcre2, pcre,<br \/>\nperl, pkgconf, procps, quickjs, sed, shadow, simdutf, sqlite, tcl, tmux, toybox, vim, wg14_signals, xml_parser, xz, zlib, zsh, zstd.<\/b><br \/>\nNo problems encountered so far<br \/>\n(given whatever patches were already applied from the Fil-C author!).<br \/>\nThe benchmarks package is supplied with Fil-C and does a few miscellaneous measurements.\n<\/p>\n<p>\nI did<br \/>\n<tt>export PATH=\"$HOME\/bin:$HOME\/fil-c\/build\/bin:$HOME\/fil-c\/pizfix\/bin:$PATH\"<\/tt><br \/>\nbefore these.\n<\/p>\n<p>\n<b>boost 1.89.0<\/b>:<br \/>\nSeems to mostly work.<br \/>\nMost of the package is header-only;<br \/>\na few simple tests worked fine.\n<\/p>\n<p>\nI also looked a bit at the compiled parts.<br \/>\nRunning<br \/>\n<tt>.\/bootstrap.sh --with-toolset=clang --prefix=$HOME<\/tt><br \/>\nran into <tt>vfork<\/tt>,<br \/>\nwhich Fil-C doesn&#8217;t support,<br \/>\nbut editing<br \/>\n<tt>tools\/build\/src\/engine\/execunix.cpp<\/tt><br \/>\nto use <tt>defined(__APPLE__) || defined(__FILC__)<\/tt><br \/>\nfor the no-fork test got past this.\n<\/p>\n<p>\nRunning <tt>.\/b2 install --prefix=$HOME toolset=clang address-model=64 architecture=x86_64 binary-format=elf<\/tt><br \/>\nproduced an error message since I should have said <tt>x86<\/tt> instead of <tt>x86_64<\/tt>;<br \/>\nFil-C said it caught a safety issue in the <tt>b2<\/tt> program after the error message:<br \/>\n<tt>filc safety error: argument size mismatch (actual = 8, expected = 16)<\/tt>.<br \/>\nI didn&#8217;t compile with debugging so Fil-C didn&#8217;t say where this is in <tt>b2<\/tt>.\n<\/p>\n<p>\n<b>cdb-20251021<\/b>:<br \/>\nSeems to work.<br \/>\nOne regression test, an artificial out-of-memory regression test,<br \/>\ncurrently produces a different error message with Fil-C:<br \/>\n<tt>filc panic: src\/libpas\/pas_compact_heap_reservation.c:65: pas_aligned_allocation_result pas_compact_heap_reservation_try_allocate(size_t, size_t):<br \/>\nassertion page_result.result failed.<\/tt>\n<\/p>\n<p>\n<b>libcpucycles-20250925<\/b>:<br \/>\nSeems to work.<br \/>\nI commented out the first three lines of <tt>cpucycles\/options<\/tt>.\n<\/p>\n<p>\n<b>libgc<\/b>:<br \/>\nI replaced this with a small gcshim package<br \/>\n(<a target=\"_blank\" href=\"https:\/\/cr.yp.to\/2025\/gcshim-20251022.tar.gz\">https:\/\/cr.yp.to\/2025\/gcshim-20251022.tar.gz<\/a>)<br \/>\nthat simply calls <tt>malloc<\/tt> etc.<br \/>\nSo far this seems to be an adequate replacement.<br \/>\n(Fil-C includes a garbage collector.)\n<\/p>\n<p>\n<b>libntruprime-20241021<\/b>:<br \/>\nSeems to work after a few tweaks but I didn&#8217;t collect full notes yet.<br \/>\n<tt>chmod +t crypto_hashblocks\/sha512\/avx2<\/tt> disables assembly and makes things compile;<br \/>\nconfigured with <tt>--no-valgrind<\/tt> since Fil-C doesn&#8217;t support valgrind;<br \/>\ndid a bit more tweaking to make <tt>cpuid<\/tt> work.\n<\/p>\n<p>\n<b>lpeg-1.1.0:<\/b><br \/>\nCompiles, maybe works (depends on lua, dependency of neovim):\n<\/p>\n<pre><code>cd\nPREFIX=$(dirname $(dirname $(which lua)))\nwget https:\/\/www.inf.puc-rio.br\/~roberto\/lpeg\/lpeg-1.1.0.tar.gz\ntar -xf lpeg-1.1.0.tar.gz\ncd lpeg-1.1.0\nmake CC=`which filcc` DLLFLAGS='-shared -fPIC' test\ncp lpeg.so $PREFIX\/lib\n<\/code><\/pre>\n<p>\n<b>luv-1.51.0:<\/b><br \/>\nCompiles, maybe works (depends on lua, dependency of neovim):\n<\/p>\n<pre><code>cd\nPREFIX=$(dirname $(dirname $(which lua)))\nwget https:\/\/github.com\/luvit\/luv\/releases\/download\/1.51.0-1\/luv-1.51.0-1.tar.gz\ntar -xf luv-1.51.0-1.tar.gz\ncd luv-1.51.0-1\nmkdir build\ncd build\nLUA_DIR=$HOME\/fil-c\/projects\/lua-5.4.7\n# lua install should probably do this:\ncp $LUA_DIR\/lua.h $PREFIX\/include\/\ncp $LUA_DIR\/lauxlib.h $PREFIX\/include\/\ncp $LUA_DIR\/luaconf.h $PREFIX\/include\/\ncp $LUA_DIR\/lualib.h $PREFIX\/include\/\n# and then:\ncmake -DCMAKE_C_COMPILER=`which filcc` -DCMAKE_INSTALL_PREFIX=$PREFIX -DWITH_LUA_ENGINE=Lua -DLUA_DIR=$HOME\/fil-c\/projects\/lua-5.4.7\/ ..\nmake test\nmake install\n<\/code><\/pre>\n<p>\n<b>mutt-2-2-15-rel<\/b> (depends on ncurses):\n<\/p>\n<pre><code>wget https:\/\/github.com\/muttmua\/mutt\/archive\/refs\/tags\/mutt-2-2-15-rel.tar.gz\ntar -xf mutt-2-2-15-rel.tar.gz\ncd mutt-mutt-2-2-15-rel\nCC=`which clang` .\/prepare --prefix=$HOME\/fil-c\/pizfix --with-homespool\nmake -j12 install\n<\/code><\/pre>\n<p>Seems to work, at least for reading email.<\/p>\n<p>\n<b>tig<\/b> (depends on ncurses and maybe more):\n<\/p>\n<pre><code>wget https:\/\/github.com\/jonas\/tig\/releases\/download\/tig-2.6.0\/tig-2.6.0.tar.gz\ntar -xf tig-2.6.0.tar.gz\ncd tig-2.6.0\nCC=`which filcc` .\/configure --prefix=$(dirname $(dirname $(which git)))\nmake -j12\nmake test\nmake -j12 install\n<\/code><\/pre>\n<p>Seems to work, at least for viewing the Fil-C repo.<\/p>\n<p>\n<b>w3m<\/b> (depends on gcshim and ncurses):<br \/>\nSeems to work.<br \/>\nI tried the Debian version:<br \/>\n<tt>git clone https:\/\/salsa.debian.org\/debian\/w3m.git<\/tt>.<br \/>\nI used <tt>CFLAGS=-Wno-incompatible-function-pointer-types<\/tt><br \/>\n(which is probably needed for clang anyway even without Fil-C).\n<\/p>\n<p>\nI&#8217;ve built and installed some replacement Debian packages using Fil-C as the compiler on a Debian 13 machine,<br \/>\nas explained below.<br \/>\nHopefully this can rapidly scale to many packages,<br \/>\ntaking advantage of the basic compile-install-test knowledge already built into Debian source packages,<br \/>\nalthough some packages will take more work because they need extra patches to work with Fil-C.\n<\/p>\n<p>\n<b>Structure.<\/b><br \/>\nDebian already understands how to have packages for multiple architectures (ABIs; Debian &#8220;ports&#8221;) installed at once.<br \/>\nFor example,<br \/>\n<tt>dpkg --add-architecture i386; apt update; apt install bash:i386<\/tt><br \/>\ninstalls a 32-bit version of bash,<br \/>\nreplacing the usual 64-bit version;<br \/>\nyou can do <tt>apt install bash:amd64<\/tt> to revert to the 64-bit version.<br \/>\nMeanwhile the 32-bit libraries and 64-bit libraries are installed in separate locations,<br \/>\nbasically<br \/>\n<tt>\/lib\/i386-linux-gnu<\/tt><br \/>\nor<br \/>\n<tt>\/usr\/lib\/i386-linux-gnu<\/tt><br \/>\nvs.<br \/>\n<tt>\/lib\/x86_64-linux-gnu<\/tt><br \/>\nor<br \/>\n<tt>\/usr\/lib\/x86_64-linux-gnu<\/tt>.<br \/>\n(On Debian 11 and newer, and on Ubuntu 22.04 and newer,<br \/>\n<tt>\/lib<\/tt> is symlinked to <tt>\/usr\/lib<\/tt>.)\n<\/p>\n<p>\nI&#8217;m following this model for plugging Fil-C into Debian:<br \/>\nthe goal is for <tt>apt install bash:amd64fil0<\/tt><br \/>\nto install a Fil-C-compiled (<tt>amd64fil0<\/tt>) version of bash,<br \/>\nreplacing the usual (<tt>amd64<\/tt>) version of bash,<br \/>\nwhile the <tt>amd64<\/tt> and <tt>amd64fil0<\/tt> libraries are installed in separate locations.\n<\/p>\n<p>\n<b>The include-file complication.<\/b><br \/>\nDebian<br \/>\n<a target=\"_blank\" href=\"https:\/\/wiki.debian.org\/Multiarch\/LibraryPathOverview\">expects<\/a><br \/>\nlibrary packages compiled for multiple ABIs<br \/>\nto all provide the same include files:<br \/>\nfor example, <tt>\/usr\/include\/ncurses.h<\/tt><br \/>\nis provided by <tt>libncurses-dev:i386<\/tt>, <tt>libncurses-dev:amd64<\/tt>, etc.<br \/>\nThis is safe because Debian forces<br \/>\n<tt>libncurses-dev:i386<\/tt> and <tt>libncurses-dev:amd64<\/tt> and so on<br \/>\nto all have the same version.<br \/>\nAn occasional package with ABI-dependent include files<br \/>\ncan still use <tt>\/usr\/include\/x86_64-linux-gnu<\/tt> etc.\n<\/p>\n<p>\nFil-C instead omits <tt>\/usr\/include<\/tt><br \/>\nin favor of a Fil-C-specific directory<br \/>\n(which will typically be different from <tt>\/usr\/include<\/tt>:<br \/>\neven if Fil-C is compiled with glibc,<br \/>\nprobably the glibc version won&#8217;t be the same as in <tt>\/usr\/include<\/tt>).<br \/>\nThis difference is the top source of messiness below.<br \/>\nI&#8217;m planning to tweak the Fil-C driver to use <tt>\/usr\/include<\/tt> on Debian.<br \/>\n[This is done in the <tt>filian-install-compiler<\/tt> script.]\n<\/p>\n<p>\nSomething else I&#8217;m planning to tweak is Fil-C&#8217;s glibc compilation,<br \/>\nso that it uses the final system prefix.<br \/>\n[This is also done in the <tt>filian-install-compiler<\/tt> script.]\nThe approach described below instead requires<br \/>\n<tt>\/home\/filian\/fil-c<\/tt> to stay in place<br \/>\nfor compiling and running programs.\n<\/p>\n<p>\n<b>Building Debian packages.<\/b><br \/>\nHow does Debian package building work?<br \/>\nFirst, more packages to install as root:\n<\/p>\n<pre><code>apt install dpkg-dev devscripts docbook2x \\\n  dh-exec dh-python python3-setuptools fakeroot \\\n  sbuild mmdebstrap uidmap piuparts\n<\/code><\/pre>\n<p>\nDebian has<br \/>\n<a target=\"_blank\" href=\"https:\/\/wiki.debian.org\/PackagingTools#Package_build_tools\">multiple options<\/a><br \/>\nfor building a package.<br \/>\nThe option that has the best isolation,<br \/>\nand that Debian uses to continually build new packages for distribution,<br \/>\nis sbuild,<br \/>\nbut for fast development I&#8217;ll focus on directly using the lower-level<br \/>\ndpkg-buildpackage.\n<\/p>\n<p>\n<b>Baseline 1: using sbuild without Fil-C.<\/b><br \/>\nIn case you do want to try sbuild,<br \/>\nhere&#8217;s the basic setup,<br \/>\nand then an example of building a small package (tinycdb):\n<\/p>\n<pre><code>mkdir -p ~\/shared\/sbuild\ntime mmdebstrap --include=ca-certificates --skip=output\/dev --variant=buildd unstable ~\/shared\/sbuild\/unstable-amd64.tar.zst https:\/\/deb.debian.org\/debian\n\nmkdir -p ~\/.config\/sbuild\ncat  ~\/.config\/sbuild\/config.pl\n$chroot_mode=\"unshare\";\n$external_commands = { \"build-failed-commands\" =&gt; [ [ '%SBUILD_SHELL' ] ] };\n$build_arch_all = 1;\n$build_source = 1;\n$source_only_changes = 1;\n$run_lintian = 1;\n$lintian_opts = ['--display-info', '--verbose', '--fail-on', 'error,warning', '--info'];\n$run_autopkgtest = 1;\n$run_piuparts = 1;\n$piuparts_opts = ['--no-eatmydata', '--distribution=%r', '--fake-essential-packages=systemd-sysv'];\nEOF\n\nmkdir -p ~\/shared\/packages\ncd ~\/shared\/packages\napt source tinycdb\ncd tinycdb-*\/\ntime sbuild\n<\/code><\/pre>\n<p>\n<b>Baseline 2: using dpkg-buildpackage without Fil-C.<\/b><br \/>\nHere&#8217;s what it looks like compiling the same small package with dpkg-buildpackage:\n<\/p>\n<pre><code>mkdir -p ~\/shared\/packages\ncd ~\/shared\/packages\napt source tinycdb\ncd tinycdb-*\/\ntime dpkg-buildpackage -us -uc -b\n<\/code><\/pre>\n<p>\n<b>The goal: Using dpkg-buildpackage with Fil-C.<\/b><br \/>\nAs root, teach dpkg basic features of the new architecture,<br \/>\nimitating the current line<br \/>\n<tt>amd64 x86_64 (amd64|x86_64) 64 little<\/tt><br \/>\nin the same file:\n<\/p>\n<pre><code>echo amd64fil0 x86_64+fil0 amd64fil0 64 little &gt;&gt; \/usr\/share\/dpkg\/cputable\n<\/code><\/pre>\n<p>\nAlso, allow <tt>apt<\/tt> to install packages compiled for this architecture<br \/>\n(beware that this will also later make <tt>apt update<\/tt> look for that architecture on servers,<br \/>\nand whimper a bit for not finding it,<br \/>\nbut nothing breaks):\n<\/p>\n<pre><code>dpkg --add-architecture amd64fil0\n<\/code><\/pre>\n<p>\nAlso, teach <tt>autoconf<\/tt> to accept amd64fil0<br \/>\n(the third of these lines is what&#8217;s critical for Debian builds):\n<\/p>\n<pre><code>sed -i '\/| x86_64 \/ a| x86_64+fil0 \\\\' \/usr\/share\/autoconf\/build-aux\/config.sub\nsed -i '\/| x86_64 \/ a| x86_64+fil0 \\\\' \/usr\/share\/libtool\/build-aux\/config.sub\nsed -i '\/| x86_64 \/ a| x86_64+fil0 \\\\' \/usr\/share\/misc\/config.sub\n<\/code><\/pre>\n<p>\n[Not necessary if you&#8217;ve used <tt>filian-install-compiler<\/tt>:]\nAs a <tt>filian<\/tt> user,<br \/>\ncompile Fil-C and its standard library:\n<\/p>\n<pre><code>cd\ngit clone https:\/\/github.com\/pizlonator\/fil-c.git\ncd fil-c\ntime .\/build_all_fast_glibc.sh\n<\/code><\/pre>\n<p>\n[Not necessary if you&#8217;ve used <tt>filian-install-compiler<\/tt>:]\nAs root,<br \/>\ncopy Fil-C and its standard library into system locations:\n<\/p>\n<pre><code>mkdir -p \/usr\/libexec\/fil\/amd64\/compiler\ntime cp -r \/home\/filian\/fil-c\/pizfix \/usr\/libexec\/fil\/amd64\/\nrm -rf \/usr\/lib\/x86_64+fil0-linux-gnu\nmv \/usr\/libexec\/fil\/amd64\/pizfix\/lib \/usr\/lib\/x86_64+fil0-linux-gnu\nln -s \/usr\/lib\/x86_64+fil0-linux-gnu \/usr\/libexec\/fil\/amd64\/pizfix\/lib\nrm -rf \/usr\/include\/x86_64+fil0-linux-gnu\nmv \/usr\/libexec\/fil\/amd64\/pizfix\/include \/usr\/include\/x86_64+fil0-linux-gnu\nln -s \/usr\/include\/x86_64+fil0-linux-gnu \/usr\/libexec\/fil\/amd64\/pizfix\/include\ntime cp -r \/home\/filian\/fil-c\/build\/bin \/usr\/libexec\/fil\/amd64\/compiler\/\ntime cp -r \/home\/filian\/fil-c\/build\/include \/usr\/libexec\/fil\/amd64\/compiler\/\ntime cp -r \/home\/filian\/fil-c\/build\/lib \/usr\/libexec\/fil\/amd64\/compiler\/\n( echo '#!\/bin\/sh'\n  echo 'exec \/usr\/libexec\/fil\/amd64\/compiler\/bin\/filcc \"$@\"' ) &gt; \/usr\/bin\/x86_64+fil0-linux-gnu-gcc\nchmod 755 \/usr\/bin\/x86_64+fil0-linux-gnu-gcc\n( echo '#!\/bin\/sh'\n  echo 'exec \/usr\/libexec\/fil\/amd64\/compiler\/bin\/fil++ \"$@\"' ) &gt; \/usr\/bin\/x86_64+fil0-linux-gnu-g++\nchmod 755 \/usr\/bin\/x86_64+fil0-linux-gnu-g++\nln -s \/usr\/libexec\/fil\/amd64\/compiler\/bin\/llvm-objdump \/usr\/bin\/x86_64+fil0-linux-gnu-objdump\nln -s x86_64+fil0-linux-gnu-gcc \/usr\/bin\/filcc\nln -s x86_64+fil0-linux-gnu-g++ \/usr\/bin\/fil++\n<\/code><\/pre>\n<p>\nNow, as user <tt>filian<\/tt> (or whichever other user),<br \/>\nlet&#8217;s make a little helper script to adjust a Debian source package:\n<\/p>\n<pre><code>mkdir -p $HOME\/bin\n( echo '#!\/bin\/sh'\n  echo 'sed -i '\\''s\/^ \\([^\"]*\\)$\/ pizlonated_\\1\/'\\'' debian\/*.symbols'\n  echo 'find . -name '\\''*.map'\\'' | while read fn'\n  echo 'do'\n  echo '  awk '\\''{'\n  echo '    if ($1 == \"local:\") global = 0'\n  echo '    if ($1 == \"}\") global = 0'\n  echo '    if (global &amp;&amp; NF &gt; 0 &amp;&amp; !index($0,\"c++\")) $1 = \"pizlonated_\"$1'\n  echo '    if ($1 == \"global:\") global = 1'\n  echo '    print'\n  echo '  }'\\''  $fn.tmp'\n  echo '  mv $fn.tmp $fn'\n  echo 'done'\n  echo 'find debian -name '\\''*.install'\\'' | while read fn'\n  echo 'do'\n  echo '  awk '\\''{'\n  echo '    if (NF == 2 &amp;&amp; $2 == \"usr\/include\") $2 = $2\"\/${DEB_HOST_MULTIARCH}\"'\n  echo '    if (NF == 1 &amp;&amp; $1 == \"usr\/include\") { $2 = $1\"\/${DEB_HOST_MULTIARCH}\"; $1 = $1\"\/*\" }'\n  echo '    print'\n  echo '  }'\\''  $fn.tmp'\n  echo '  mv $fn.tmp $fn'\n  echo 'done'\n) &gt; $HOME\/bin\/fillet\nchmod 755 $HOME\/bin\/fillet\n<\/code><\/pre>\n<p>And now let&#8217;s try building a small package:<\/p>\n<pre><code>mkdir -p ~\/shared\/packages\ncd ~\/shared\/packages\napt source tinycdb\ncd tinycdb-*\/\n$HOME\/bin\/fillet\ntime env DPKG_GENSYMBOLS_CHECK_LEVEL=0 \\\n  DEB_BUILD_OPTIONS='crossbuildcanrunhostbinaries nostrip' \\\n  dpkg-buildpackage -d -us -uc -b -a amd64fil0\n<\/code><\/pre>\n<p>\nExplanation of the differences from a normal build:\n<\/p>\n<ul>\n<li>\n<tt>DEB_BUILD_OPTIONS=nostrip<\/tt> skips removing symbols from binaries,<br \/>\nin part because Debian&#8217;s <tt>dh_dwz<\/tt> utility doesn&#8217;t currently work with Fil-C,<br \/>\nin part because we&#8217;ll look at symbols later.\n<\/li>\n<li>\n<tt>DEB_BUILD_OPTIONS=crossbuildcanrunhostbinaries<\/tt> silences a warning<br \/>\nabout cross-compilation not necessarily working with tests.\n<\/li>\n<li>\n<tt>-a amd64fil0<\/tt> specifies the <tt>amd64fil0<\/tt> ABI,<br \/>\nwhich triggers using the <tt>x86_64+fil0-linux-gnu-gcc<\/tt> compiler.\n<\/li>\n<li>\n<tt>-d<\/tt> stops <tt>dpkg-buildpackage<\/tt><br \/>\nfrom checking for dependencies.<br \/>\n(This doesn&#8217;t matter for this package.)\n<\/li>\n<li>\n[Superseded by the <tt>binutils<\/tt> patch in in <tt>filian-install-compiler<\/tt> starting with version 20251030:]\nThe tweak to <tt>*.map<\/tt> in the helper script<br \/>\ntries to stop Debian from hiding the shared-library symbols after Fil-C mangling.\n<\/li>\n<li>\nThe tweak to <tt>*.symbols<\/tt> in the helper script<br \/>\ntries to notify Debian regarding the expected shared-library symbols after Fil-C mangling.<br \/>\n[Not necessary given <tt>DPKG_GENSYMBOLS_CHECK_LEVEL=0<\/tt>.]\n<\/li>\n<li>\n<tt>DPKG_GENSYMBOLS_CHECK_LEVEL=0<\/tt><br \/>\nshould stop Debian from complaining that there are wrong symbols.\n<\/li>\n<li>\n[Not necessary if you&#8217;ve used <tt>filian-install-compiler<\/tt>:]\nThe tweak to <tt>*.install<\/tt> in the helper script<br \/>\ninstalls <tt>\/usr\/include\/x86_64+fil0\/cdb.h<\/tt><br \/>\n(where Fil-C will see it for programs using this library)<br \/>\ninstead of <tt>\/usr\/include\/cdb.h<\/tt>.\n<\/li>\n<\/ul>\n<p>\nFor me this worked and produced three <tt>..\/*.deb<\/tt> packages.<br \/>\nInstalling them as root also worked:\n<\/p>\n<pre><code>apt install \/home\/filian\/shared\/packages\/*.deb\n# some sanity checks:\napt list | grep tinycdb\n# prints \"tinycdb\/stable 0.81-2 amd64\" (available package)\n# and prints \"tinycdb\/now 0.81-2 amd64fil0 [installed,local]\"\ndpkg -L tinycdb:amd64fil0\n# lists various files such as \/usr\/bin\/cdb\nnm \/usr\/bin\/cdb\n# shows various symbols including \"pizlonated\" (Fil-C) symbols\nldd \/usr\/bin\/cdb\n# shows dependence on libraries in \/usr\/libexec\/fil\n\/usr\/bin\/cdb -h\n# prints a help message: \"cdb: Constant DataBase\" etc.\n<\/code><\/pre>\n<p>\nCompiling a deliberately wrong test program<br \/>\nwith the newly installed library also works,<br \/>\nand triggers Fil-C&#8217;s run-time protection:\n<\/p>\n<pre><code>cd \/root\n( echo '#include <cdb.h>'\n  echo 'int main() { cdb_init(0,0); return 0; }' ) &gt; usecdb.c\nfilcc -o usecdb usecdb.c -lcdb\n.\/usecdb <\/cdb.h><\/code><\/pre>\n<p>\n<b>libc-dev.<\/b><br \/>\nSome packages depend on libc-dev,<br \/>\nso let&#8217;s build a fake libc-dev package<br \/>\n(probably there&#8217;s an easier way to do this):\n<\/p>\n<pre><code>FAKEPACKAGE=libc-dev\nmkdir -p ~\/shared\/packages\/$FAKEPACKAGE\/debian\ncd ~\/shared\/packages\/$FAKEPACKAGE\n( echo $FAKEPACKAGE' (0.0) unstable; urgency=medium'\n  echo ''\n  echo '  * Initial Release.'\n  echo ''\n  echo ' -- djb <djb>  Sun, 26 Oct 2025 16:05:17 +0000'\n) &gt; debian\/changelog\n( echo 'Source: '$FAKEPACKAGE\n  echo 'Build-Depends: debhelper-compat (= 13)'\n  echo 'Maintainer: djb <djb>'\n  echo ''\n  echo 'Package: '$FAKEPACKAGE\n  echo 'Architecture: any'\n  echo 'Multi-Arch: same'\n  echo 'Description: fake '$FAKEPACKAGE\n) &gt; debian\/control\n( echo '#!\/usr\/bin\/make -f'\n  echo ''\n  echo 'build-arch   build-indep   build \\'\n  echo 'install-arch install-indep install \\'\n  echo 'binary-arch  binary-indep  binary \\'\n  echo ':'\n  echo 'Xdh $@' | tr X '\\011'\n  echo ''\n  echo 'clean:'\n  echo 'Xdh_clean' | tr X '\\011'\n) &gt; debian\/rules\ntime env DPKG_GENSYMBOLS_CHECK_LEVEL=0 \\\n  DEB_BUILD_OPTIONS='crossbuildcanrunhostbinaries nostrip' \\\n  dpkg-buildpackage -d -us -uc -b -a amd64fil0\n<\/djb><\/djb><\/code><\/pre>\n<p>\n<b>ncurses.<\/b>\n<\/p>\n<pre><code>mkdir -p ~\/shared\/packages\ncd ~\/shared\/packages\napt source ncurses\ncd ncurses-*\/\n$HOME\/bin\/fillet\ntime env DPKG_GENSYMBOLS_CHECK_LEVEL=0 \\\n  DEB_BUILD_OPTIONS='crossbuildcanrunhostbinaries nostrip' \\\n  dpkg-buildpackage -d -us -uc -b -a amd64fil0\nrm ..\/ncurses-*deb # apt won't let us touch the binaries\n<\/code><\/pre>\n<p>\nAs root, install the above libraries:\n<\/p>\n<pre><code>apt install \/home\/filian\/shared\/packages\/lib*.deb\n<\/code><\/pre>\n<p>\n<b>libmd.<\/b><br \/>\nSeems to work.<br \/>\nAt first this didn&#8217;t install<br \/>\nsince the compiled version (for amd64fil0) was 1.1.0-2<br \/>\nwhile the installed version (for amd64) was 1.1.0-2+b1.<br \/>\nDebian requires the same version number across architectures<br \/>\n(see above regarding include-file compatibility),<br \/>\nso <tt>apt<\/tt> said that 1.1.0-2+b1 breaks 1.1.0-2.<br \/>\nI resolved this by compiling and installing 1.1.0-2 for both amd64 and amd64fil0.<br \/>\nThis is a downgrade since &#8220;+b&#8221; refers to<br \/>\na &#8220;binNMU&#8221;, a &#8220;binary-only non-maintainer upload&#8221;,<br \/>\na patch beyond the official source;<br \/>\nI don&#8217;t know what the patch is.\n<\/p>\n<p>\n<b>readline.<\/b><br \/>\nNeeds<br \/>\n<tt>ln -s \/usr\/include\/readline \/usr\/include\/x86_64+fil0-linux-gnu\/readline<\/tt><br \/>\nafter installation.<br \/>\nCould have tweaks in <tt>debian\/rules<\/tt><br \/>\n(which seems to predate <tt>*.install<\/tt>),<br \/>\nbut this is in any case an example of the messiness that I&#8217;m planning to get rid of.\n<\/p>\n<p>\n<b>lua5.4.<\/b><br \/>\nSeems to work.<br \/>\nDepends on readline.\n<\/p>\n<p><\/body>\n<\/div>\n\n<br \/><a href=\"https:\/\/cr.yp.to\/2025\/fil-c.html\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"I&#8217;m impressed with the level of compatibility of the new memory-safe C\/C++ compiler Fil-C (filcc, fil++) [&hellip;]","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-22049","post","type-post","status-publish","format-standard","hentry","category-hatena-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Notes by djb on using Fil-C (2025) - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cr.yp.to\/2025\/fil-c.html\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Notes by djb on using Fil-C (2025) - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"I&#8217;m impressed with the level of compatibility of the new memory-safe C\/C++ compiler Fil-C (filcc, fil++) [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cr.yp.to\/2025\/fil-c.html\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-03T04:47:50+00:00\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/cr.yp.to\\\/2025\\\/fil-c.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/22049\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"Notes by djb on using Fil-C (2025)\",\"datePublished\":\"2025-11-03T04:47:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/22049\\\/\"},\"wordCount\":2320,\"articleSection\":[\"\u306f\u3066\u306a\u30d6\u30ed\u30b0\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/22049\\\/\",\"url\":\"https:\\\/\\\/cr.yp.to\\\/2025\\\/fil-c.html\",\"name\":\"Notes by djb on using Fil-C (2025) - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"datePublished\":\"2025-11-03T04:47:50+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/cr.yp.to\\\/2025\\\/fil-c.html#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/cr.yp.to\\\/2025\\\/fil-c.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/cr.yp.to\\\/2025\\\/fil-c.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Notes by djb on using Fil-C (2025)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Notes by djb on using Fil-C (2025) - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cr.yp.to\/2025\/fil-c.html","og_locale":"ja_JP","og_type":"article","og_title":"Notes by djb on using Fil-C (2025) - \u30dd\u30b1\u30b3\u30f3","og_description":"I&#8217;m impressed with the level of compatibility of the new memory-safe C\/C++ compiler Fil-C (filcc, fil++) [&hellip;]","og_url":"https:\/\/cr.yp.to\/2025\/fil-c.html","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-11-03T04:47:50+00:00","author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"17\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cr.yp.to\/2025\/fil-c.html#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/22049\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"Notes by djb on using Fil-C (2025)","datePublished":"2025-11-03T04:47:50+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/22049\/"},"wordCount":2320,"articleSection":["\u306f\u3066\u306a\u30d6\u30ed\u30b0"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/22049\/","url":"https:\/\/cr.yp.to\/2025\/fil-c.html","name":"Notes by djb on using Fil-C (2025) - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"datePublished":"2025-11-03T04:47:50+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/cr.yp.to\/2025\/fil-c.html#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cr.yp.to\/2025\/fil-c.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/cr.yp.to\/2025\/fil-c.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"Notes by djb on using Fil-C (2025)"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/22049","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=22049"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/22049\/revisions"}],"predecessor-version":[{"id":22050,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/22049\/revisions\/22050"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=22049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=22049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=22049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}