为什么一个EXE文件不能超过4GB大小限制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计757个文字,预计阅读时间需要4分钟。
为什么EXE不能超过4GB?前几天看到大家讨论EXE安装的问题,真是神奇。有人说PE装载数据受到进程空间限制,有的说PE一定是整体装载,有的则举例说用ZIP自解压包。我大致想了想,...
为什么EXE不能超过4GB
前几天看到大家在讨论EXE装载的问题,很新奇。有的说PE装载受到进程空间的限制,有的说PE一定是整体装入,有的用ZIP自解压包来举例子。
我当时大概想了一下,觉得PE不一定是要整体装入的。PE文件包含一个PE header,里面定义了各个段,比如代码,资源等等的偏移地址,装载的时候应该不会超出这个PE header的定义。也就是说,如果PE header里面定义了最远的段是10M,但是PE文件有100M的话,应该最多只有10M装载。
于是我写了一个程序来测试下。首先写一个简单的C++的helloworld。然后随便在硬盘上找了个700M左右的A片,然后执行下面的命令把这两个文件拼合起来成为一个新的EXE:
copy /B helloworld.exe /B + 常盘みちる.avi /B largepe.exe /B
然后运行这个largepe.exe, 一切正常。在debugger中加载这个largepe.exe后发现,这个module占据的内存空间和helloworld一样,并没有包avi那部分。
所以我在想,既然是这样的话,我可以把很大的数据放到exe文件后面,然后在exe的实现里面来分段读取这些数据,实现自我播放自我解压之类的。为了再次证明这一点,我用dxshow写了一个简单的播放程序,然后用同样的办法拼接了一个4G多的高清版本。运行,发现:
不能运行。
本文共计757个文字,预计阅读时间需要4分钟。
为什么EXE不能超过4GB?前几天看到大家讨论EXE安装的问题,真是神奇。有人说PE装载数据受到进程空间限制,有的说PE一定是整体装载,有的则举例说用ZIP自解压包。我大致想了想,...
为什么EXE不能超过4GB
前几天看到大家在讨论EXE装载的问题,很新奇。有的说PE装载受到进程空间的限制,有的说PE一定是整体装入,有的用ZIP自解压包来举例子。
我当时大概想了一下,觉得PE不一定是要整体装入的。PE文件包含一个PE header,里面定义了各个段,比如代码,资源等等的偏移地址,装载的时候应该不会超出这个PE header的定义。也就是说,如果PE header里面定义了最远的段是10M,但是PE文件有100M的话,应该最多只有10M装载。
于是我写了一个程序来测试下。首先写一个简单的C++的helloworld。然后随便在硬盘上找了个700M左右的A片,然后执行下面的命令把这两个文件拼合起来成为一个新的EXE:
copy /B helloworld.exe /B + 常盘みちる.avi /B largepe.exe /B
然后运行这个largepe.exe, 一切正常。在debugger中加载这个largepe.exe后发现,这个module占据的内存空间和helloworld一样,并没有包avi那部分。
所以我在想,既然是这样的话,我可以把很大的数据放到exe文件后面,然后在exe的实现里面来分段读取这些数据,实现自我播放自我解压之类的。为了再次证明这一点,我用dxshow写了一个简单的播放程序,然后用同样的办法拼接了一个4G多的高清版本。运行,发现:
不能运行。

