New option in GCC 5.3: -fno-semantic-interposition
Asked Answered
M

1

16

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?

Misguided answered 2/3, 2016 at 11:11 Comment(2)
Here is a blog entry by one of the devs. (Scroll down far.)Titanate
As a side note, some compilers (e.g. LLVM) have always been silently using semantic interposition (this breaking ELF semantics but shining in benchmarks).Cachinnate
C
21

-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:

  • it might change behavior of your program (when it was actually relying on interposition, sometimes without you realizing this)
  • it's only relevant for shared libraries (not executables)
  • it's much less useful if you already do proper optimization of your libraries (i.e. compile with -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.

Cachinnate answered 30/1, 2018 at 12:5 Comment(3)
Isn't having actual interposition without knowledge, or without complete analysis, or without strictly defined constrains, a serious danger?Grosso
@Grosso Yes, moreover it has been proven to cause bugs (see Flameeyes blogposts on symbol collisions for details). A recommended programming practice nowadays is to reduce exported symbols via -fvisibility=hidden. Unfortunately this isn't strictly followed (I've developed a tool to detect spurious symbol exports but it didn't get much interest from community).Cachinnate
This seems to me like it could also result in violations of the LGPL for libraries you link to.Coffer

© 2022 - 2024 — McMap. All rights reserved.