首先了解下Wine初始化过程。
我们执行”wine WeChat.exe”命令,发生的过程是怎么样的?接下来从wine源码一步步分析函数调用过程。
在loader/目录下的源码编译,由main.c生成了“wine”Linux可执行文件;preloader.c生成了“pre-loader”Linux可执行文件。
假设在终端通过命令“wine WeChat.exe”启动微信;该过程涉及preloader,但是最终会执行到“wine”中的main函数。所以这里从wine的main函数调用wine_init开始分析。
wine_init函数如下图所示:
主要做了以下三件事:
1. 调用了mmap_init()函数,这个函数与预留地址空间相关。
2. 通过wine_dlopen()装入由Wine提供的动态连接库ntdll.dll。由于Wine特殊的系统结构,它不能使用微软的ntdll.dll,而只能使用Wine自己的DLL,这样的DLL称为“内置(built-in)”DLL。
3. 执行内置ntdll.dll中的函数__wine_process_init()。先通过wine_dlsym()取得这个函数的入口地址,然后通过指针init_func进行调用。之所以要以这样的方式调用,是因为这个函数在ntdll.dll中,而wine_dlopen()只是装入了这个DLL、却并未完成与此模块的动态链接。
<