二进制兼容性:
Bionic 不与GNU C库,ucLibc,或任何已知的Linux C库相兼容。这意味一下几件事情:
- 你不能指望依赖GNU C库头文件编译出来的东东,能够正常地动态链接到Bionic.
- 你应该*确实地*依赖Bionic并且使用Android工具链来编译你的程序,工具链处理一些至关重要的细节问题,让你的程序能正常运行。
如果不这样做,经常会导致无法运行或者链接,甚至运行崩溃。互联网上有些网页也描述了怎样使用ARM GNU 工具链成功地写一个"hello-world"程序。这些示例有时也会正常运行,如果不是情非得以,你不应该按照那些指令去做,除非你想浪费时间。
注意,不管怎样,你*能够*依赖GNU C库头文件并且通过静态链接的方式生成一个程序。相应的程序应该能够运行。(如果你不使用dlopen()/dlsym()的话)
动态链接器:
Bionic有它自己的动态链接器(就像在Linux中的ld.so一样),这个链接器不支持由其他GCC ARM工具链生成的重定位。
C++异常支持:
目前,Bionic不支持C++异常,这意味着下面的事实:
- 如果在pthread_once()的回调函数中抛出异常,C库将保持对应的pthread_once_t互斥器的锁定状态。再次调用pthread_once()将导致死锁。
- 一个适当的实现是能够在回调之前注册一个C++异常清理器,以便正确地为pthread_once_t解锁。不幸地是这需要高度依赖编译器的汇编代码。
这个特性在最近不会得到支持。
- 如果你从C库的回调函数中抛出异常,会发生同样的问题。幸运地是,这些情况非常少,但是你向C库的提供的回调不应抛出异常。
- Bionic缺乏一些能让异常正常运行的支持函数。
System V IPCs:
Bionic有意不提供System-V IPCs机制的支持,象由semget(), shmget(), msgget()提供的那些。原因是为了避免”拒绝服务”.想要了解这个详细的理由,请阅读文档docs/SYSV-IPCS.TXT.
包含路径:
Android编译系统会自动提供必要的C库头文件的包含路径。然而,如果你想要亲自动手的话,必须要添加:
libc/arch-$ARCH/include
libc/include
libc/kernel/common
libc/kernel/arch-$ARCH
到C代码的包含路径。