微软/Qspectre
为他们的 MSVC 编译器添加了一个方便的工具(尽管目前这似乎只是(试图)减轻 Spectre v1 的影响),它们将随着时间的推移而更新。从用户的角度来看,这非常好,只需启用该标志,您就可以获得他们存储的最新和最大的缓解措施。
使用 LLVM 和 GCC,它看起来有点不同。我认为他们的缓解措施尚未正式发布。
LLVM 应该获得一个-mretpoline
编译器标志,通过返回蹦床来缓解 Spectre v2 的间接调用。
另一方面,GCC 的补丁添加了三个用于缓解 Spectre v2 的编译器选项:
-mindirect-branch
可以设置为thunk
. 据我了解,这会为每个间接调用创建 retpolines。-mfunction-return
可以设置为thunk
. 我想这将这些 retpolines 用于每个函数返回,这对于 Skylake 可能是必要的,因为这些处理器也可以预测返回?-mindirect-branch-register
这使用寄存器而不是堆栈来存储间接调用的地址?
所以我很困惑。什么编译器选项可以缓解用户空间应用程序在什么情况下需要它们?
通常打开它们是个好主意吗?如果为甚至没有任何推测执行的处理器架构(如微处理器)编译,它们是否也会生成这些 retpolines?
幽灵v1怎么样?
更新:
让我问更精确的问题:
- 我对编译器选项的理解是否正确?
- GCC 选项是在任何地方应用还是仅在具有推测执行的处理器上应用?
- LLVM 选项是在任何地方应用还是仅在具有推测执行的处理器上应用?
- 这些选项究竟能缓解什么(它们是否完全缓解了 Spectre v2)?
- 让我们考虑一下我要求的所有其他“奖励”问题”,这些问题很值得了解,但对我的问题并不重要。