我试图加强我正在处理的项目中的一些可执行文件。为了测试,我使用了一个hello world程序,并使用checksec进行检查,报告没有金丝雀。我对Rust很陌生,谷歌缺乏信息让我觉得我错过了一些明显的东西。
使用GCC,它是一个简单的编译器标志:-fstack-protector-all
。我发现的最接近LLVM的是safe stack。但是,当我尝试将其传递给LLVM时,Rust编译器似乎无法识别这一点。例如:
rustc -C llvm-args="-fsanitize=safe-stack" -C link-arg="-fsanitize=safe-stack" test.rust
结果
rustc:未知的命令行 参数' -fsanitize = safe-stack'。尝试:' rustc -help' rustc:你呢 意味着' -spp-no-call'?
我正在使用Rust 1.23.0。我尝试不仅在x86_64上添加这些金丝雀,而且在armeabi-v7a上添加这些金丝雀,以防相关。
答案 0 :(得分:6)
目前,不支持此功能:
我们更新了LLVM,因此在我们的LLVM中支持这个[安全堆栈属性],我认为默认情况下打开它可能需要一些调查,可能还需要RFC,所以我现在要关闭它。
- alexcrichton https://github.com/rust-lang/rust/issues/26612
我无法找到此功能的RFC。
答案 1 :(得分:6)
您现在无法使用LLVM的SafeStack。
-fsanitize=safe-stack
是 Clang 命令行选项,不一定是LLVM命令行选项。这可能解释了为什么你会收到错误。
SafeStack支持最初是在issue 26612中提出的,但启用它可以推迟到可以进行更多调查。
由于SafeStack是一种消毒剂,接下来要做的就是issue 39699,这是更多消毒杀菌剂的追踪问题。目前仅支持少数消毒杀菌剂和平台。它可能就像"简单"将其添加到列表并创建PR以启用它。
话虽如此,我相信Rust确实有一些的堆栈保护。例如,this recent issue讨论了glibc即将发生的一些变化将如何影响Rust的堆栈保护计算。