LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5625|回复: 9

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

[复制链接]
发表于 2006-8-13 16:34:46 | 显示全部楼层 |阅读模式
好久以来,在sir上都 是顶别人的贴,近来对win下的 exe 很好奇,不知道它到底包含什么东西?
希望有牛人帮忙详细解答一下
发表于 2006-8-13 16:53:36 | 显示全部楼层
可以参考  
http://madchat.org/vxdevl/papers/winsys/pefile/pefile.htm  
http://www.skynet.ie/~caolan/pub ... ump/doc/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)格式”。格式虽不同,但基本原理却相通。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-13 18:12:39 | 显示全部楼层
我不明白的地方如下:

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

所以请别误解我的意思,lolita大哥,我并非想研究到exe文件那些很莫名其妙的机器吗的东西。
回复 支持 反对

使用道具 举报

发表于 2006-8-13 19:46:10 | 显示全部楼层
Post by sumargin

用delphi编译而成的exe文件,必然用到vcl类库,而把这个exe文件拿到没有delphi,也没vcl库的电脑,却也能执行。是不是exe文件会把library等编译会用到的东西全部包含进来?

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

Post by sumargin

如果是这样的话,我写的程序有20多mb,为何compiler后只有几mb,甚至几百kb而已?

如果采用动态方式链接,那么并不会把库里头的东西拷贝到可执行目标文件; 模块间的链接是在加载、运行时由动态链接器自动完成,甚至在运行时由应用程序调用动态链接器来完成。这样生成的代码尺寸当然小,不过拿到没有特定库的机器上就跑不了。
回复 支持 反对

使用道具 举报

发表于 2006-8-26 23:01:46 | 显示全部楼层
我一直困惑的问题是,如果WIN还有LINUX 都在一个平台下,比如说我们的PC (intel)的硬件平台,他们在这个平台下的最终执行的代码都一样,也就是说机器码一样。那如果把WIN下的机器码文件(可以被处理器执行的机器码)拿到LINUX下,能不能一样的执行呢?
因为机器码是一样的 是不是可以执行呢?
回复 支持 反对

使用道具 举报

发表于 2006-8-26 23:13:12 | 显示全部楼层
Post by dinghwy
我一直困惑的问题是,如果WIN还有LINUX 都在一个平台下,比如说我们的PC (intel)的硬件平台,他们在这个平台下的最终执行的代码都一样,也就是说机器码一样。那如果把WIN下的机器码文件(可以被处理器执行的机器码)拿到LINUX下,能不能一样的执行呢?
因为机器码是一样的 是不是可以执行呢?

win下的 可执行文件是 PE 格式 ;  linux下的则是 ELF 文件格式, 两者的不同决定了程序无法直接在对方平台上执行,即使从微观来看,可能存在很多相同的代码片断。比如装载过程差异就很大,导致操作系统根本无法定位程序运行的入口点,自然跑不起来。 就像两种不同的机器引擎,只能在合适(兼容)的环境下(操作系统)才能运作。
回复 支持 反对

使用道具 举报

发表于 2006-8-27 08:52:48 | 显示全部楼层
LZ最好去 www.pediy.com 看看PE格式的资料
回复 支持 反对

使用道具 举报

发表于 2006-9-2 10:24:38 | 显示全部楼层
Post by dinghwy
我一直困惑的问题是,如果WIN还有LINUX 都在一个平台下,比如说我们的PC (intel)的硬件平台,他们在这个平台下的最终执行的代码都一样,也就是说机器码一样。那如果把WIN下的机器码文件(可以被处理器执行的机器码)拿到LINUX下,能不能一样的执行呢?
因为机器码是一样的 是不是可以执行呢?


不只是机器码的问题,这种程序的运行需要特定的操作系统支持的,
如果你把它放在一个没有操作系统的机器上肯定也不能运行。

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

最近在学这个,所以就拿它举个例子。
回复 支持 反对

使用道具 举报

发表于 2010-7-29 17:45:13 | 显示全部楼层
我说啊,如果你能在LINUX上做一个0X2E,再给内核做一个PE插件,……
回复 支持 反对

使用道具 举报

发表于 2011-9-26 03:56:15 | 显示全部楼层
这个简单的问题, 没必要复杂的回复。

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

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

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

可执行文件的格式有很多。 比如 .bat .cmd .com .exe
编译, 有时候目标大,有时候目标小。 其实目标代码是都不会少的。
只是有时生成的代码包含在目标里。而有时候代码未被包含而已。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表