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

Can I compile inline function as shared library, and use LD_PRELOAD to hook to other executable as inline function?

我想将我的共享库挂接到其他程序二进制文件,挂钩函数如下:

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())作为内联函数来减少函数调用开销。动态库hooking是否可以让代码真正内联?

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

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