【发布时间】: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