libc de Artistry Ingreded es una implementación de biblioteca estándar de C despectivas dirigida a sistemas integrados basados en microcontroladores.
Para conservar preciosos recursos de memoria, esta biblioteca no suministra la implementación completa de la biblioteca estándar C. En cambio, se ha seleccionado un subconjunto de funciones que son útiles en los sistemas integrados de metal desnudo. Si tiene un sistema integrado de metal desnudo o RTOS, ¡esta biblioteca es para usted!
A diferencia de muchas otras bibliotecas C que he encontrado, esta biblioteca implementa pruebas unitarias y ha abordado fallas de larga data en implementaciones de código abierto de las funciones de biblioteca estándar C. Continuamente estamos agregando pruebas y realizando mejoras adicionales sobre las implementaciones de línea de base.
malloc y free no están incluidos en esta biblioteca. Si necesita soporte de asignación de memoria dinámica, deberá acoplar esta biblioteca con algo como libmemory de Artistry Ingredido, que contiene implementaciones de malloc y free .
Si está interesado en contribuir a este proyecto, lea la guía CONTRIBUTING .
libc de Artistry integrado está destinado a proporcionar un conjunto portátil de funciones útiles de biblioteca estándar C que permita obtener rápidos sistemas integrados con metales desnudos y RTOS.
Además, queremos proporcionar una implementación libc de alta calidad asegurando que cada función tenga cobertura de prueba unitaria y aborde fallas expuestas por el analizador estático. Muchas implementaciones de la función de la biblioteca C permanecen sin probar y contienen errores. Estamos luchando contra las malas implementaciones.
Para conservar la memoria, esta biblioteca no suministra la funcionalidad completa de la biblioteca estándar C. En cambio, se ha seleccionado un subconjunto de funciones que son útiles en los sistemas integrados de metal desnudo. Esta selección ha sido impulsada principalmente por mi propia experiencia en el desarrollo centrado en el microcontrolador. Si necesita funciones adicionales, presente un problema y haga una solicitud de función.
Las implementaciones funcionales en esta biblioteca se han seleccionado para la portabilidad y la incorporación rápida de nuevos sistemas. Puede haber implementaciones más eficientes para estas funciones, pero a menudo son implementaciones específicas de arquitectura. Si tiene sugerencias para mejorar el rendimiento, siempre estamos felices de escucharlas.
malloc y free no están incluidos en esta biblioteca. Debido a que los esquemas de asignación de memoria varían mucho con los sistemas integrados (algunos que ni siquiera permiten la memoria dinámica), deberá suministrar sus propias implementaciones en función de las necesidades de su sistema. Puede acoplar esta biblioteca con el Artistry libmemory de arte integrado, que contiene implementaciones de malloc y free .
Esta biblioteca proporciona una implementación de suficiencia completa para compilar y vincular libc++ y libc++abi de Clang (ver Proyecto LibCPP de Artistismo integrado). Para lograr esto, algunas funciones solo se definen en los encabezados pero no tienen una implementación. Las funciones no compatibles pero definidas se pueden eliminar utilizando una opción de compilación ( hide-unimplemented-libc-apis ).
Se han implementado las siguientes partes de la biblioteca C:
assertcrt.c , exit , atexit , etc.)atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrandreallocstrtoX (muchas a través de gdtoa )printf Family (la mayoría a través de embeddedartistry/printf , basado en eyalroz/printf y originalmente mpaland/printf )putcharputstime y asctime()wchar y funciones wctype Además, esta biblioteca proporciona implementaciones para __stack_chk_guard y __stack_chk_fail .
Actualmente se admiten las siguientes arquitecturas:
Se deben agregar las siguientes pruebas unitarias:
reallocrandEstos no son implementados por se pueden agregar en el futuro:
wcharerrno (habilitado como un interruptor de tiempo de compilación)getopttimeFILE y funciones adicionales de stdioActualmente no estamos planeando el soporte completo para:
localeEste proyecto utiliza el sistema de compilación Meson Standard Meson de Artistry integrado, y las dependencias se describen en detalle en nuestro sitio web.
Como mínimo necesitarás:
git-lfs , que se utiliza para almacenar archivos binarios en este repositorio Este proyecto almacena algunos archivos utilizando git-lfs .
Para instalar git-lfs en Linux:
sudo apt install git-lfs
Para instalar git-lfs en MacOS:
brew install git-lfs
Se pueden encontrar instrucciones de instalación adicionales en el sitio web git-lfs .
El sistema de construcción de Meson depende de python3 y ninja-build .
Para instalar en Linux:
sudo apt-get install python3 python3-pip ninja-build
Para instalar en OSX:
brew install python3 ninja
Meson se puede instalar a través de pip3 :
pip3 install meson
Si desea instalar Meson a nivel mundial en Linux, use:
sudo -H pip3 install meson
Este proyecto usa git-lfs , así que instálelo antes de clonarse. Si clonó antes de instalar git-lfs , simplemente ejecute git lfs pull después de la instalación.
Este proyecto está alojado en GitHub. Puede clonar el proyecto directamente usando este comando:
git clone --recursive [email protected]:embeddedartistry/libc.git
Si no clona recursivamente, asegúrese de ejecutar el siguiente comando en el repositorio o su compilación fallará:
git submodule update --init
Si se instala la marca, la biblioteca se puede construir emitiendo el siguiente comando:
make
Esto construirá todos los objetivos para su arquitectura actual.
Puedes limpiar las compilaciones usando:
make clean
Puede eliminar la carpeta buildresults generada usando:
make distclean
También puede usar meson directamente para compilar.
Crear una carpeta de salida de compilación:
meson buildresults
Y construir todos los objetivos ejecutando
ninja -C buildresults
La compilación cruzada se maneja con archivos Cross meson . Los archivos de ejemplo se incluyen en la carpeta build/cross . Puede escribir sus propios archivos cruzados para su procesador específico definiendo la cadena de herramientas, los indicadores de compilación y los indicadores de enlace. Estas configuraciones se utilizarán para compilar libc . (o abrir un problema y podemos ayudarlo).
La compilación cruzada debe configurarse utilizando el comando Meson al crear la carpeta de salida de compilación. Por ejemplo:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
Después de eso, puede ejecutar make (en la raíz del proyecto) o ninja para construir el proyecto.
Las pruebas no serán compiladas. Solo se construirán para la plataforma nativa.
Las instrucciones completas para construir el proyecto, el uso de cadenas de herramientas alternativas y la ejecución de herramientas de soporte se documentan en el sistema de compilación Meson estandarizado de Artistry integrado en nuestro sitio web.
El código independiente de posición (PIC) está habilitado de forma predeterminada, pero se puede deshabilitar durante la etapa de configuración de Meson configurando la opción integrada b_staticpic en false :
meson buildresults -Db_staticpic=false
La optimización del tiempo de enlace (LTO) se puede habilitar durante la etapa de configuración de Meson configurando la opción incorporada b_lto en true :
meson buildresults -Db_lto=true
Esto se puede combinar con otras opciones de compilación.
Si no usa meson para su proyecto, el mejor método para usar este proyecto es construirlo por separado y copiar los encabezados y los contenidos de la biblioteca en su árbol de origen.
include/ directorio en su árbol de origen.buildresults/srcEjemplo de banderas de enlazador:
-Lpath/to/libc.a -lc
Si está usando meson , puede usar libc como subproyecto. Colóquelo en su directorio de su subproyecto de elección y agregue una declaración subproject :
libc = subproject('libc')
Deberá promover la variable de dependencia de subproject deseada a su proyecto:
libc_dep = libc.get_variable('libc_dep')
Puede usar la dependencia de la configuración de su biblioteca de destino en sus declaraciones executable u otras dependencias. Por ejemplo:
fwdemo_sim_platform_dep = declare_dependency(
include_directories: fwdemo_sim_platform_inc,
dependencies: [
fwdemo_simulator_hw_platform_dep,
posix_os_dep,
libmemory_native_dep,
libc_dep, # <----- libc added here
libcxxabi_native_dep,
libcxx_full_native_dep,
logging_subsystem_dep
],
sources: files('platform.cpp'),
)
Las pruebas para esta biblioteca están escritas con Cmocka, que se incluye como un subproyecto y no es necesario instalar en su sistema. Puede ejecutar las pruebas emitiendo el siguiente comando:
make test
De manera predeterminada, los resultados de las pruebas son generados para su uso por el servidor CI y están formateados en JUnit XML. Los archivos XML de resultados de la prueba se pueden encontrar en buildresults/test/ .
Las siguientes opciones de proyecto de Meson se pueden configurar para esta biblioteca al crear el directorio de resultados de compilación con meson , o utilizando meson configure :
enable-pedantic : activar advertencias pedanticenable-pedantic-error : activar advertencias y errores pedantichide-unimplemented-libc-apis : oculta las definiciones de encabezado para las funciones que en realidad no se implementanenable-gnu-extensions habilitará las extensiones de GNU libc que se implementan en esta bibliotecadisable-builtins le dirá al compilador que no genere funciones incorporadas, lo que lo obliga a usar las funciones de la bibliotecadisable-stack-protection le indicará al compilador que no inserte llamadas de protección de pilastack-canary-value le permite personalizar el valor canario de su aplicación. Suministra una cadena hexadecimal (por ejemplo, '0xdeadbeef' ) con la misma longitud que el tamaño de la palabra de tu procesador.disable-stk-guard-runtime-config deshabilita el código que se utiliza para configurar __stk_chk_guard durante la inicialización del programa. Cuando esta opción es true , el programa volverá a usar una definición codificada para el valor de guardia. Las opciones se pueden especificar usando -D y el nombre de la opción:
meson buildresults -Ddisable-builtins=false
El mismo estilo funciona con meson configure :
cd buildresults
meson configure -Ddisable-builtins=false
Esta biblioteca proporciona una implementación de __stack_chk_guard y __stack_chk_fail , que permite que se use con el código de protección de la pila GCC y Clang.
El valor predeterminado para __stack_chk_guard se puede anular con la opción de compilación stack-canary-value .
[La documentación para el último lanzamiento siempre se puede encontrar aquí] https://embeddedartistry.github.io/libc/index.html.
La documentación se puede construir localmente ejecutando el siguiente comando:
make docs
La documentación se puede encontrar en buildresults/docs , y la página raíz es index.html .
Si necesita más ayuda o tiene alguna pregunta, presente un problema de GitHub o envíenos un correo electrónico utilizando el formulario de contacto de arte integrado.
También puede comunicarse con Twitter: mbeddedarchistry.
Si está interesado en contribuir a este proyecto, lea nuestras pautas contribuyentes.
Copyright © 2022 Artistry LLC
Este proyecto tiene licencia bajo la licencia MIT; consulte el archivo de licencia para obtener más detalles.
Para otras licencias de código abierto, consulte el inventario de software.
Me gustaría agradecer a las siguientes personas por sus contribuciones directas en este proyecto:
printf )printf de Mpaland y el desarrollo continuo)Muchas de las implementaciones de funciones de código abierto utilizadas en esta biblioteca se han extraído de dos fuentes principales:
También he usado y mejorado la biblioteca gdtoa de código abierto.
La base inicial de las pruebas se implementó haciendo referencia al proyecto LibC-Test.
Volver arriba