【问题标题】:How can use I Address Sanitizer in lli (LLVM)如何在 lli (LLVM) 中使用 I Address Sanitizer
【发布时间】:2019-06-06 23:53:20
【问题描述】:

我想运行一个带有地址清理器参数的位码,但我有一个问题,如果我运行它,就会发生分段错误。

$cat sample.c
#include <stdlib.h>
void *p;
int main() {
  p = malloc(7);
  return 0;
}

$clang -emit-llvm -fsanitize=address -c -g sample.c

$lli sample.bc
Stack dump:
0.  Program arguments: lli sample.bc
0  lli                      0x000000010c112d9c llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
1  lli                      0x000000010c11319e SignalHandler(int) + 192
2  libsystem_platform.dylib 0x00007fff603e2b3d _sigtramp + 29
3  libsystem_platform.dylib 000000000000000000 _sigtramp + 2680280288
4  lli                      0x000000010be3ff74 llvm::ExecutionEngine::runStaticConstructorsDestructors(llvm::Module&, bool) + 310
5  lli                      0x000000010beac842 llvm::MCJIT::runStaticConstructorsDestructors(bool) + 388
6  lli                      0x000000010bb715c6 main + 8866
7  libdyld.dylib            0x00007fff601f7ed9 start + 1
Segmentation fault: 11

【问题讨论】:

  • 尝试使用LD_PRELOAD=libasan.so.VER 运行。如果最新的 clang 仍然失败,您可以在 github.com/google/sanitizers/issues 中报告错误
  • @yugr :谢谢,它解决了我的问题。但我有点困惑,为什么clang不会自动链接这个?并且 libasan 在 MacOS 的 llvm 包中不可用,我确实在 GCC 中使用过它。 DYLD_INSERT_LIBRARIES=/usr/local/Cellar/gcc/8.2.0/lib/gcc/8/libasan.dylib lli sample.bc你知道为什么它在 llvm 中不可用吗?
  • 嗯,在 GCC 运行时中的链接可能不可靠,所以最好坚持使用 LLVM 运行时。它似乎有一个不同的名称,你可以搜索看起来像“clang_rt.asan.XXX”或类似的库吗?我已经添加了一个答案,以防你决定 +1。

标签: linker llvm jit address-sanitizer lli


【解决方案1】:

经过清理的代码需要在 Asan 运行时库中实现的特殊运行时支持。 lli 默认不加载这个库(因为用户通常不需要它)所以你需要通过LD_PRELOAD=libasan.so.VER 明确地请求它。注意libasan.so 是 GCC 约定,对于 Clang,您可能需要类似 libclang_rt.asan.XXX 的东西。您可以通过

确定完整的库路径
GCC_ASAN_PRELOAD=$(gcc -print-file-name=libasan.so)
CLANG_ASAN_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so)

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 2023-04-06
    • 2017-10-09
    • 2022-01-23
    • 2021-12-02
    • 2020-07-01
    • 1970-01-01
    • 2015-09-17
    • 2018-10-28
    相关资源
    最近更新 更多