【发布时间】:2017-06-15 07:24:01
【问题描述】:
我正在尝试在 linux 上使用 LD_PRELOAD 来包装对 system 函数的调用,以便为参数添加一些预处理。这是我的system.cpp:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <string>
#include <iostream>
typedef int (*orig_system_type)(const char *command);
int system(const char *command)
{
std::string new_cmd = std::string("set -f;") + command;
// next line is for debuggin only
std::cout << new_cmd << std::endl;
orig_system_type orig_system;
orig_system = (orig_system_type)dlsym(RTLD_NEXT,"system");
return orig_system(new_cmd.c_str());
}
我用它构建它
g++ -shared -fPIC -ldl -o libsystem.so system.cpp
生成 .so 对象。然后我运行我的程序
$ LD_PRELOAD=/path/to/libsystem.so ./myprogram
我没有收到任何错误 - 但似乎我的 system 函数没有被调用。使用LD_DEBUG=libs 运行,我可以看到我的.so 正在加载,但是我的system 函数没有被调用,而是调用了标准库中的函数。
我需要对代码/构建进行哪些更改才能使其正常工作?
【问题讨论】:
标签: c++ linux ld-preload