Window下编译的代码在Linux下为什么不能运行?
时间:2008-11-05
来源:互联网
如dummy.c
#include <stdio.h>
int main() {
printf("dummy\n");
return 0;
}
里面只有一个printf()调用,在windows上编译,在Linux上也是不能运行的。
假定我运行的机子是 x86体系某个型号的CPU,
那么编译 1+2, a+b这种语句,
在Windows和Linux上编译之后的汇编指令应该是一样的吧?
因为是跑在相同的CPU上的,机器指令格式是完全相同的啊。
那么问题是否出在 动态链接库上,不同的操作系统,其链接库实现应该完全不同吧,呵呵。
那么就把程序编译为静态链接的,这样就可以执行了吧。。。
事实上也不行,因为不同系统的程序加载运行机制不同吗?
以前简单看了下一个ELF的介绍,应该和程序加载机制相关,有人能够介绍下 操作系统 是如何让一段代码 实实在在跑起来的吗?整个细节,呵呵。
这个问题深入,估计要看Wine的源码了:)
作者: think365 发布时间: 2008-11-05
其次,把上面的打包解开之后,都是x86架构,指令应该一样了吧?貌似确实,但是你也知道,dll和so动态库的原理是完全不同的。
再次,就算全部都使用静态连接,OK,但是系统调用具体是怎么实现的呢?哦,我们简单的把它们解释为:通过中断或者其它各种手段向内核发起一个命令,然后由内核去完成。那么windows内核跟linux内核又不同,用户程序访问内核的方式又不同,所以这个printf的实现肯定又完全不相同。所以最终都完全不同了。
所以你如果阅读 ReactOS, wine, ndiswrapper 等等代码,会发现,在linux下运行windows程序,大方面来说无非就是解决上面三个问题,当然还有其它一些问题。
作者: poet 发布时间: 2008-11-05
而且用Wine也可以在用户态模拟Windows API来加载执行。
作者: 没本 发布时间: 2008-11-05
作者: d00m3d 发布时间: 2008-11-06
作者: Vamperor 发布时间: 2008-11-06
作者: remote fish 发布时间: 2008-11-06
作者: d00m3d
wine 是替换 windoze 的 API 使用,让软件以为自己在 windoze 下运行,不算模拟
|
作者: 没本 发布时间: 2008-11-07
作者: d00m3d 发布时间: 2008-11-07
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28