← Back to context

Comment by yjftsjthsd-h

2 years ago

All software needs dependencies at build time, saying no dependencies always means runtime.

I'm surprised the Kernel doesn't count here.

  • It does.

    Writing your software to directly use the syscalls of a specific kernel does not make it "zero dependency", it makes it "one dependency" - and non-portable.

    The author elaborates on their rationale and the technical details in a blog post: <https://www.matheusmoreira.com/articles/linux-system-calls>

    TBH I have mixed feelings about this approach. It's true that this is more or less what Go or (Cosmopolitan libc) do, but the motivation in their case is to maximize portability (by making cross-compilation trivial). However when you #include <linux/...>, you not only make your software non-portable, you also make it a PITA to cross-compile as you need the kernel headers on the host machine.

    In contrast, with Go or cosmo, I can trivially build a tiny /sbin/init for amd64 Linux, pack it up with cpio, and run it with qemu-system-x86_64 -initrd - all from a Mac/arm64 host.

    • > However when you #include <linux/...>, you not only make your software non-portable, you also make it a PITA to cross-compile as you need the kernel headers on the host machine.

      Yes, that is certainly a problem that I need to solve.

      I added some support for cross compilation in the makefile. It currently requires clang for that.

        ifdef TARGET
          ifndef UAPI
            $(error UAPI must be defined when cross compiling)
          endif
      
          TARGET.triple := $(TARGET)-unknown-linux-elf
          override CC := clang -target $(TARGET.triple)
        else
          TARGET := $(shell uname -m)
        endif
      

      With this, I was able to cross compile lone for x86_64 from within the Termux environment of my aarch64 smartphone. All I had to do was obtain the Linux user space API headers for x86_64. Getting those headers was somewhat annoying but doable, there are packages for them in many Linux distributions.

      I made a Termux package request for multiplatform Linux UAPI headers specifically so I could cross compile lone but unfortunately it was rejected.

      https://github.com/termux/termux-packages/issues/16069

    • Surely its more than one dependency. For example, you'll need a processor. Not just any processor, but a processor for which a C compiler has been written.

      3 replies →

  • At that point we really get into semantics... But now that you mention it, I would be interested to see if it could be built with APE to benefit from their bare metal support.