Binary compatibility is impossible.
Every time a new language feature is added, the existing ABI mechanisms must either be contorted to support the new feature, or the interface must be changed or extended. To take the former approach for the large number of features being accommodated would severely compromise the robustness and maintainability of the compiler, not to mention the performance of the generated code. Thus, binary compatibility with previous versions is sacrificed instead. This means the application is an a.out executable, with any dynamic libraries containing only C code. CC -c hello.