GCC 5.3中的新选项:-fno-semantic-interposition

时间:2016-03-02 11:11:21

标签: c++ gcc gcc5

GCC 5.3添加了一个新选项:-fno-semantic-interposition

  

新的-fno-semantic-interposition选项可用于改进代码   共享库的质量,其中插入了导出的符号   不允许。

对于C ++项目来说,这听起来很有用,因为无论出于什么原因,都不能使用插入,但延迟是一个问题。

但是,描述相当含糊。有人能够澄清这个选项是如何运作的吗?

1 个答案:

答案 0 :(得分:3)

-fno-semantic-interposition可以显着提高共享库中代码的性能,但在某些情况下可能会改变语义。

默认情况下,GCC尊重ELF symbol interposition semantics。简而言之,任何导出的库函数(即任何库函数,如果使用默认编译器标志编译)都可以在运行时通过LD_PRELOAD替换,或者简单地在共享库中运行,这恰好由动态链接器加载。这可以防止编译器进行大量有用的分析和优化(最值得注意的是内联和克隆),因为它们可能会破坏插入。

-fno-semantic-interposition允许编译器忽略潜在的插入并更加积极地进行优化。

正如我所说,使用-fno-semantic-interposition

时有一些注意事项
  • 它可能会改变你的程序的行为(当它实际上依赖于插入时,有时候你没有意识到这一点)
  • 它只能使共享库受益
  • 如果您已经对库进行了适当的优化(例如,使用-fvisibility=hidden进行编译并使用__attribute__((visibility("default")))显式注释所有导出的符号),那么它就没用了。

第一项阻止fno-semantic-interposition的广泛部署。例如。据我所知没有 Linux发行版大规模使用它(这将是一个伟大的项目顺便说一句。)

BTW请注意,Clang编译器默认启用-fno-semantic-interposition,大概是为了提高性能。它们具有反-fsemantic-interposition标志以启用ELF插入语义。