Conoce la nueva versión de Cosmopolitan 2.0, la biblioteca C estándar multiplataforma

agosto 24, 2022 0 Comments

Se dio a conocer el lanzamiento de la nueva versión del proyecto «Cosmopolitan 2.0», que desarrolla una biblioteca C estándar y un formato de archivo ejecutable universal que se puede usar para distribuir programas para diferentes sistemas operativos sin el uso de intérpretes y máquinas virtuales.

El contenedor para generar archivos ejecutables universales se basa en combinar segmentos y encabezados específicos de diferentes sistemas operativos en un archivo, combinando varios formatos diferentes utilizados en Unix, Windows y macOS.

Para garantizar que un solo ejecutable se ejecute en sistemas Windows y Unix, se usa un truco para codificar archivos de Windows PE como un script de shell, aprovechando el hecho de que Thompson Shell no usa el marcador de script «#!».

Para crear programas que incluyan varios archivos (combinando todos los recursos en un solo archivo), se admite generar un archivo ejecutable en forma de un archivo ZIP especialmente diseñado. Esquema del formato propuesto (ejemplo aplicación hello.com ):

La llamada qemu-x86_64 se proporciona para una portabilidad adicional y permite que el código compilado para la arquitectura x86_64 se ejecute en plataformas que no sean x86, como placas Raspberry Pi y dispositivos Apple equipados con procesadores ARM. El proyecto también se puede utilizar para crear aplicaciones independientes que funcionan sin un sistema operativo (bare metal). En tales aplicaciones, se adjunta un gestor de arranque al archivo ejecutable y el programa actúa como un sistema operativo de arranque.

Principales novedades de Cosmopolitan 2.0

En esta nueva versión se destaca que se ha cambiado el esquema para acceder a los recursos internos dentro de un archivo zip (al abrir archivos, ahora se usan las rutas habituales /zip/… en lugar de usar el prefijo zip:..). De manera similar, para acceder a los discos en Windows, es posible usar rutas como «/c/…» en lugar de «C:/…».

Se propone un nuevo cargador APE (Actually Portable Executable), que define el formato de los archivos ejecutables universales. El nuevo gestor de arranque utiliza mmap para asignar el programa a la memoria y ya no cambia el contenido sobre la marcha. Si es necesario, el ejecutable universal se puede convertir en ejecutables regulares vinculados a plataformas individuales.

En Linux, es posible usar el módulo del kernel binfmt_misc para ejecutar programas APE. Se observa que el uso de binfmt_misc es el método de inicio más rápido, ademas de que se propone una implementación de la funcionalidad de las llamadas al sistema pledge() y unveil(), desarrolladas por el proyecto OpenBSD, asi como tambien se destaca que se proporciona una API para usar datos de llamadas en programas C, C++, Python y Redbean, así como una utilidad de promise.com para aislar procesos arbitrarios.

Tambien podremos encontrar que para Linux, el rendimiento de las llamadas clock_gettime y gettimeofday se ha incrementado hasta 10 veces debido al uso del mecanismo vDSO (objeto compartido dinámico virtual), que permite transferir el controlador de llamadas del sistema al espacio del usuario y evitar el contexto de interruptores.

La compilación utiliza Landlock Make, una edición de GNU Make con una verificación de dependencias más estricta y el uso de la llamada al sistema Landlock para aislar el programa del resto del sistema y mejorar la eficiencia del almacenamiento en caché. Como opción, se conserva la capacidad de compilación y el GNU Make habitual.

Por otra parte, tambien se destacan las funciones implementadas para subprocesos múltiples: _spawn() y _join(), que son enlaces universales sobre API específicas para diferentes sistemas operativos. También se está trabajando para implementar soporte para subprocesos POSIX.

De los demás cambios que se destacan:

  • Se agregó soporte para las opciones «–ftrace» y «–strace» a los archivos ejecutables para enviar a stderr información sobre todas las llamadas a funciones y llamadas al sistema.
  • Se agregó soporte para la llamada al sistema closefrom() compatible con Linux 5.9+, FreeBSD 8+ y OpenBSD.
  • Las funciones matemáticas para trabajar con números complejos se han movido de la biblioteca Musl.
  • Muchas funciones matemáticas se han acelerado.
  • Se propone la función nointernet(), que desactiva las capacidades de red.
  • Se agregaron nuevas funciones para agregar cadenas de manera eficiente: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf y vappendf.
  • Se ha agregado una versión protegida de la familia de funciones kprintf(), diseñada para trabajar con privilegios elevados.
  • Rendimiento significativamente mejorado de las implementaciones de SSL, SHA, curve25519 y RSA.

Finalmente, si estás interesado en poder conocer más al respecto debes saber que el código del proyecto se distribuye bajo la licencia ISC (versión simplificada de MIT/BSD).


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.