首页 > 解决方案 > 我可以将内联函数编译为共享库,并使用 LD_PRELOAD 作为内联函数连接到其他可执行文件吗?

问题描述

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

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

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

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

标签: clinkershared-librarieshookld-preload

解决方案


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

如果您希望一个函数可能被内联,您通常在 C 或 C++ 头文件中提供它。


推荐阅读