即C库应该只提供对内核功能的轻量级封装,不应该过于智能化,考虑太多的边界条件。
Bionic这个词表明它一部分来自BSD,一部分来自Linux。它的源码主要是BSD C库的代码片段,加上一些Linux相关的比特位,用来处理线程、信号等问题。
Bionic目前支持x86和arm指令集。理论上讲,可以支持更多的架构,不过需要做一些工作。
每个系统调用函数都是用一段小型汇编码(即 syscall stub)实现的,这些 syscall stub 是由 tools/gensyscall.py 通过读取 SYSCALL.html 生成的。
SYSCALL.html 包含要生成的 syscall stub ,相应的系统调用号(x86与arm不同),及相应的签名。
如果你想修改SYSCALL.html,可以利用 tools/checksyscalls.py 来比较SYSCALL.html 和 Linux内核头文件。当发现无效的系统调用号时,就会报告错误。
在32位CPU上,Linux内核定义 time_t 为 32位。但是将 time_t 定义为 64位或许更好,因为可以解决 bug Y2038。但是Linux内核维护人员Y2038不紧急,所以time_t依然是32位。
但是,Bionic提供了time64.h 这个头文件,定义了 time64_t 类型,和相应的函数 mktime64()、localtime64() 等。
off_t 也是 32 位的,Bionic中定义了 loff_t 类型(64位),从而做到兼容BSD, 它被typedef 为 off64_t,兼容Linux。
当前时区的名字取自 TZ 环境变量(如果定义了 TZ 变量)。
如果没有定义 TZ 环境变量,则检查名为 persist.sys.timezone 的系统属性。
时区信息数据库和索引文件位于 /system/usr/share/zoneinfo, 而不是 /usr/share/zoneinfo(POSIX规范定义的)
六、Linux内核头文件
七、pthread实现
八、多核支持
九、Android相关特性
十、二进制兼容性
十一、动态链接器
十二、C++异常
十三、System V IPC
Android 编译系统会自动提供C库头文件的include路径。如果想自己指定,可以把这些路径加入C库的include路径:
libc/arch-$ARCH/include
libc/include
libc/kernel/common
libc/kernel/arch-$ARCH