LD_PRELOAD与boost文件系统库

时间:2012-10-09 23:14:48

标签: c++ c linux boost

我试图拦截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进行了代码处理,我的open实现没有被调用。但是做strace会显示被调用的开放系统调用。如果我调用其他调用open的库函数,我会看到我的实现被调用。我在这里做错了什么?我正在动态链接boost库。

1 个答案:

答案 0 :(得分:0)

我花了一些时间搞清楚,发现内部提升调用std :: basic_filebuf打开,然后调用fopen。 fopen似乎在没有调用开放库调用的情况下调用内核中的开放系统调用(如果有人能指出它为什么会很好)。我拦截了fopen电话,现在这个工作正常。如果使用大文件支持,还需要实现fopen64。