GCC 5.3添加了一个新选项:-fno-semantic-interposition
新的-fno-semantic-interposition选项可用于改进代码 共享库的质量,其中插入了导出的符号 不允许。
对于C ++项目来说,这听起来很有用,因为无论出于什么原因,都不能使用插入,但延迟是一个问题。
但是,描述相当含糊。有人能够澄清这个选项是如何运作的吗?
答案 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插入语义。