我正在尝试拦截 Linux 中的开放系统调用。它适用于其他库,但不适用于 boost libboost_fileystem。这是我的代码(为了便于阅读而删除)。
#include <boost/filesystem/fstream.hpp>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
using namespace std;
using namespace boost::filesystem;
typedef int (*open_func_type)(const char * pathname, int flags, ...);
int open(const char *path, int flags, ...)
{
va_list arg;
mode_t mode = 0;
if (flags & O_CREAT)
{
va_start(arg, flags);
mode = va_arg(arg, mode_t);
va_end(arg);
}
//some stuff here
open_func_type open_func = (open_func_type) dlsym(RTLD_NEXT, "open");
return open_func(path, flags, mode);
}
int main()
{
boost::filesystem::fstream build_path;
build_path.open("/tmp/test.txt", ios::in);
//other stuff
return 0;
}
我使用 gdb 逐步执行了代码,但没有调用我的开放实现。但是执行 strace 会显示正在调用的开放系统调用。如果我调用其他调用 open 的库函数,我会看到我的实现被调用。我在这里做错了什么?我正在与 boost 库动态链接。