LinuxSir.Org  
| 网站首页 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
 
主题工具
旧 06-08-13, 16:34 第 1 帖
sumargin
 
sumargin 的头像
 
 
注册会员  
  注册日期: Apr 2005
  我的住址: 宇宙的深渊
  帖子: 718
  精华: 1
 

标题: [操作系统][文件格式]问个问题:exe文件包含什么内容?


好久以来,在sir上都 是顶别人的贴,近来对win下的 exe 很好奇,不知道它到底包含什么东西?
希望有牛人帮忙详细解答一下







__________________
Hack the free software.
Into the freedom world.
Fight for the free.
  sumargin 当前离线   回复时引用此帖
旧 06-08-13, 16:53 第 2 帖
soloforce 帅哥
 
soloforce 的头像
 
 
注册会员  
  注册日期: Dec 2004
  帖子: 2,280
  精华: 14
 

可以参考
http://madchat.org/vxdevl/papers/win...ile/pefile.htm
http://www.skynet.ie/~caolan/publink...oc/pefile.html
说的很详细。

各个系统之间,文件格式可能不相同。第一个贝尔实验室诞生的Unix系统使用a.out格式; 早期的System V Unix使用“通用目标文件格式”(Common Object File Format, COFF); WindowsNT用COFF的一个变体“可移植可执行(Portable Executable)格式”; 现代的Unix系统(System V之后的Unix、BSD、Solaris等)以及Linux,都采用“Unix可执行可链接(Executable and Linkable Format, ELF)格式”。格式虽不同,但基本原理却相通。







__________________
Athlon Phenom II X4 940 OC 3.6G / Kingston DDR2 4G / DFI 790X-M2RS / Sapphire HD4870 /Audigy2 ZS / 22' LCD / Acbel iPower660

此帖于 06-08-13 17:00 被 soloforce 编辑.
  soloforce 当前离线   回复时引用此帖
旧 06-08-13, 18:12 第 3 帖
sumargin
 
sumargin 的头像
 
 
注册会员  
  注册日期: Apr 2005
  我的住址: 宇宙的深渊
  帖子: 718
  精华: 1
 

我不明白的地方如下:

用delphi编译而成的exe文件,必然用到vcl类库,而把这个exe文件拿到没有delphi,也没vcl库的电脑,却也能执行。
所以我的问题才会是:exe文件到底包含什么?
是不是exe文件会把library等编译会用到的东西全部包含进来?
如果是这样的话,我写的程序有20多mb,为何compiler后只有几mb,甚至几百kb而已?

所以请别误解我的意思,lolita大哥,我并非想研究到exe文件那些很莫名其妙的机器吗的东西。
  sumargin 当前离线   回复时引用此帖
旧 06-08-13, 19:46 第 4 帖
soloforce 帅哥
 
soloforce 的头像
 
 
注册会员  
  注册日期: Dec 2004
  帖子: 2,280
  精华: 14
 

引用:
作者: sumargin
用delphi编译而成的exe文件,必然用到vcl类库,而把这个exe文件拿到没有delphi,也没vcl库的电脑,却也能执行。是不是exe文件会把library等编译会用到的东西全部包含进来?
是的,这就是所谓“静态链接”。
一般来说,链接过程发生在编译完成后,链接器通过符号解析和代码重定位等一系列措施确定你的程序需要的目标代码(包括你自己写的,还有库里面的),然后根据用户的要求进行链接,比如静态方式。静态链接会把库中用到的代码全部拷贝到最终的可执行目标文件里头,但不是库中的所有内容,而是要什么代码就拷贝什么代码,“按需分配”。如果你写的程序调用了很多库,使用了很多库函数,最后静态链接出来的目标代码就会比较庞大; 但拿到任何同类架构、同类OS的机器上就可以跑。

引用:
作者: sumargin
如果是这样的话,我写的程序有20多mb,为何compiler后只有几mb,甚至几百kb而已?
如果采用动态方式链接,那么并不会把库里头的东西拷贝到可执行目标文件; 模块间的链接是在加载、运行时由动态链接器自动完成,甚至在运行时由应用程序调用动态链接器来完成。这样生成的代码尺寸当然小,不过拿到没有特定库的机器上就跑不了。
  soloforce 当前离线   回复时引用此帖
旧 06-08-26, 23:01 第 5 帖
dinghwy 帅哥
 
dinghwy 的头像
 
 
注册会员  
  注册日期: Jun 2006
  帖子: 178
  精华: 1
 

我一直困惑的问题是,如果WIN还有LINUX 都在一个平台下,比如说我们的PC (intel)的硬件平台,他们在这个平台下的最终执行的代码都一样,也就是说机器码一样。那如果把WIN下的机器码文件(可以被处理器执行的机器码)拿到LINUX下,能不能一样的执行呢?
因为机器码是一样的 是不是可以执行呢?
  dinghwy 当前离线   回复时引用此帖
旧 06-08-26, 23:13 第 6 帖
soloforce 帅哥
 
soloforce 的头像
 
 
注册会员  
  注册日期: Dec 2004
  帖子: 2,280
  精华: 14
 

引用:
作者: dinghwy
我一直困惑的问题是,如果WIN还有LINUX 都在一个平台下,比如说我们的PC (intel)的硬件平台,他们在这个平台下的最终执行的代码都一样,也就是说机器码一样。那如果把WIN下的机器码文件(可以被处理器执行的机器码)拿到LINUX下,能不能一样的执行呢?
因为机器码是一样的 是不是可以执行呢?
win下的 可执行文件是 PE 格式 ; linux下的则是 ELF 文件格式, 两者的不同决定了程序无法直接在对方平台上执行,即使从微观来看,可能存在很多相同的代码片断。比如装载过程差异就很大,导致操作系统根本无法定位程序运行的入口点,自然跑不起来。 就像两种不同的机器引擎,只能在合适(兼容)的环境下(操作系统)才能运作。
  soloforce 当前离线   回复时引用此帖
旧 06-08-27, 08:52 第 7 帖
well
 
 
 
注册会员  
  注册日期: Mar 2003
  帖子: 797
  精华: 6
 

LZ最好去 www.pediy.com 看看PE格式的资料







__________________
play~
爱己、爱人、爱世界
  well 当前离线   回复时引用此帖
旧 06-09-02, 10:24 第 8 帖
guoke 帅哥
 
guoke 的头像
 
 
注册会员  
  注册日期: Apr 2005
  我的住址: 洛阳
  帖子: 112
  精华: 0
 

引用:
作者: dinghwy
我一直困惑的问题是,如果WIN还有LINUX 都在一个平台下,比如说我们的PC (intel)的硬件平台,他们在这个平台下的最终执行的代码都一样,也就是说机器码一样。那如果把WIN下的机器码文件(可以被处理器执行的机器码)拿到LINUX下,能不能一样的执行呢?
因为机器码是一样的 是不是可以执行呢?
不只是机器码的问题,这种程序的运行需要特定的操作系统支持的,
如果你把它放在一个没有操作系统的机器上肯定也不能运行。

如果你做过嵌入式系统开发就会明白,在没有操作系统的情况下,
所有的一切你都要考虑,也都由你决定,如果用C开发就需要为它准备运行环境,
如堆栈之类的,还要考虑链接定位的问题,如代码和数据放在内存的哪个位置。

最近在学这个,所以就拿它举个例子。







__________________
Were you wondering was the gamble worth the price?
  guoke 当前离线   回复时引用此帖
旧 10-07-29, 17:45 第 9 帖
zxd123314
 
zxd123314 的头像
 
 
注册会员  
  注册日期: Mar 2010
  帖子: 108
  精华: 0
 

我说啊,如果你能在LINUX上做一个0X2E,再给内核做一个PE插件,……
  zxd123314 当前离线   回复时引用此帖
旧 11-09-26, 03:56 第 10 帖
木人
 
 
 
注册会员  
  注册日期: May 2004
  帖子: 132
  精华: 0
 

这个简单的问题, 没必要复杂的回复。

我的回答比较简单, 不涉及专业知识。

无论是 windows 还是 linux 。他们的可执行程序都是 相对于 操作系统而言的。跟计算机体系也有关系。

linux 下没有.exe 这个特别的, 任何文件都可以有 执行位,但只有合适格式的才被正确执行

可执行文件的格式有很多。 比如 .bat .cmd .com .exe
编译, 有时候目标大,有时候目标小。 其实目标代码是都不会少的。
只是有时生成的代码包含在目标里。而有时候代码未被包含而已。
  木人 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 06:28


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2012, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2011, LinuxSir.Org