C++ Windows中的启动链接

C++ Windows中的启动链接,c++,C++,linux用于存储程序的ELF格式允许您在程序启动时通过返回函数指针的解析器函数动态链接函数。在机器代码中,不需要加载函数的地址,而是将新的链接地址直接内联到调用指令。在GCC/Clang中,您可以执行以下操作: #include <iostream> using TheFunc = void(*)(); // the resolver function is declared with extern"C", // so you do not have to use the ma

linux用于存储程序的ELF格式允许您在程序启动时通过返回函数指针的解析器函数动态链接函数。在机器代码中,不需要加载函数的地址,而是将新的链接地址直接内联到调用指令。在GCC/Clang中,您可以执行以下操作:

#include <iostream>

using TheFunc = void(*)();

// the resolver function is declared with extern"C",
// so you do not have to use the mangeled name as
// parameter to ifunc
extern"C" TheFunc thefunc_resolve() {
    // maybe select a specific target function
    return +[]{ std::cout << "Hello World!\n"; };
}

void thefunc() __attribute((ifunc("thefunc_resolve")));

int main() {
    thefunc();

    return 0;
};

问题是:有没有任何可能的方法可以在Windows二进制文件中执行相同的链接,而无需汇编程序黑客攻击,或者只调用速度慢得多的函数指针,因为指针是从变量加载的?

是的,查找延迟加载的DLL。它甚至可以通过自定义解析函数完成。

PE32格式也允许导出数据,而不限于函数指针。只需在DLL源中为其指定dllexport属性,在客户端头中为其指定dllimport。运行时绑定的工作原理与*nix上绑定的工作原理相同,这要慢得多,因为指针是从变量[引文需要]加载的。我还没有看到由于IAT/PLT跳转或虚拟功能(本质上是相同的)间接调用本身导致的任何性能问题;与这些相关的罕见性能问题通常最多来自于错过的内联机会,并且只针对非常小的函数,而不是间接跳转。请扩展您的答案。否则,可以将其标记为NAA/VLQ。