【发布时间】:2011-03-25 13:40:57
【问题描述】:
我需要插入 C++ 程序中的方法调用(该类位于单独的共享库中)。我以为我可以使用 LD_PRELOAD,但我不确定它是如何工作的(我只找到了 C 函数的示例):有没有办法为单个方法设置插入,而无需从插入的类实现中复制任何代码?
【问题讨论】:
标签: c++ methods library-interposition
我需要插入 C++ 程序中的方法调用(该类位于单独的共享库中)。我以为我可以使用 LD_PRELOAD,但我不确定它是如何工作的(我只找到了 C 函数的示例):有没有办法为单个方法设置插入,而无需从插入的类实现中复制任何代码?
【问题讨论】:
标签: c++ methods library-interposition
只需为插入的代码创建一个文件(确保实现脱节)...命名空间、类名和函数应该与您要拦截的方法相同。在您的类定义中,不要提及您不想拦截的其他方法。请记住,LD_PRELOAD 需要拦截共享对象的完整路径。
例如,要拦截 void X::fn1(),请创建一个 libx2.cc 文件:
#include然后编译:
g++ -shared -o libx2.so libx2.cc然后运行ala
LD_PRELOAD=`pwd`/libx2.so ./libx_client干杯
【讨论】:
它不是很便携,但你可以用 C 语言编写你的插入函数,并给它一个 C++ 方法的错误名称。当然,您必须明确处理 this 参数,但我认为所有 ELF ABI 都只是将其视为不可见的第一个参数。
【讨论】:
dlsym(RTLD_NEXT, "mangled_name_of_function")。顺便说一句,我的技术和托尼的技术都不适用于虚函数(但如果这是一个虚函数,你可以在子类中覆盖它,对吧?)