Hacker News new | ask | show | jobs
by Wowfunhappy 1874 days ago
Pretty please, tell me how to compile static binaries and I’ll do that forever. I always end up with certain external libraries still being required.
3 comments

You need to compile a static executable (not with static libraries, there's a subtle difference). The flags depend on your compiler.

If you're on Linux, musl libc and musl-tools are useful for dealing with this reliably.

> You need to compile a static executable

This is functionally impossible on $ISA-linux-gnu, because the glibc developers refuse to provide a working C standard library (libc.a).

> musl libc and musl-tools are useful

Sure, but if the software worked (/reliably) with musl, we'd be using that already.

Step 3b is to make sure you don't use libraries that themselves cannot be fully statically linked (hello, GTK!).

It's cool that they use run-time dynamic loading to "modularize" certain features (such as image loading), but it seriously damages the benefits of static linkage.

GTK can be statically linked.

Example executable:

https://github.com/nh2/static-haskell-nix/releases/tag/c-sta...

It lost this ability temporarily when switching to Meson, but I fixed it in GTK3 and GTK4. But I just checked and apparently it is broken again:

https://gitlab.gnome.org/GNOME/gtk/-/issues/3774#note_109746...

Oh, that's right. There's some option to build all modules as static libs or include them in the main .a ... sorry, I forgot about that.

Did GTK3 or GTK4 ever become relocatable on Linux?

Use Cosmopolitan Libc. Everything is statically linked. See for example https://justine.lol/redbean/index.html don't you want binaries like that?