只有Linux系统调用的最小C库

时间:2015-01-25 16:36:28

标签: linux embedded-linux

我正在使用Linux作为操作系统的嵌入式系统。这些系统不包含动态链接器,因此必须静态包含所有库。为了确保小的二进制大小,我需要一个小的C库。我知道有很多选项,但我的代码只使用系统调用,没有标准的C库调用,POSIX或任何其他扩展。使用完整的通用库是一种矫枉过正的行为。

我可以在汇编中编写这个库,但我的目标硬件不是同类的。我需要架构(ARM,i386和x86_64)与Linux内核版本之间的某种程度的可移植性。

是否存在仅包含Linux系统调用的小型C库?

2 个答案:

答案 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%