【问题标题】:LD_PRELOAD for C++ class methodsLD_PRELOAD 用于 C++ 类方法
【发布时间】:2011-03-25 13:40:57
【问题描述】:

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

【问题讨论】:

    标签: c++ methods library-interposition


    【解决方案1】:

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

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

    #include X 级 { 民众: 无效 X::fn1(); }; 无效 X::fn1() { std::cout

    然后编译:

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

    然后运行ala

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

    干杯

    【讨论】:

    • 这似乎不那么老套了。我试试看
    • 对了,这个新方法怎么调用原来的方法?
    • 哎呀——只是刚刚注意到你的问题。在 Linux 中(仅限),您可以使用 dlsym(RTLD_NEXT, "name") - 这明确表示不匹配搜索功能,并在稍后加载的对象中找到一个。对于其他操作系统,我不确定,但必须有一些网页谈论 Linux 的可移植性,因此 RTLD_NEXT 搜索是一个不错的选择。 Doh - Zack 早在几年前就完成了所有感谢... :-.
    【解决方案2】:

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

    【讨论】:

    • 我有同样的问题要问你:我如何调用原始 C++ 方法?看起来这个方法隐藏了它的名字......
    • dlsym(RTLD_NEXT, "mangled_name_of_function")。顺便说一句,我的技术和托尼的技术都不适用于虚函数(但如果这是一个虚函数,你可以在子类中覆盖它,对吧?)
    • 我不应该重写它,因为我也不应该接触实例化对象的客户端代码。该方法不是虚拟的,但显然这两种方法都不适合我:-/
    • 你能具体说明发生了什么而不是它的工作吗?如果没有更多信息,我认为我无法推断出问题所在。
    • 我让它工作了,这是一个错误! dlsym 也可以。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多