当前位置: 技术问答>linux和unix
为什么Linux下最简单的可执行文件,就不能在Windows下直接运行呢?
来源: 互联网 发布时间:2015-08-29
本文导语: main() { printf("Test"); } 这个最简单的程序,在Linux下编译了以后,应该就已经是二进制的机器码了,而且也没调用什么Linux特有的的函数啊,是ANSI C,为什么在Window下就是不能直接运行呢? 在Window下编译的机器码和Linux下有什么...
main()
{
printf("Test");
}
这个最简单的程序,在Linux下编译了以后,应该就已经是二进制的机器码了,而且也没调用什么Linux特有的的函数啊,是ANSI C,为什么在Window下就是不能直接运行呢?
在Window下编译的机器码和Linux下有什么本质的不同呢?
多谢!
{
printf("Test");
}
这个最简单的程序,在Linux下编译了以后,应该就已经是二进制的机器码了,而且也没调用什么Linux特有的的函数啊,是ANSI C,为什么在Window下就是不能直接运行呢?
在Window下编译的机器码和Linux下有什么本质的不同呢?
多谢!
|
可执行文件也有格式的,里面除了机器码,还有
一些特定系统设定的信息
Windows下面就有好几种Exe文件格式
如果真像楼主说的,只有指令的话,那当然可以互换的,但事实并非如此
另外,操作系统实际上是虚拟机,很多跟io有关的操作会被系统统一管理
比如Windows就不允许你直接写屏幕,你的printf要完成操作,必需通过
Win16虚拟机(又一层虚拟机),再通过windows内核,最后才能跟硬件打交道的
呵呵,看看吧
一些特定系统设定的信息
Windows下面就有好几种Exe文件格式
如果真像楼主说的,只有指令的话,那当然可以互换的,但事实并非如此
另外,操作系统实际上是虚拟机,很多跟io有关的操作会被系统统一管理
比如Windows就不允许你直接写屏幕,你的printf要完成操作,必需通过
Win16虚拟机(又一层虚拟机),再通过windows内核,最后才能跟硬件打交道的
呵呵,看看吧
|
虽然机器码可能相同但可执行文件的文件格式不同,包括启动码及配置参数。
|
把两个可执行文件放在一块,比较一下大小,然后用Linux的differ命令比较一下,最后在Windows下,分别用UltraEdit打开比较一下。
Windows的开头可能是4D5A,(对应ASCII码"MZ")
Windows的开头可能是4D5A,(对应ASCII码"MZ")
|
打开二进制代码看看就知道,事实上这样简单的程序在做你想它做的事情之前,系统已经做了很多你所不知道的事情了。
|
Linux的目的程序的框架结构与Windows的完全不一样。库函数的链接机制也完全不一样。
不仅如此。同是Linux,如果一台是X86机,另一台是PowerPC机,也不行的。
一个目的码要移植到另一台上运行,最最起码的两个条件:一是同一指令系统,二是同一操作系统。
不仅如此。同是Linux,如果一台是X86机,另一台是PowerPC机,也不行的。
一个目的码要移植到另一台上运行,最最起码的两个条件:一是同一指令系统,二是同一操作系统。