C和x2B的LD#U预加载+;类方法 我需要在C++程序中的方法调用中插入(该类驻留在一个单独的共享库中)。我想我可以使用LD_PRELOAD,但我不确定这将如何工作(我只找到了C函数的示例):有没有一种方法可以在不复制插入类实现的任何代码的情况下为单个方法设置插入?

C和x2B的LD#U预加载+;类方法 我需要在C++程序中的方法调用中插入(该类驻留在一个单独的共享库中)。我想我可以使用LD_PRELOAD,但我不确定这将如何工作(我只找到了C函数的示例):有没有一种方法可以在不复制插入类实现的任何代码的情况下为单个方法设置插入?,c++,methods,library-interposition,C++,Methods,Library Interposition,它的可移植性不强,但是你可以在C中写你的插入函数并给它加上C++方法的名字。当然,您必须显式地处理this参数,但我认为所有ELF ABI都将其视为不可见的第一个参数。只需为插入的代码创建一个文件(确保实现不符合要求)。。。名称空间、类名和函数应与要截取的方法的名称空间、类名和函数相同。在类定义中,不要提及不希望拦截的其他方法。请记住,LD_PRELOAD需要截取共享对象的完整路径 例如,要截取void X::fn1(),请使用以下命令创建一个文件libx2.cc: #include <i

它的可移植性不强,但是你可以在C中写你的插入函数并给它加上C++方法的名字。当然,您必须显式地处理this参数,但我认为所有ELF ABI都将其视为不可见的第一个参数。

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

例如,要截取void X::fn1(),请使用以下命令创建一个文件libx2.cc:

#include <iostream> class X { public: void X::fn1(); }; void X::fn1() { std::cout << "X2::fn()\n"; } #包括 X类 { 公众: void X::fn1(); };
void X::fn1(){std::cout这看起来没那么麻烦。我会试试的,顺便问一下,我如何从这个新方法调用原始方法?Yikes-刚刚注意到你的问题。在Linux(仅限)中,你可以使用dlsym(RTLD_NEXT,“name”)这个明确的说明不匹配搜索功能,在后面的加载对象中找到一个。对于其他OS,我不确定,但是必须有一些网页从Linux中讨论可移植性,所以RTLDY下一个搜索是一个很好的选择。多哈-扎克覆盖了所有感谢前……-我有同样的问题要问你:我如何称呼原来的C++?方法?这个方法似乎隐藏了它的名字…
dlsym(接下来是RTLD\u,“函数的名称”)
。顺便说一句,我的技术和Tony的技术都不适用于虚拟函数(但是如果这是一个虚拟函数,你可以在子类中重写它,ne?)我不应该重写它,因为我也不应该触碰实例化对象的客户端代码。该方法不是虚拟的,但显然这两种方法对我都不起作用:-/你能具体说明发生了什么而不是它起作用吗?我认为没有更多信息我无法推断出什么是错的。我让它起作用了,这是一个bug!dlsym起作用了也一样,谢谢! g++ -shared -o libx2.so libx2.cc LD_PRELOAD=`pwd`/libx2.so ./libx_client