Embedded Artistry的libc是用于基于微控制器的嵌入式系统的剥离C标准库实现。
为了节省宝贵的内存资源,该库不提供完整的C标准库实现。取而代之的是,已经选择了对裸机嵌入式系统有用的功能的子集。如果您有裸机或基于RTOS的嵌入式系统,则此库适合您!
与我遇到的许多其他C库不同,该库实施了单元测试,并在C标准库功能的开源实现中解决了长期存在的缺陷。我们正在不断添加测试,并对基线实现进行进一步的改进。
malloc和free不包含在此库中。如果您需要动态的内存分配支持,则需要将此库与嵌入式艺术性的libmemory之类的东西进行,其中包含malloc和free的实现。
如果您有兴趣为该项目做出贡献,请阅读CONTRIBUTING指南》。
嵌入式艺术性的libc旨在提供一组有用的C标准库功能集,以快速启动基于新的基于金属和RTOS的嵌入式系统。
此外,我们希望通过确保每个功能具有单位测试覆盖范围并解决静态分析仪暴露的缺陷来提供高质量的libc实现。许多C库函数实现仍然未经测试并包含错误。我们正在反对不良的实施。
为了节省内存,此库不提供完整的C标准库功能。取而代之的是,已经选择了对裸机嵌入式系统有用的功能的子集。这种选择主要是由我自己在以微控制器为重点的开发方面的经验所驱动的。如果您需要其他功能,请提交问题并提出功能请求。
该库中的功能实现已被选中,以便可移植性和快速培养新系统。这些功能可能会有更有效的实现,但通常它们是特定于架构的实现。如果您有提高性能的建议,我们总是很高兴听到他们的声音。
malloc和free不包含在此库中。由于内存分配方案随嵌入式系统(甚至不允许动态内存)差异很大,因此您需要根据系统的需求提供自己的实现。您可以将此库与嵌入式艺术性libmemory搭配,其中包含malloc和free的实现。
该库提供了完整的实现,以编译和链接Clang的libc++和libc++abi (请参阅嵌入式艺术性的LIBCPP项目)。为了实现这一目标,某些功能仅在标题中定义,但没有实现。可以使用构建选项( hide-unimplemented-libc-apis )删除未支撑但定义的功能。
C库的以下部分已实施:
assertcrt.c , exit , atexit等)atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrand家族reallocstrtoX函数(许多通过gdtoa )printf家族(大多数通过eyalroz/printf和最初的mpaland/printf通过embeddedartistry/printf mpaland/printf )putcharputstime类型和asctime()wchar类型定义和wctype函数此外,该库还提供了__stack_chk_guard和__stack_chk_fail的实现。
目前支持以下架构:
需要添加以下单元测试:
reallocrand家族将来可能不会添加这些。
wchar功能errno支持(作为编译时开关启用)getopt支持time支持FILE和其他STDIO功能我们目前没有计划以下全面支持:
locale该项目使用嵌入式艺术性的标准介子构建系统,并在我们的网站上详细描述了依赖项。
至少您需要:
git-lfs ,用于将二进制文件存储在此存储库中该项目使用git-lfs存储一些文件。
在Linux上安装git-lfs :
sudo apt install git-lfs
要在MacOS上安装git-lfs :
brew install git-lfs
可以在git-lfs网站上找到其他安装说明。
介子构建系统取决于python3和ninja-build 。
在Linux上安装:
sudo apt-get install python3 python3-pip ninja-build
在OSX上安装:
brew install python3 ninja
可以通过pip3安装梅森:
pip3 install meson
如果要在Linux上全球安装介子,请使用:
sudo -H pip3 install meson
该项目使用git-lfs ,因此请在克隆之前安装它。如果您在安装git-lfs之前克隆,则只需在安装后运行git lfs pull 。
该项目托管在Github上。您可以使用此命令直接克隆项目:
git clone --recursive [email protected]:embeddedartistry/libc.git
如果您不递归克隆,请确保在存储库中运行以下命令,否则您的构建将失败:
git submodule update --init
如果安装了制造,则可以通过发出以下命令来构建库:
make
这将为您当前的体系结构构建所有目标。
您可以使用以下方式清洁构建:
make clean
您可以使用以下方式消除生成的buildresults文件夹
make distclean
您也可以直接使用meson进行编译。
创建一个构建输出文件夹:
meson buildresults
并通过运行来构建所有目标
ninja -C buildresults
使用meson交叉文件处理交叉补偿。示例文件包含在build/cross文件夹中。您可以通过定义工具链,编译标志和链接标志来为特定处理器编写自己的交叉文件。这些设置将用于编译libc 。 (或打开问题,我们可以为您提供帮助)。
创建构建输出文件夹时,必须使用Meson命令配置交叉补偿。例如:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
在此之后,您可以(在项目根部)或ninja运行make项目来构建项目。
测试不会进行交叉编译。它们只会为本地平台构建。
使用替代工具链和运行支撑工具的完整说明在我们网站上的嵌入式艺术性标准化的Meson Build System中记录在我们的网站上。
默认情况下启用了位置独立代码(PIC),但可以通过将内置选项b_staticpic设置为false ,可以在介子配置阶段禁用:
meson buildresults -Db_staticpic=false
可以通过将内置选项b_lto设置为true :在Meson配置阶段启用链接时间优化(LTO):
meson buildresults -Db_lto=true
这可以与其他构建选项结合使用。
如果您不将meson用于项目,则使用此项目的最佳方法是单独构建并将标题和库内容复制到源树中。
include/ Directory内容复制到您的源树中。buildresults/src文件夹中示例链接器标志:
-Lpath/to/libc.a -lc
如果您使用的是meson ,则可以将libc用作子标记。将其放入您选择的子标记目录中,并添加一个subproject语句:
libc = subproject('libc')
您将需要向您的项目推广所需的子标记依赖项变量:
libc_dep = libc.get_variable('libc_dep')
您可以在executable声明或其他依赖项中使用目标库配置的依赖关系。例如:
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'),
)
该库的测试是用CMOCKA编写的,该测试作为子标记包含,并且不需要在系统上安装。您可以通过发出以下命令来运行测试:
make test
默认情况下,CI服务器生成了测试结果,并在Junit XML中格式化。测试结果XML文件可以在buildresults/test/中找到。
使用meson创建构建结果目录或使用meson configure :
enable-pedantic :打开pedantic警告enable-pedantic-error :打开pedantic警告和错误hide-unimplemented-libc-apis :隐藏未实现的功能的标题定义enable-gnu-extensions将启用本库中实现的GNU LIBC扩展disable-builtins会告诉编译器不要生成内置功能,迫使其使用库功能disable-stack-protection将告诉编译器不要插入堆栈保护调用stack-canary-value使您可以自定义应用程序的金丝雀值。提供与处理器的单词大小相同长度的十六进制字符串(例如, '0xdeadbeef' )。disable-stk-guard-runtime-config在程序初始化过程中禁用用于配置__stk_chk_guard代码。如果此选项为true ,则该程序将恢复为使用硬编码定义对后卫值。可以使用-D和选项名称指定选项:
meson buildresults -Ddisable-builtins=false
相同的样式可与meson configure一起使用:
cd buildresults
meson configure -Ddisable-builtins=false
该库提供了__stack_chk_guard和__stack_chk_fail的实现,该库可与GCC和Clang的堆栈保护代码一起使用。
可以使用stack-canary-value构建选项覆盖__stack_chk_guard的默认值。
[始终可以在此处找到最新版本的文档]
可以通过运行以下命令在本地构建文档:
make docs
文档可以在buildresults/docs中找到,并且根页为index.html 。
如果您需要进一步的帮助或有任何疑问,请提交GitHub问题或使用嵌入式艺术联系表向我们发送电子邮件。
您也可以在Twitter:Mbeddedartistry上伸出援手。
如果您有兴趣为该项目做出贡献,请阅读我们的贡献指南。
版权所有©2022 Embedded Artistry LLC
该项目是根据MIT许可证获得许可的 - 有关详细信息,请参见许可证文件。
有关其他开源许可证,请参阅软件库存。
我要感谢以下个人对该项目的直接贡献:
printf库的原始作者)printf库并持续开发)该库中使用的许多开源函数实现已从两个主要来源中提取:
我还使用并改进了开源gdtoa库。
测试的最初基础是通过引用LIBC测试项目实施。
回到顶部