现在大家的生活办公已经离不开电脑了,在经常和电脑打交道的小伙伴会发现,Linux 原生不能运行 exe 格式的文件。
因为exe里面存放的符号地址linux是不认的,在转化成机器码这一步,printf的地址已经被焊死了。而windows的printf位于msvcrt.dll而不是linux下的libc.so.6,所以地址必然不同。巨硬搞linux的程序在windows上跑肯定容易,毕竟windows和linux对巨硬来说是透明的,反过来的事,巨硬肯定不可能干砸自己饭碗的事,民间搞的话也就只有linux透明。
wsl其实是起了个虚拟机, 除了api,syscall层面的东西,还依赖最底层的driver,dev。 所以一般的应用程序可以直接跑,依赖driver的程序比如cuda一直还支持不了,除了GNU是开始如此的,其他的都是后改的。Wine最开始就是Windows Emulator的缩写,PHP最开始也是Personal Home Page的缩写,但是后来功能逐渐和全称字面意思脱离,于是就改了。
计算机硬件是由操作系统OS管理的,你可以理解exe或者app是由操作系统控制的一个动态模块。因此一个app的加载运行,申请资源,最后退出清理全部必须由OS进行调配。
EXE程序在Linux上直接运行的最大障碍是在于其依赖的一系列动态库,如果程序依赖于一些奇怪版本的.net framework的话在非特定版本windows上运行都会有困难,更别提可能牵涉到的第三方库了。
领取专属 10元无门槛券
私享最新 技术干货