该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
欲解答“为何不能混用”,就必须以“可执行文件在linux平台如何运行”为基础
那么,可执行文件在linux平台如何运行?
答:简言之,在调用例如exec(l、v、p、e)等syscall后,内核(将linux kernel简称为“内核”)的加载器(通过__register_binfmt接口注册支持格式)读取指定文件->格式识别->若格式支持,则创建/复用虚拟虚拟地址空间,读入文件镜像并将相关虚拟内存安排妥当->执行
整个通路顺畅的充要条件是每个环节都处理正常,因此:
1、在“格式识别”环节,目前内核内置支持的格式有elf、脚本、a.out等,ms的portable executable format不是内置支持的。内核允许以驱动方式支持其他格式,并提供注册加载器,目前流行的wine对exe支持的方式,据我所知,并不是这样的(即不需要额外的驱动)
2、应用层的二进制可执行文件格式常见有两种:采用静态连接或采用动态连接。前者将执行时必须的内容包含在单一文件中,后者,则必须要同时加载其他称为“动态链接库”的文件,方能正常运行
3、如今流行的elf动态连接形式(大部分应用层二进制可执行文件采用此方式连接),大体上利用了elf的“解释器”方式(即在.interp section指定解释器)加载所需的动态链接库。则在“执行”环节,内核直接加载解释器(常见的有:x86-64时的ld-linux-x86-64 dot so dot 2、x86时的ld-linux dot so dot 2),由解释器进一步加载所需动态库
4、对格式的支持,不但包括对格式的“解读”,还包括对携带信息的“使用”。一个典型的动态连接的可执行文件,大体包含几部分“os sensitive”的信息:a、机器指令运行平台,b、动态库,c、syscall abi。其中:
a、elf或者pe文件内部存储的机器码序列(即可执行的部分),只要平台相同,则即存在“可运行”性,所以,这方面,linux平台运行pe文件附带的机器码,没有阻碍,只要目标平台兼容(不兼容则涉及模拟器问题)
b、动态库本身也是完好组织的elf或者pe文件,问题仍旧归结到对格式的支持上来。另外加载形式(上述pt3),可另外考虑
c、syscall abi的方式,这方面俩os显著不同,则需要有个适配层
wine怎么做的?
答:未读wine源码,从表象看,wine对于pe文件的载入过程是:wine为内核支持可执行文件格式->wine被载入->载入pe文件,并解决动态链接库依赖(由wine负责载入)->执行权交由pe的entry执行
此外,wine“再实现”了win平台的核心动态库,ntdll、kernel32、user32等等,当pe执行时,对这些库的调用,又转而被wine接管,后可借由linux平台的功能实现这些库原本应有的功能
因此可知,wine并不是模拟器(pe中机器指令可直接执行)
那么有没有其他形式可实现对pe格式的支持?
答:显然有,相对于格式支持本身,更多的工作量在上述“利用linux平台功能再实现win平台功能导出库ntdll、kernel32等等”
大体上就是这样