Chinaunix

标题: 能否创建linux 和windows通用的可执行文件 [打印本页]

作者: vfdff    时间: 2008-10-30 22:02
标题: 能否创建linux 和windows通用的可执行文件
发现除了某些细节
windows 和linux 的C程序代码可以完全一模一样
既然这样,不知道有没有编译器,可以让这样的代码编译得到的可执行文件同时可以在 linux 和windows 上使用??
作者: prolj    时间: 2008-10-31 00:31
不能,没有
作者: old-cow    时间: 2008-10-31 10:40
可能,未必
作者: prolj    时间: 2008-10-31 10:48
Win是PE,Linux是ELF,怎么可以?一个文件里集成PE和ELF,然后文件头修改一下?还是像Xilinx的ISE那样干脆提供两套exe?
作者: abutter    时间: 2008-10-31 12:10
标题: 回复 #1 vfdff 的帖子
与系统调用相比,PE 只是很细小的差别。
作者: qtdszws    时间: 2008-10-31 12:25
同样的思想,写成书,用中文写,老外能看懂吗?也可以写成世界语,有人懂吗?
作者: cjaizss    时间: 2008-10-31 14:03
两套可执行文件算了吧
作者: beepbug    时间: 2008-10-31 17:46
即使Linux也是运行在X86平台上,它和Windows上的可执行代码尽管都是X86机器码,但是,运行环境不一样,可执行代码的框架就不一样。
可以的。在Linux上,可以搞个C编译器,生成的代码,在Windows上运行,反之亦可。这个叫交叉编译。此时,Linux叫宿主机,Windows叫目标机。在宿主机上编译,在目标机上运行。
作者: rawa9999    时间: 2008-10-31 20:50
可以的,用虚拟机技术,编写一个虚拟机,比如java的class就是跨平台的,linux上也有win虚拟机嘛,很多问题都可以用虚拟机解决。
作者: biger410    时间: 2008-11-01 20:45
我认为可以。这个应该跟编译器没有关系,只是可执行文件格式的问题.只要你的程序没有用到操作系统的私有api。只要windwos和linux能互相识别对方的可执行文件的格式就可以了。
作者: beepbug    时间: 2008-11-01 20:51
没看清题目,原来楼主问的是“能否创建linux 和windows通用的可执行文件”?
这个不可能。也实在没这必要。
作者: eveson    时间: 2008-11-02 13:12
原帖由 biger410 于 2008-11-1 20:45 发表
我认为可以。这个应该跟编译器没有关系,只是可执行文件格式的问题.只要你的程序没有用到操作系统的私有api。只要windwos和linux能互相识别对方的可执行文件的格式就可以了。



不可以,可执行文件从哪里来的?编译器编译出来的。没有用到操作系统的api是一方面,编译出的可执行文件的格式是最重要的一个原因。
作者: biger410    时间: 2008-11-02 20:30
原帖由 eveson 于 2008-11-2 13:12 发表



不可以,可执行文件从哪里来的?编译器编译出来的。没有用到操作系统的api是一方面,编译出的可执行文件的格式是最重要的一个原因。

难道GCC不能在WINDOWS上用吗?
作者: eveson    时间: 2008-11-02 20:49
没说不能用啊,看那本linker and loader吧
作者: prolj    时间: 2008-11-03 11:44
能!有钱的话,而且不限制时间,能。
发明一种统一的文件格式,再有一个封装API的层(在文件格式里面或者其他什么地方),loader自己写,这个loader在Win和Lin上不可能一样啦。
作者: eveson    时间: 2008-11-03 11:47
对于很多需求,客户喜欢问你们能不能实现,我们也说是从计数角度来说可以,但是需要考虑实现这个需求的付出和所获得的收益这种性价比你们是不是能接受。
作者: wosl2001    时间: 2008-11-03 15:13
delphi kylnx
作者: cjaizss    时间: 2008-11-03 16:23
原帖由 prolj 于 2008-11-3 11:44 发表
能!有钱的话,而且不限制时间,能。
发明一种统一的文件格式,再有一个封装API的层(在文件格式里面或者其他什么地方),loader自己写,这个loader在Win和Lin上不可能一样啦。

“再有一个封装API的层”..........
怎么越看越像虚拟机,呵呵
作者: goodwu    时间: 2008-11-03 17:45
看看wine做的事情不就清楚了么?
作者: apollolegend    时间: 2008-11-03 18:38
技术之外,商业因素更重要
作者: 独孤九贱    时间: 2008-11-04 09:01
楼主没有考虑到不同操作系统之间内部的差异性
作者: yamir    时间: 2008-11-04 13:16
毛德操就在做这个
作者: prolj    时间: 2008-11-04 14:37
原帖由 cjaizss 于 2008-11-3 16:23 发表

“再有一个封装API的层”..........
怎么越看越像虚拟机,呵呵

POSIX的API和Win API太不同了,这个必须做,无论在哪个层面。
不同的是“可执行文件”不是“字节码”,而是二进制的机器码,lz要是要求还要跨不同CPU,那就真是虚拟机了。

原帖由 yamir 于 2008-11-4 13:16 发表
毛德操就在做这个

专家、院士还是教授?
作者: kns1024wh    时间: 2008-11-04 14:39
标题: 回复 #1 vfdff 的帖子
都说java是可以的,不过java还是要有一个vm为基础的
作者: wxmijl    时间: 2008-11-04 14:44
我觉得可以,写一个新的linux版本,让他按windows的exe格式读取数据然后执行,原理就同:你按你的格式存储数据到一个文件,格式名你自己随便定,你现写一个程序按以上格式读取就行了.

解决办法是:修改linux操作系统
作者: Hosanna    时间: 2008-11-04 14:46
原帖由 wxmijl 于 2008-11-4 14:44 发表
我觉得可以,写一个新的linux版本,让他按windows的exe格式读取数据然后执行,原理就同:你按你的格式存储数据到一个文件,格式名你自己随便定,你现写一个程序按以上格式读取就行了.

解决办法是:修改linux操作系统


为什么不说修改windows呢?:wink:
作者: yamir    时间: 2008-11-04 14:50
标题: 回复 #23 prolj 的帖子
http://linux.insigma.com.cn

仔细看项目白皮书里的
漫谈兼容内核

就能理解设计思路了

wine是做了一层win32的api,但是wine还没法兼容sys之类的东西
作者: cjaizss    时间: 2008-11-04 14:54
原帖由 prolj 于 2008-11-4 14:37 发表

POSIX的API和Win API太不同了,这个必须做,无论在哪个层面。
不同的是“可执行文件”不是“字节码”,而是二进制的机器码,lz要是要求还要跨不同CPU,那就真是虚拟机了。


专家、院士还是教授?

所以觉得LZ根本没那个必要,一个OS发一个二进制文件得了,又方便又实用。虚拟出另外一个OS也不见得那么容易,两个不同类型OS下系统调用语意差别还是很大的,要去模拟它并非简单的解释即可,所以像wine这种其实也不是一个小工程。
作者: cjaizss    时间: 2008-11-04 14:56
原帖由 Hosanna 于 2008-11-4 14:46 发表


为什么不说修改windows呢?:wink:

.......因为M$不是好鸟,不好拿它开刀..........
作者: prolj    时间: 2008-11-04 15:23
标题: 回复 #28 cjaizss 的帖子
wine、java、脚本都是那方面的尝试,无论哪个层次上。
如果迅雷之类的软件在开发上自己封装一下,或者使用一些跨平台的库,甚至java+native interface,lz就不会有那方面需求了。
如果是自己开发的,一次编写到处编译,比一次编译到处debug要好很多。
作者: wxmijl    时间: 2008-11-04 15:28
标题: 回复 #26 Hosanna 的帖子
windows是微软的,你没原代码,叫微软改是不可能的,所以只能改linux,因为linux是开源的操作系统,你有权改
作者: jeffyan    时间: 2008-11-04 15:30
可能性不大 除非使用虚拟机 如java等  否则这些可执行的文件的结构是不同的,如果要都能执行 就让windows 和linux 坐下来共同讨论 订出一套标准 才行
作者: jeffyan    时间: 2008-11-04 15:31
windows 和linux现阶段 可能性不大 呵呵
作者: JaGeonchen    时间: 2008-11-04 21:27
不知道能不能像SCRIPT那样子,加上<!-- *******-->然后识别的就执行里面的代码,如果不行就执行外面的代码,呵呵,大家别见怪,我是新手,可能说的太弱智了点,
作者: 水手辛巴    时间: 2008-11-04 22:12
写脚本吧。
想这个意义不大。
作者: cjaizss    时间: 2008-11-05 00:41
标题: 回复 #35 水手辛巴 的帖子
脚本并非万能,甚至不只是效率上的因素
作者: fallshuang    时间: 2008-11-05 01:31
当然可以了。linux下可以直接执行pe文件

譬如:
你敲  bash#notepad.exe 可以直接在linux下运行

具体方法: binfmt_misc + wine

参见:
http://www.linux.com/feature/56032
作者: snow888    时间: 2008-11-05 08:45
原帖由 cjaizss 于 2008-11-3 16:23 发表

“再有一个封装API的层”..........
怎么越看越像虚拟机,呵呵


可不就是虚拟机么。


作者: cdxkyz928    时间: 2008-11-05 11:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: T-bagwell    时间: 2008-11-06 14:49
试试WINE
呵呵
Linux 下的是elf,Windows下似乎是pe,呵呵
作者: T-bagwell    时间: 2008-11-06 14:53
原帖由 prolj 于 2008-11-4 14:37 发表

专家、院士还是教授?


如果看了Linux内核源代码情景分析估计就不会问这个了
作者: cottlestone    时间: 2008-11-07 14:19
看来是不可以了。。。

[ 本帖最后由 cottlestone 于 2008-11-7 14:34 编辑 ]
作者: realmon    时间: 2008-11-08 12:22
做成解释执行,:luya:
作者: emmoblin    时间: 2008-11-12 23:57
按理说都是一个cpu,编译完后程序的指令肯定是一样的,比如要算1+1,这个指令是cpu执行的,与操作系统没关系。
所谓的跨平台有两种:
1)跨硬件平台,cpu指令集不一样,必然要从新编译。
2)跨操作系统,只要两个系统提供的函数库一样,代码无需修改就可以直接编译运行。

至于编译后生成的可执行文件格式是给操作系统解析用的,只要能理解这个格式就能运行,
所以只要同时能理解elf和exe的加载器也可以叫解释器,那自然就可以在两个系统运行。

这也就是要加虚拟机的作用。要是考虑跨平台自然可以用java了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2