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