What are the big pieces of bionic?
libc/ --- libc.so, libc.a
The C library. Stuff like fopen(3)
and kill(2)
.
libm/ --- libm.so, libm.a
The math library. Traditionally Unix systems kept stuff like sin(3)
and cos(3)
in a separate library to save space in the days before shared libraries.
libdl/ --- libdl.so
The dynamic linker interface library. This is actually just a bunch of stubs that the dynamic linker replaces with pointers to its own implementation at runtime. This is where stuff like dlopen(3)
lives.
libstdc++/ --- libstdc++.so
The C++ ABI support functions. The C++ compiler doesn't know how to implement thread-safe static initialization and the like, so it just calls functions that are supplied by the system. Stuff like __cxa_guard_acquire
and __cxa_pure_virtual
live here.
linker/ --- /system/bin/linker and /system/bin/linker64
The dynamic linker. When you run a dynamically-linked executable, its ELF file has a DT_INTERP
entry that says “use the following program to start me”. On Android, that‘s either linker
or linker64
(depending on whether it’s a 32-bit or 64-bit executable). It's responsible for loading the ELF executable into memory and resolving references to symbols (so that when your code tries to jump to fopen(3)
, say, it lands in the right place).
tests/ --- unit tests
The tests/
directory contains unit tests. Roughly arranged as one file per publicly-exported header file.
benchmarks/ --- benchmarks
The benchmarks/
directory contains benchmarks, with its own documentation.
What's in libc/?
libc/ arch-arm/ arch-arm64/ arch-common/ arch-mips/ arch-mips64/ arch-x86/ arch-x86_64/ # Each architecture has its own subdirectory for stuff that isn't shared # because it's architecture-specific. There will be a .mk file in here that # drags in all the architecture-specific files. bionic/ # Every architecture needs a handful of machine-specific assembler files. # They live here. string/ # Most architectures have a handful of optional assembler files # implementing optimized versions of various routines. The <string.h> # functions are particular favorites. syscalls/ # The syscalls directories contain script-generated assembler files. # See 'Adding system calls' later. include/ # The public header files on everyone's include path. These are a mixture of # files written by us and files taken from BSD. kernel/ # The kernel uapi header files. These are scrubbed copies of the originals # in external/kernel-headers/. These files must not be edited directly. The # generate_uapi_headers.sh script should be used to go from a kernel tree to # external/kernel-headers/ --- this takes care of the architecture-specific # details. The update_all.py script should be used to regenerate bionic's # scrubbed headers from external/kernel-headers/. private/ # These are private header files meant for use within bionic itself. dns/ # Contains the DNS resolver (originates from NetBSD code). upstream-freebsd/ upstream-netbsd/ upstream-openbsd/ # These directories contain unmolested upstream source. Any time we can # just use a BSD implementation of something unmodified, we should. # The structure under these directories mimics the upstream tree, # but there's also... android/ include/ # This is where we keep the hacks necessary to build BSD source # in our world. The *-compat.h files are automatically included # using -include, but we also provide equivalents for missing # header/source files needed by the BSD implementation. bionic/ # This is the biggest mess. The C++ files are files we own, typically # because the Linux kernel interface is sufficiently different that we # can't use any of the BSD implementations. The C files are usually # legacy mess that needs to be sorted out, either by replacing it with # current upstream source in one of the upstream directories or by # switching the file to C++ and cleaning it up. malloc_debug/ # The code that implements the functionality to enable debugging of # native allocation problems. stdio/ # These are legacy files of dubious provenance. We're working to clean # this mess up, and this directory should disappear. tools/ # Various tools used to maintain bionic. tzcode/ # A modified superset of the IANA tzcode. Most of the modifications relate # to Android's use of a single file (with corresponding index) to contain # time zone data. zoneinfo/ # Android-format time zone data. # See 'Updating tzdata' later.