Show HN: A 166 KB file for cross compiling glibc for any version, any target
Some context:<p>In master branch of Zig right now (before <a href="https://github.com/ziglang/zig/pull/10330" rel="nofollow">https://github.com/ziglang/zig/pull/10330</a> is merged), status quo:<p><pre><code>    $ cat ../lib/libc/glibc/*.txt | wc -c
    205219
    $ cat ../lib/libc/glibc/*.txt | xz | wc -c
    22976
</code></pre>
Zig supports targeting every version of glibc for any target architecture. The information required to do this takes up 200 KB installation size / 22 KB tarball size, and it has the following problems (which are causing several bugs):<p>* fails to represent symbols that migrate from one library to another between glibc versions<p>* fails to represent a distinction between functions and objects<p>* fails to represent object sizes<p>With this new glibc-abi-tool:<p><pre><code>    $ cat abilists | wc -c
    169421
    $ cat abilists | xz | wc -c
    24880
</code></pre>
165 KB installation size / 24 KB tarball size, and all the above issues are solved. It also should be slightly faster to load/parse for the compiler since it is fewer KB to load from disk.<p>The code that uses this file is here: <a href="https://github.com/ziglang/zig/blob/0d7331b6f6af85bd45829514668075c8a9910019/src/glibc.zig#L681-L1010" rel="nofollow">https://github.com/ziglang/zig/blob/0d7331b6f6af85bd45829514...</a>
It creates c.s, pthread.s, dl.s, etc., which are assembled into libc.so, libpthread.so, libdl.so, etc., which are placed on the linker line when cross compiling. Thanks to this improved dataset, they can now accurately model the glibc that will be on any CPU architecture, any glibc version.<p>If I just naively shipped every version of the .abilist files:<p><pre><code>    $ cat (find glibc/ -name "*.abilist") | wc -c
    37041906
    $ cat (find glibc/ -name "*.abilist") | xz | wc -c
    205036
</code></pre>
...it would be 35 MiB installation size, 200 KB tarball size. So I have effectively achieved a compression ratio of 219:1 by implementing a bespoke encoding of this information.