Compilers have a lot of freedom in the code they generate. They have complete freedom in the implementation of the VTable, RTTI, exceptions and much more. Even very basic things like the size of a pointer, the way functions are invoked and name mangling can be chosen arbitrarily, independently from operating system and architecture.
Yet, I've never had an issue with compiling a C++ program with any compiler (Clang, GCC, ICC, MSVC), on any operating system (Android, Linux, Mac OS, Windows), on any architecture (x86, x86-64, ARM) and linking it to libraries built with a different compiler.
How are all the binaries files compatible with others?
Do binary files get dynamically "adapted" by the runtime linker or similar?
Did the compilers agree on some standards? If so, where can I find information on these binary-level de-facto standards?