Portar la biblioteca estándar de Go a entornos sin sistema operativo

Fuentes: Going freestanding

Un programador que creó Solod, un Subconjunto de Go que se traduce a C, ha logrado portar 37 paquetes de la biblioteca estándar de Go, de los cuales 31 funcionan en modo freestanding, es decir, sin depender de ninguna implementación de libc ni de un sistema operativo concreto. El artículo describe las técnicas empleadas para conseguirlo, dirigidas principalmente a entornos como microcontroladores, sandboxes de WebAssembly y kernels.

El primer paso consiste en distinguir entre entornos hosted y freestanding mediante la macro STDC_HOSTED, definiendo un encabezado común (builtin.h) que incluye los headers disponibles en cada caso. A continuación se aprovechan los builtins del compilador (GCC y Clang) para obtener ciertas funciones sin libc: __builtin_trap para panics, __builtin_alloca para asignaciones en la pila con un límite configurable (64 KB por defecto), y las familias __builtin_memcpy, __builtin_memmove, __builtin_memset y __builtin_memcmp para operaciones de memoria, aunque estas últimas deben proporcionarse manualmente porque el compilador puede emitirlas implícitamente.

En WebAssembly, memcpy, memmove y memset se reducen a las instrucciones memory.copy y memory.fill, mientras que memcmp permanece como llamada a función. Para otras arquitecturas, cadenas de herramientas como zig cc ya las aportan; si no, se ofrece una implementación en C puro. En operaciones atómicas se usan los builtins __atomic_xxx, que operan sobre objetos normales en lugar de _Atomic. El autor reconoce que no hay nada genuinamente novedoso, pero considera útil documentar el enfoque para futuras referencias y para quien esté interesado en programación de bajo nivel.