如何在入口点之前初始化全局变量?
How the globals are initialized before entry point?
我想弄清楚 Windows 如何设法将 PE 文件的内存映射到地址 space,所以我看到了一些让我感到困惑的东西。
假设我们有这样的事情:
HMODULE some_module = GetModuleHandleA(NULL);
int main() { // Or DllMain doesn't matter
// some operations using some_module or whatever
return 0;
}
some_module 的初始化在调用入口点之前执行。我试图通过查看 PE 文件(我找到了初始化函数)来实现这一点,但我唯一能看到的是那些初始化函数被用作 RUNTIME_FUNCTION,没有别的。如何从所有运行时函数中提取这些初始化函数并手动调用它们?有没有关于这个的文件?我还尝试了一个名为 RtlAddFunctionTable
的函数,但我认为它不是为此而设计的。可以执行什么样的操作来实现它?谢谢
问题已解决,是另一回事。但是我做了一些研究,发现那些条目(运行时函数,包括静态初始化)已经在入口点被调用。这些函数被指定为一些内存范围,并由名为“ucrtbase!initterm”(或“ucrtbase!_initterm”)的函数调用。在一些 PE 文件中,initterm 函数被编译为一个新函数,而不是使用从 ucrtbase 导入。最后,这些函数按照它们在内存中的位置顺序被调用(低地址 -> 高地址)。
我想弄清楚 Windows 如何设法将 PE 文件的内存映射到地址 space,所以我看到了一些让我感到困惑的东西。
假设我们有这样的事情:
HMODULE some_module = GetModuleHandleA(NULL);
int main() { // Or DllMain doesn't matter
// some operations using some_module or whatever
return 0;
}
some_module 的初始化在调用入口点之前执行。我试图通过查看 PE 文件(我找到了初始化函数)来实现这一点,但我唯一能看到的是那些初始化函数被用作 RUNTIME_FUNCTION,没有别的。如何从所有运行时函数中提取这些初始化函数并手动调用它们?有没有关于这个的文件?我还尝试了一个名为 RtlAddFunctionTable
的函数,但我认为它不是为此而设计的。可以执行什么样的操作来实现它?谢谢
问题已解决,是另一回事。但是我做了一些研究,发现那些条目(运行时函数,包括静态初始化)已经在入口点被调用。这些函数被指定为一些内存范围,并由名为“ucrtbase!initterm”(或“ucrtbase!_initterm”)的函数调用。在一些 PE 文件中,initterm 函数被编译为一个新函数,而不是使用从 ucrtbase 导入。最后,这些函数按照它们在内存中的位置顺序被调用(低地址 -> 高地址)。