【问题标题】:New option in GCC 5.3: -fno-semantic-interpositionGCC 5.3 中的新选项:-fno-semantic-interposition
【发布时间】:2016-06-15 04:57:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • Here 是其中一位开发人员的博客文章。 (向下滚动。)
  • 附带说明,一些编译器(例如 LLVM)一直默默地使用语义插入(这打破了 ELF 语义,但在基准测试中大放异彩)。

标签: c++ gcc gcc5


【解决方案1】:

-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,大概是为了性能。他们have 一个反向-fsemantic-interposition 标志以启用与GCC 兼容的ELF 插入语义。

【讨论】:

  • 在不知情的情况下进行实际干预,或者没有完整的分析,或者没有严格定义的约束,这不是一个严重的危险吗?
  • @curiousguy 是的,而且它已被证明会导致错误(有关详细信息,请参阅Flameeyes blogposts on symbol collisions)。现在推荐的编程实践是通过-fvisibility=hidden 减少导出的符号。不幸的是,这并没有得到严格遵守(我开发了一个tool to detect spurious symbol exports,但它并没有引起社区的太大兴趣)。
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2017-01-27
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多