GCC 5.3 中的新选项:-fno-semantic-interposition
New option in GCC 5.3: -fno-semantic-interposition
GCC 5.3 添加了一个新选项:-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.
这听起来对 C++ 项目很有用,因为无论出于何种原因不能使用插入,但延迟是一个问题。
但是,描述相当模糊。有谁能解释一下这个选项是如何工作的吗?
-fno-semantic-interposition
可以显着提高共享库中代码的性能,但在某些情况下可能会改变语义。
默认情况下,GCC 尊重 ELF 符号插入语义。简而言之,任何导出的库函数(即,如果使用默认编译器标志编译的任何库函数)都可以在运行时通过 LD_PRELOAD
替换,或者简单地由另一个共享库中具有相同名称的函数替换,该共享库恰好由动态加载链接器。这会阻止编译器进行大量有用的分析和优化(最显着的是内联和克隆),因为它们可能会破坏插入。
-fno-semantic-interposition
允许编译器忽略潜在的干预并更积极地进行优化。
正如我所说,使用 -fno-semantic-interposition
有一些注意事项:
- 它可能会改变你的程序的行为(当它实际上依赖于干预时,有时你没有意识到这一点)
- 它仅与共享库相关(与可执行文件无关)
- 如果您已经对您的库进行了适当的优化(即使用
-fvisibility=hidden
编译并使用 __attribute__((visibility("default")))
显式注释所有导出的符号) ,它的用处就会小得多
第一项阻止 -fno-semantic-interposition
的广泛部署。例如。据我所知 no Linux 发行版广泛使用它(顺便说一句,这将是一个很棒的项目)。
顺便说一下,Clang 编译器默认启用了 -fno-semantic-interposition
,大概是为了性能。它们 have 一个反 -fsemantic-interposition
标志以启用与 GCC 兼容的 ELF 插入语义。
GCC 5.3 添加了一个新选项:-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.
这听起来对 C++ 项目很有用,因为无论出于何种原因不能使用插入,但延迟是一个问题。
但是,描述相当模糊。有谁能解释一下这个选项是如何工作的吗?
-fno-semantic-interposition
可以显着提高共享库中代码的性能,但在某些情况下可能会改变语义。
默认情况下,GCC 尊重 ELF 符号插入语义。简而言之,任何导出的库函数(即,如果使用默认编译器标志编译的任何库函数)都可以在运行时通过 LD_PRELOAD
替换,或者简单地由另一个共享库中具有相同名称的函数替换,该共享库恰好由动态加载链接器。这会阻止编译器进行大量有用的分析和优化(最显着的是内联和克隆),因为它们可能会破坏插入。
-fno-semantic-interposition
允许编译器忽略潜在的干预并更积极地进行优化。
正如我所说,使用 -fno-semantic-interposition
有一些注意事项:
- 它可能会改变你的程序的行为(当它实际上依赖于干预时,有时你没有意识到这一点)
- 它仅与共享库相关(与可执行文件无关)
- 如果您已经对您的库进行了适当的优化(即使用
-fvisibility=hidden
编译并使用__attribute__((visibility("default")))
显式注释所有导出的符号) ,它的用处就会小得多
第一项阻止 -fno-semantic-interposition
的广泛部署。例如。据我所知 no Linux 发行版广泛使用它(顺便说一句,这将是一个很棒的项目)。
顺便说一下,Clang 编译器默认启用了 -fno-semantic-interposition
,大概是为了性能。它们 have 一个反 -fsemantic-interposition
标志以启用与 GCC 兼容的 ELF 插入语义。