14

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

新的 -fno-semantic-interposition 选项可用于提高不允许插入导出符号的共享库的代码质量。

这听起来对 C++ 项目很有用,在这些项目中,无论出于何种原因都不能使用插入,但延迟是一个问题。

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

4

1 回答 1

14

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

默认情况下,GCC 尊重 ELF 符号插入语义。简而言之,任何导出的库函数(即,如果使用默认编译器标志编译的任何库函数)都可以在运行时通过LD_PRELOAD或简单地由另一个共享库中的同名函数替换,该共享库恰好由动态链接器较早加载。这会阻止编译器进行大量有用的分析和优化(尤其是内联和克隆),因为它们可能会破坏插入。

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

正如我所说,使用时有一些注意事项-fno-semantic-interposition

  • 它可能会改变你的程序的行为(当它实际上依赖于插入时,有时你没有意识到这一点)
  • 它仅与共享库有关(与可执行文件无关)
  • -fvisibility=hidden如果您已经对库进行了适当的优化(即使用 编译并显式注释所有导出的符号__attribute__((visibility("default")))),则它的用处要小得多

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

顺便说一句,Clang 编译器-fno-semantic-interposition默认启用,大概是为了性能。它们一个反向-fsemantic-interposition标志来启用与 GCC 兼容的 ELF 插入语义。

于 2018-01-30T12:05:09.907 回答