我正在使用Linux作为操作系统的嵌入式系统。这些系统不包含动态链接器,因此必须静态包含所有库。为了确保小的二进制大小,我需要一个小的C库。我知道有很多选项,但我的代码只使用系统调用,没有标准的C库调用,POSIX或任何其他扩展。使用完整的通用库是一种矫枉过正的行为。
我可以在汇编中编写这个库,但我的目标硬件不是同类的。我需要架构(ARM,i386和x86_64)与Linux内核版本之间的某种程度的可移植性。
是否存在仅包含Linux系统调用的小型C库?
答案 0 :(得分:2)
纯系统调用是您在ASM中所做的事情,成品本质上是特定于体系结构的。它是通过定义的接口
抽象出来的C / POSIX部分除非你的意思是你不需要一个完整的POSIX用户登陆? POSIX本身很大,下半部分涵盖了你要求的东西。例如,sys / * .h中指定的标头。
对于嵌入式系统,您可以为此特定目的获得一个迷你库。你看过musl了吗?或者如果你想要更低,请查看klibc。
请记住,这些标准函数要么是自举的,要么可以用C本身编写(没有包含stdlib),也不能用系统特定的包装器编写。您可以通过查看这些项目的代码来找到您要查找的内容。
答案 1 :(得分:2)
只需使用预先存在的标准库。由于您是静态链接,因此您只能获得所需内容。以下是使用musl for x86_64和ARM的示例:
[~/ellcc/examples/write] dev% cat main.c
#include <unistd.h>
int main()
{
write(1, "hello world\n", sizeof("hello world\n"));
}
[~/ellcc/examples/write] dev% make x86_64-linux-eng
make[1]: Entering directory `/home/rich/ellcc/examples/write'
Compiling main.c
Linking write
make[1]: Leaving directory `/home/rich/ellcc/examples/write'
[~/ellcc/examples/write] dev% ./write
hello world
[~/ellcc/examples/write] dev% size write
text data bss dec hex filename
1617 32 568 2217 8a9 write
[~/ellcc/examples/write] dev% make arm-linux-engeabihf
make[1]: Entering directory `/home/rich/ellcc/examples/write'
rm -f *.o write write.bin write.log elkconfig.ld
Compiling main.c
Linking write
make[1]: Leaving directory `/home/rich/ellcc/examples/write'
[~/ellcc/examples/write] dev% ./write
hello world
[~/ellcc/examples/write] dev% size write
text data bss dec hex filename
3282 16 376 3674 e5a write
[~/ellcc/examples/write] dev%