GCC 5.3 has added a new option: -fno-semantic-interposition
A new -fno-semantic-interposition option can be used to improve code quality of shared libraries where interposition of exported symbols is not allowed.
This sounds like this is something useful for C++ projects where interposition can't be used for whatever reason, but where latency is a concern.
However, the description is fairly vague. Is anyone able to clarify how this option works exactly?
The current version is 11.
GCC provides experimental support for the 2011 ISO C++ standard. This support can be enabled with the -std=c++11 or -std=gnu++11 compiler options; the former disables GNU extensions. As of GCC 4.8. 1, GCC's C++11 mode implements all of the major features of the C++11 standard produced by the ISO C++ committee.
GCC has had complete support for C++17 language features since version 8. Clang 5 and later supports all C++17 language features.
GCC 4.9. 0 is now available, with further improved C++11 and C++14 conformance.
-fno-semantic-interposition
can significantly improve performance of code in shared libraries but may change semantics in some cases.
By default GCC respects the ELF symbol interposition semantics. In short, any exported library function (i.e. any library function if compiled with default compiler flags) can be replaced at runtime via LD_PRELOAD
or simply by function with the same name in another shared library which happens to be loaded earlier by dynamic linker. This prevents compiler from doing a lot of useful analyses and optimizations (most notably inlining and cloning) because they may break interposition.
-fno-semantic-interposition
gives compiler permission to ignore potential interposition and optimize much more aggressively.
As I said, there are some caveats in using -fno-semantic-interposition
:
-fvisibility=hidden
and explicitly annotate all exported symbols with __attribute__((visibility("default")))
)The first item prevents wide deployment of -fno-semantic-interposition
. E.g. to my knowledge no Linux distro uses it at wide scale (it would be a great project btw).
BTW note that Clang compiler has -fno-semantic-interposition
enabled by default, presumably for the sake of performance. They have an inverse -fsemantic-interposition
flag to enable GCC-compatible ELF interposition semantics.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With