首页
社区
课程
招聘
[讨论]window pe 和linux elf
发表于: 2009-6-10 19:15 14370

[讨论]window pe 和linux elf

2009-6-10 19:15
14370
前几天,给一个研究生讲解linux2.6.28的源码结构时,他曾问起我,既然编译后的文件是机器码,连接后的文件是2进制文件,为什么linux的二进制文件不能在window中使用,而window的亦然?

一开始我是考虑到文件结构的,所以我进可能的从elf(.out)和pe来讲但是后来我发现我的思路乱了,我讲的乱极。
其实我觉得从文件结构的elf and pe来说视乎还不完整,那么系统文件又是怎么在机器上执行的啦,它不也是二进制文件吗?

问题是:
        既然window和linux系统或是系统中的user级的程序都是2进制可执行体,为什么两种中的文件系统不能互换,不能在两种系统中无改动的执行。
        这个问题我想了几天,我知道在linux下通过一些虚拟或是外挂形式的比如wine或是虚拟机的方式来运行不同操作系统的程序,可是为什么2进制的文件,我们还的给它一个环境来让它运行,难道刚一开始的2进制编程也是这样吗?有人肯定要骂我是白痴了,二进制是与机器相关的。0,1这个的数字有些机器不能识别吗?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
二进制与机器码相关联,比如intel机器可以装win和linux,但是系统不一样,文件格式约定不一样,加载、初始化方式肯定不同,简单举个例子:
win pe程序到了linux中,人家如何区分这一块01010101二进制哪里是数据哪里是程序代码,oep定位在哪里呢?
即使同样在win下,有时脱壳不对/更简单一点,同个程序,把eop搞错,不一样还是运行不起来?

乱说一气,为等大牛拍砖!!
2009-6-10 19:54
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
3
可执行文件格式不同
1.因而在程序编译的时候需要用linux平台下的编译器,而不能在windows平台下编译完了直接移植。这里不包括java等脚本程序。
2.在执行时需要用特定加载器实现
2009-6-11 00:39
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我当初我也这样考虑过,但问题linux当初在什么样的编译器和平台下开发的,
我觉得这样的回答和理解不完全正确

编译后产生的.s级的汇编代码是否平台无关,产生的机器码又是否是无关的,最终产物的连接导致了平台相关性?

在这个上,我的思路有点乱

请高手给一个完整的解释,最好从编程实现的角度上考虑

两个不同的平台两种不同的文件格式
2009-6-12 17:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哥哥,你说话很逗,linux有EOP ,OEP我一直没仔细看,不知道有没,多少接触一点wine内核,没全搞懂,呵呵呵,确实如你所说,如何机器,计算机几乎都能装win,linux这正是我比较郁闷的地方,说什么编译器,加载器。。。。。。。。。。。有点石洞肥东的感觉,最好有个高手能给点什么能说明的资料看看,谢谢,molaichun@yahoo.cn,你可以带上纸片的砖头扔这里来。
2009-6-12 18:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主:
我也在想这个问题,而且在实际的操作中遇到了麻烦。
过程是这样的,首先在linux下用mips-gcc编译app.c得到了ELF格式的可执行文件app_elf,接着用工具把ELF格式的转换成PE格式的app_pe,然后加载到MIPS嵌入式板子执行(load也是自己写的),现在能够正确找到了app_pe的EntryPonit,出现了两种情况:
1 正确执行,无函数调用和全局变量;
2 如果app.c的main函数有子函数调用或者是访问了全局变量,程序就不能正常执行,或者说是找不到子函数,也找不到全局变量;
这是实际情况,大家一起讨论下。。。
2009-6-15 09:21
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我得想想你这个问题,但我不介意讨论,你加我的QQ:770308625

这个问题理论上比较复杂,不知道你有没有看过wine这样的东西

"首先在linux下用mips-gcc编译app.c得到了ELF格式的可执行文件app_elf,接着用工具把ELF格式的转换成PE格式的app_pe"

load从概念上将只是拷贝kernel到指定内存地址和elf,pe没有关系,(并初试硬件.....)理论上可执行文件的正确执行是加载器的问题

这个大家可以共同讨论
2009-6-15 18:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
相同点:
如果都在intel的CPU上,那么他们的机器指令应当是相同的,也许这点让大家迷惑!

不同点:
1. 可执行文件的格式不同,因此跨平台装载时,不能正确载入。上面有人说过
2. 系统呼叫函数不一样,在DOS下,可以说成是中断不一样,这也可以说明为什么DOS的程序不能在LINUX上运行。
举个例子:
Windows下程序的退出一般用ExitProcess,但在linux下,就没有这个系统函数。所以Windows程序不能直接在Linux下运行。
如果能解决文件格式及载入问题(这个貌似好解决),还能解决系统呼叫函数的问题(这个难),就可以通用。
Wine是不是就是这么做的?
2009-6-17 16:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
兄弟先说点不同的
dos好象也调用了bois好象在一些基层方面dos和bois是互相合作的
而linux几乎抛弃了dos和bois,因为引导是linux自己的bootloader 负责的

哎呀感觉头都大了

反正从上边诸位的讨论来看,一部分是正确的

linux只实现了相当的一部分intel cpu

实现不管linux的体系实现看,理论上window和linux在机器码方面是一致的,主要可能是elf,pe结构的不同而导致加载器的加载和读取执行上有些不同
2009-6-17 17:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
“linux只实现了相当的一部分intel cpu”  -- 这句有问题呀?不知道你指的是什么?或者说你概念不清楚

windows下import 函数,在Linux下也有,我叫它系统函数,即库函数,这部份完全不一样,你叫程序如何执行,文件格式是小事,外部的库函数是大事,无法解决的。

windows有kernel32.dll user.dll
Linux这有 libc.so  libstd++.so ...
2009-6-18 20:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
“如果能解决文件格式及载入问题(这个貌似好解决),还能解决系统呼叫函数的问题(这个难),就可以通用。


文件格式和载人都解决了,只是呼叫函数还没有,具体是这样的:

用mips-gcc编译得到的可执行文件的函数调用是绝对地址调用,而且没有.rel重定位段,所以转换为PE格式时,仍是绝对地址调用,这样在裸系统(嵌入式)下,此时的绝对地址就出现了问题,我想如果最初得到的函数调用如果是相对地址,或者是存在.rel段,那么在转换为PE格式时,就可以在重定位时把函数调用的地址转换正确了。

个人的想法,还没验证成功。。。
2009-6-20 21:08
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼上的两位说的都不错,如果要实现的话,可以通过某种方式去实现,很难说的,有空加我QQ:770308625讨论下
2009-6-21 17:55
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
调用操作系统的api不同,除非是纯asm并且没有操作系统的int调用,没有全局变量和类的地址空间的分配,这些与操作系统调用有关(或者说是dll文件之类)的调用,是可以跨平台执行。
程序的本质是二进制,执行也是根据二进制执行的,这些二进制的执行过程基本是与系统无关,可是一旦使用操作系统的loader加载器或者api或者int之类的话,就与操作系统就有关。
我之前写了一个os的boot  loader这个是和系统无关的,并且是在系统启动之前运行的。这些代码的执行与操作系统无关的,也就是跨平台的代码。这些代码可以用masm也可以使用nasm或者其他的汇编语言的编译器连接生产二进制文件。代码的编写不受平台的限制,这类似dos下com格式。
以上是个人的简单看法,有不对的地方希望指正!
希望大牛们给与指正!!!
2009-12-17 12:54
0
游客
登录 | 注册 方可回帖
返回
//