微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以将内联函数编译为共享库,并使用 LD_PRELOAD 作为内联函数挂钩到其他可执行文件吗?

如何解决我可以将内联函数编译为共享库,并使用 LD_PRELOAD 作为内联函数挂钩到其他可执行文件吗?

我想将我的共享库挂钩到其他程序二进制文件中,挂钩函数是这样的:

void my_function(void *data){
    bool res = my_function_needed(data);
    if (res){
        // Do my work
    }
    else {
        original_function(data);
    }
}

hook 函数将使用我的程序和原始函数参数。问题是,这个函数会被如此频繁地调用性能在这里很重要。 由于我无法在运行时更改函数调用地址本身(因为这是函数,而不是函数指针),因此必须保留 if-else 以决定正确的过程。

所以我至少想将这些函数(my_function() 和 my_function_needed())作为内联函数来减少函数调用开销。是否可以在动态库挂钩中使代码真正内联?

解决方法

内联函数的方法是将函数源提供给编译器,并允许它内联到调用函数的内容中。在我熟悉的所有 C 和 C++ 编译器中,这必须发生在编译的代码生成阶段之前,通常是在解析之后的某个时间。动态链接库或静态链接库都是生成的可以使用的代码体;但是,此代码不会内联到正在编译的其他代码中。它在静态库的链接时编译后或 OS 加载程序将程序加载到内存时链接。

如果您想要一个潜在的内联函数,您通常在 C 或 C++ 头文件中提供它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。