扫盲回帖系列之3——在windows下编译生成的程序为什么不能在ubuntu下运行呢?



原始提问帖见http://bbs.csdn.net/topics/390931945

       基本概念问题。不讨论可执行脚本情况,因为脚本不是由机器码构成,脚本在脚本解释器上运行,而解释器本身实现在不同谱系的操作系统(如Linux和Windows,不指同一种操作系统的不同版本情况,下同)上需要移植,解释器在同一操作系统的不同CPU上至少需要重新编译源码。
       同样的硬件CPU平台下(比如x86),不同操作系统,(二进制)可执行程序的机器码当然是一样的(这里的机器码是一样的意思是指令集是一样的,并不是说不同的可执行程序中的指令序列是一样的),不能运行的根本原因是不同操作系统提供的系统服务的形式是不同的,次要的原因是执行程序文件格式往往也不一样。

1、先说次要原因。不同操作系统下可执行文件的格式也往往不同。以典型的Linux和Windows为例,Linux下可执行文件格式一般是ELF格式(具体内容可搜),Windows下可执行文件格式一般是PE格式(具体内容可搜),ELF和PE两种格式互不兼容。应用程序运行其实是由操作系统的加载器(Loader)加载、创建对应的进程、跳入到程序的入口点(即第一条机器指令)之后真正开始执行的,这些事务的具体实现对不同的操作系统而言也是不同的。
2、再说主要原因,服务提供形式不同。一个具有实用功能的应用程序在运行时总是需要操作系统提供的服务,比如:读、写文件,显示输出等。尽管不同的操作系统(如Linux和Windows)都提供类似的基础服务,比如读、写文件,但即使在相同的CPU上,不同操作系统服务在具体实现的CPU指令(即机器码)序列并不同,借用其它称呼,姑且把这些服务提供的具体形式叫二进制接口——BI吧。为了避免查阅Linux和Windows内核文件创建服务的具体形式,图省事,我简而化之表述为前面的“实现的CPU指令(即机器码)序列并不同”,请谅解并体会其中的含义。

       同一个源程序想移植到不同操作系统平台,面临的主要困难是系统服务的形式不同,所以有移植需求的程序在设计上需要尽量分离这两部分:1)程序中操作系统无关的逻辑,2)程序中依赖操作系统服务的部分。移植话题再罗嗦两句,我们的应用程序源码总是由一种特定语言(如C)实现,特定语言的运行时环境其实构成了一个该语言层次的“虚拟机环境”。语言运行时环境在不同操作系统或CPU硬件上的移植工作一般并不需要我们自己承担。所以前面应用设计逻辑分离的思想可以更细化为:尽量抽取应用的纯算法逻辑部分+特定实现语言运行时依赖部分+目标操作系统依赖部分+可能的硬件机器依赖部分。

       文件格式不同并不重要,因为不同操作系统支持的、不同格式的可执行文件生成,应用程序开发者不用关心,这个工作是由你使用的编译系统帮你完成的。





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值