运行带有dlopen函数的可执行文件时出现问题,该函数用于通过一个简单的函数打开共享和清理的库。
我使用预编译的Clang 3.9.0 for Ubuntu 14.04。
我的问题是:是否可以正确运行它,因此我可以在运行可执行文件时在库中查找未定义的行为错误?如果答案是肯定的,那么如何?
我有两个文件:
//simpledll.cpp
#include <cstdio>
int hehe(int argc) {
int k = 0x7fffffff;
k += argc;
return 0;
}
//dlopen.cpp
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main() {
void* handle;
handle = dlopen("simpledll.so", RTLD_LAZY);
if(!handle) {
fprintf(stderr, "%s\n", dlerror());
}
int (*function)(int) = reinterpret_cast<int (*)(int)> (dlsym(handle, "_Z4hehei"));
if (function == nullptr)
fprintf(stderr, "Nope\n");
else
function(1000); // this yields signed integer overflow
return 0;
}
我试图让它分两步完成(都失败了)
第一步
使用以下命令编译可执行文件:
clang++ dlopen.cpp -ldl --std=c++11 -o dlopen
使用以下代码编译库:
clang++ -fsanitize=undefined -shared -o simpledll.so -fPIC simpledll.cpp
结果:
./dlopen: symbol lookup error: simpledll.so: undefined symbol: __ubsan_handle_add_overflow
第二步(来自此forum的想法)
编译可执行文件,如第I步,
使用以下代码编译库:
clang++ -fsanitize=undefined -shared -Wl,--whole-archive -L/usr/local/lib/clang/3.9.0/lib/linux/ -lclang_rt.ubsan_standalone_cxx-x86_64 -Wl,--no-whole-archive -lclang_rt.ubsan_standalone-x86_64 -Wl,--no-whole-archive -o simpledll.so -fPIC simpledll.cpp
结果:
==11478==Sanitizer CHECK failed: /home/development/llvm/3.9.0/final/llvm.src/projects/compiler-rt/lib/ubsan/ubsan_init.cc:61 ((UBSAN_MODE_UNKNOWN)) != ((ubsan_mode)) (0, 0)
请注意,在第二步中,如果我们将共享库中的函数替换为没有未定义行为代码的函数,程序将在没有 CHECK失败错误的情况下运行。这表示 UBSAN找到了未定义的行为代码,但无法正确报告。
此致
Jaszczur