9

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

4

2 回答 2

11

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

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

#include <iostream>

X 级
{
  上市:
    无效 X::fn1();
};

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

然后编译它:

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

然后运行 ​​ala

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

干杯

于 2010-08-05T02:47:06.040 回答
2

它不是很便携,但你可以用 C 语言编写你的插入函数,并给它一个 C++ 方法的错位名称。当然,您必须明确处理 this 参数,但我认为所有 ELF ABI 都只是将其视为不可见的第一个参数。

于 2010-08-05T00:55:59.200 回答