LD_PRELOAD用于C++类方法

Bru*_*rry 7 c++ methods library-interposition

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

Ton*_*roy 8

只需为插入的代码创建一个文件(确保实现不在线)......命名空间,类名和函数应与您想要拦截的方法相同.在类定义中,不要提及您不想拦截的其他方法.请记住,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

干杯


zwo*_*wol 2

它不太可移植,但您可以用 C 语言编写插入函数,并为其指定 C++ 方法的损坏名称。当然,您必须显式处理此参数,但我认为所有 ELF ABI 都只是将其视为不可见的第一个参数。

  • `dlsym(RTLD_NEXT, "mangled_name_of_function")`。顺便说一句,我的技术和托尼的技术都不适用于虚拟函数(但如果这是一个虚拟函数,你可以在子类中重写它,ne?) (3认同)