linker - 如何在 lli (LLVM) 中使用 I Address Sanitizer
问题描述
我想运行一个带有地址清理器参数的位码,但我有一个问题,如果我运行它,就会发生分段错误。
$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
解决方案
净化后的代码需要在 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)
推荐阅读
- laravel - Laravel JSON 格式使用 groupBy 函数出错
- godot - RPC 请求出错并且不理解错误
- angular - 仅在 Angular 7 中登录后启用注销按钮
- angular - 更改数组引用后,Angular 7 UI 不会立即刷新
- linux - 如果涉及 MAP_FIXED,无限堆栈不能超过最初的 132KiB?
- apache-spark - Spark重用广播DF
- linux - 安装testdisk有问题
- python - 如何优化 OpenCV 中视频流的帧抓取?
- powershell - 将日期和时间字符串转换为日期时间
- json - 使用 VSCode 使用 openAPI/swagger 模式构建和验证 REST json 请求