LD_PRELOAD用于C ++类方法

时间:2010-08-05 00:50:25

标签: c++ methods library-interposition

我需要在C ++程序中插入一个方法调用(该类驻留在一个单独的共享库中)。我以为我可以使用LD_PRELOAD,但我不确定这是如何工作的(我只找到了C函数的例子):有没有办法为单个方法设置插入而不从插入的类实现复制任何代码?

2 个答案:

答案 0 :(得分:7)

只需为插入的代码创建一个文件(确保实现不在线)......命名空间,类名和函数应与您要拦截的方法相同。在类定义中,不要提及您不想拦截的其他方法。请记住,LD_PRELOAD需要一个截获共享对象的完整路径。

例如,要拦截void X :: fn1(),请创建一个文件libx2.cc:

#include <iostream>

class X
{
  public:
    void X::fn1();
};

void X::fn1() { std::cout << "X2::fn()\n"; }

然后编译它:

g++ -shared -o libx2.so libx2.cc

然后运行ala

LD_PRELOAD=`pwd`/libx2.so ./libx_client

干杯

答案 1 :(得分:2)

它不是非常便携,但你可以在C中编写插入函数并给它带来C ++方法的错位名称。当然,你必须明确地处理这个参数,但我认为所有ELF ABI都只是将它视为一个看不见的第一个参数。