Hacker News new | ask | show | jobs
by Someone 13 days ago
FTA: “Lone is a lisp interpreter written in freestanding C. There is no dynamic memory allocation in freestanding C. There is no such thing as malloc. There is no libc. There is only me and the code. If I wanted malloc, I would have to write it myself.

[…]

mmap is awesome but Linux's got something even more awesome: mremap, which makes it almost trivial to manage the page-based heap.“*

⇒ they are using “freestanding” in a non-standard way. Usually, it means running on bare metal without an OS (https://en.wikipedia.org/wiki/Standalone_program: “A standalone program, also known as a freestanding program, is a computer program that does not load any external module, library function or program and that is designed to boot with the bootstrap procedure of the target processor – it runs on bare metal”

2 comments

Freestanding as in freestanding C. Lone passes the -ffreestanding -nostdlib flags. No external modules, libraries, functions or programs are loaded by the interpreter.

It's true that lone doesn't run on bare metal. I chose Linux for pragmatic and philosophical reasons. I'm not sure lone would ever have printed hello world if I hadn't chosen to build on top of Linux, which is also the only kernel with a stable binary interface. No other system lets you avoid the libc.

Of course you’re free to make your own choices, but I find it weird to accept relying on many lines of Linux kernel code and then not wanting to reuse a relatively small number of lines of an existing malloc.

The reverse (running on bare metal and tweaking an existing malloc to run on it) looks way more logical to me.

> No other system lets you avoid the libc.

On most OSes [1] it’s relatively easy to write a libOS that just wraps the system calls. Your only dependency would be on the mapping to syscall numbers.

[1] OpenBSD is/may be (I don’t know the status of these) an exception. See https://man.openbsd.org/pinsyscalls.2, https://lwn.net/Articles/949078/

> Your only dependency would be on the mapping to syscall numbers.

These are unstable in every operating system other than Linux.

I've written about it:

https://www.matheusmoreira.com/articles/linux-system-calls

Linux is the only kernel that promises stability in this area. On every other operating system, one must program against the system libraries.

They're using "freestanding" as in "-ffreestanding" [0].

"C built to compile with freestanding mode", rather than "C built to run bare metal".

[0] https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#in...