LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1231|回复: 7

Window下编译的代码在Linux下为什么不能运行?

[复制链接]
发表于 2008-11-5 12:53:05 | 显示全部楼层 |阅读模式
我知道不行,即使是独立于系统的标准C,
如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的源码了:)
发表于 2008-11-5 13:49:02 | 显示全部楼层
首先,程序不等于代码,也就是说,一个执行程序除了代码之外,还有一些包装性的信息,通俗的解释就是windows .exe 程序和 Linux elf 的结构不同。

其次,把上面的打包解开之后,都是x86架构,指令应该一样了吧?貌似确实,但是你也知道,dll和so动态库的原理是完全不同的。

再次,就算全部都使用静态连接,OK,但是系统调用具体是怎么实现的呢?哦,我们简单的把它们解释为:通过中断或者其它各种手段向内核发起一个命令,然后由内核去完成。那么windows内核跟linux内核又不同,用户程序访问内核的方式又不同,所以这个printf的实现肯定又完全不相同。所以最终都完全不同了。

所以你如果阅读 ReactOS, wine, ndiswrapper 等等代码,会发现,在linux下运行windows程序,大方面来说无非就是解决上面三个问题,当然还有其它一些问题。
回复 支持 反对

使用道具 举报

发表于 2008-11-5 13:53:21 | 显示全部楼层
看你用哪个内核了,如果标准的Linux内核是不支持Windows的PE格式EXE文件运行的,但如果你用Linux兼容内核(Unified Kernel)是可以直接运行的。

而且用Wine也可以在用户态模拟Windows API来加载执行。
回复 支持 反对

使用道具 举报

发表于 2008-11-5 19:31:40 | 显示全部楼层
wine 是替换 windoze 的 API 使用,让软件以为自己在 windoze 下运行,不算模拟
回复 支持 反对

使用道具 举报

发表于 2008-11-5 23:41:45 | 显示全部楼层
我觉得你如果在 Windows 只是用 gcc -S 生成汇编代码,然后再在 Linux 上汇编、连接应该是没有问题的。或者只把连接延后在 Linux 上,也有可能。我没有 Windows,没有测试过。至于全部细节呢,你可以找一本介绍 Linux 内核的书,不过这个可能超过了你的要求; Expert C Programming 也不错;网上好像还有一本叫做 Linker and Loader 的书,或许有帮助,不过我没看过。
回复 支持 反对

使用道具 举报

发表于 2008-11-6 08:39:22 | 显示全部楼层
记得以前有人做过实验, 通过合适的参数, 在 .o 级别 windows 与 linux 是兼容的, 只要在各自平台重新 link 一下即可.
回复 支持 反对

使用道具 举报

发表于 2008-11-6 22:44:23 | 显示全部楼层
Post by d00m3d;1904500
wine 是替换 windoze 的 API 使用,让软件以为自己在 windoze 下运行,不算模拟


在我的概念里,凡是不能纳入仿真的都叫模拟,个人概念不同吧,呵呵。
回复 支持 反对

使用道具 举报

发表于 2008-11-6 22:57:36 | 显示全部楼层
wine 的概念也不是仿真,所以开发者都自称 [color="Red"]Wine [color="Red"]Is [color="Red"]Not [color="Red"]Emulator 矣
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表