

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). On Android, that‘s either linker or linker64 (depending on whether it’s a 32-bit or 64-bit executable). When you run a dynamically-linked executable, its ELF file has a DT_INTERP entry that says “use the following program to start me”. linker/ - /system/bin/linker and /system/bin/linker64 Stuff like _cxa_guard_acquire and _cxa_pure_virtual live here. 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. This is where stuff like dlopen(3) lives. This is actually just a bunch of stubs that the dynamic linker replaces with pointers to its own implementation at runtime. Traditionally Unix systems kept stuff like sin(3) and cos(3) in a separate library to save space in the days before shared libraries. What are the big pieces of bionic? libc/ - libc.so, libc.a This documentation is about making changes to bionic itself. Bionic is Android's C library, math library, and dynamic linker.
