MLIBC es una biblioteca estándar C totalmente destacada diseñada con la portabilidad en mente.
Apoyamos una serie de arquitecturas (x86-64, AARCH64, RISC-V, IA-32, M68K), y proporcionan una capa limpia de abstracción SYScall para que se conecten nuevos puertos del sistema operativo.
A diferencia de otras bibliotecas estándar de C portátiles como NewLib, apuntamos a la paridad de funciones con GLIBC/MUSL, es decir, soporte completo de PTHREAD y extensiones GNU.
MLIBC es lo suficientemente capaz como para ejecutar una gama de software, incluidos Xorg, varios compositores de Wayland, MESA y navegadores web como WebKitGTK, aunque todavía faltan algunas características.
Los sistemas operativos individuales pueden optar dentro o fuera de ciertas características según lo desee; Por ejemplo, las API POSIX como pthread están cerradas detrás de la 'opción' de Posix, las API de Linux como epoll están cerradas detrás de la opción Linux, etc.
Servidor oficial de Discord: https://discord.gg/7wb6ur3
Paquete AUR (proporciona mlibc-gcc ): https://aur.archlinux.org/packages/mlibc
| Directorio | Objetivo |
|---|---|
options/ | (Más o menos) encabezados y código independientes del sistema operativo.options/ se divide en subdirectorios que pueden ser habilitados o deshabilitados por puertos. |
sysdeps/ | Encabezados y código específicos del sistema operativo.sysdeps/ se divide en subdirectorios por puerto. Exactamente uno de esos subdirectorios está habilitado en cada compilación. |
abis/ | Encabezados de interfaz específicos del sistema operativo ("Encabezados ABI"). Esos contienen las constantes y estructuras de la interfaz OS. Por ejemplo, los valores numéricos de SEEK_SET o O_CREAT viven aquí, así como estructuras como struct stat . Los encabezados ABI solo pueden contener constantes, estructuras y sindicatos, pero no hay declaraciones de función o lógica.abis/ se divide en subdirectorios Per-OS, pero esta división es solo para fines organizativos. Los puertos aún pueden mezclar encabezados de diferentes abis/ subdirectorios. |
Los puertos a los nuevos sistemas operativos son bienvenidos. Para puerto MLIBC a otro sistema operativo, se deben realizar los siguientes cambios:
sysdeps/ subdirectorio sysdeps/some-new-os/ y un meson.build para compilarlo. Integre sysdeps/some-new-os/meson.build en el toplevel meson.build .abis/some-new-os/ . Agregue enlaces simbólicos en sysdeps/some-new-os/include/abi-bits a sus encabezados ABI. Mire los puertos existentes para descubrir los encabezados ABI requeridos para las opciones habilitadas por sysdeps/some-new-os/meson.build .sysdeps/some-new-os/ , Agregue el código a implementar (un subconjunto de) las funciones de options/internal/include/mlibc/internal-sysdeps.hpp . El subconjunto que necesita depende de las opciones que habilite sysdeps/some-new-os/meson.build . Recomendamos que los nuevos puertos no se construyan de master , ya que ocasionalmente realizamos cambios internos que causan que se rompan los sistemas fuera del árbol. En su lugar, le recomendamos que suija una versión específica (o confirmación), o para aguas arriba sus cambios en este repositorio para que podamos construirlos en nuestro CI y, por lo tanto, cualquier rotura será solucionada por el árbol.
Se aceptan las siguientes opciones personalizadas de Meson, además de las opciones incorporadas. Las opciones a continuación son booleanos que predeterminan en falso (ver meson_options.txt ).
headers_only : solo instale encabezados; No construyas libc.so o ld.sono_headers : no instale encabezados; solo construya libc.so y ld.sobuild_tests : construya el conjunto de pruebas (ver más abajo).x_option : Habilitar el componente x de la funcionalidad MLIBC. Ver meson_options.txt para una lista completa de valores posibles para x . Esto puede usarse para deshabilitar las extensiones POSIX y GLIBC.linux_kernel_headers : permite dirigir MLIBC a los encabezados de Linux instalados. Estos se pueden obtener fácilmente, colocados en un directorio y esta opción se establece en la ruta correspondiente. Esto es necesario si la opción Linux está habilitada, es decir, cuando la opción Linux no está deshabilitada.debug_allocator : reemplace el asignador normal con un asignador de depuración (consulte mlibc/options/internal/generic/allocator.cpp para detalles de implementación).use_freestnd_hdrs : use freestnd-c {, xx} -hdrs en lugar de buscar encabezados del compilador. Útil si no usa un compilador con el objetivo correcto Triple. El tipo de biblioteca que se construirá (estático, compartido o ambos) está controlado por la opción default_library de Meson. Pasando -Ddefault_library=static desactiva efectivamente el enlazador dinámico.
También admitimos la construcción con -Db_sanitize=undefined para usar UBSAN dentro de MLIBC. Tenga en cuenta que esto no permite UBSAN para aplicaciones externas que se vinculan con libc.so , pero puede ser útil durante el desarrollo detectar errores internos (por ejemplo, al agregar nuevos sysdeps).
Para formatear su código antes de enviar un PR, debe instalar pre-commit . Luego, haga pre-commit install para instalar el gancho Git que se ejecuta cada vez que se compromete. Alternativamente, puede hacer pre-commit run -a para formatear manualmente todos los archivos.
La suite de prueba mlibc se puede ejecutar bajo un host de Linux. Para hacer esto, primero instale un conjunto de encabezados del núcleo (como se describe aquí), luego se ejecute desde la raíz del proyecto:
meson setup -Dbuild_tests=true -Dlinux_kernel_headers=/path/to/kernel/headers/include build
Esto creará un directorio build . Luego, cd build y ejecute las pruebas (que muestran salida) con:
meson test -v