Windows可执行文件简述(一)

本文介绍了Windows操作系统中可执行文件格式的发展历程,包括简单的.com文件、MZ格式、NE格式、LE格式及PE格式,并详细解析了.com文件的结构。

操作系统中的文件是一种抽象的机制,提供了一种在磁盘上保存信息而且方便以后读取的方法。在Windows操作系统中,一个用户可以最直接体会到的文件的形式就是以.exe.dll等为扩展名的可执行文件。伴随着Windows操作系统的不断进步,其可执行文件的格式也发生了巨大变化。这期间主要有4个过程:DOS中出现的最简单的以.com为扩展名的可执行文件和以.exe为扩展名的MZ格式(MZMZ格式的主要作者Mark Zbikowski的名字的缩写)的可执行文件,Win 3.x下出现的NENew Executable:分段可执行文件)格式的.exe.dll文件,Win 3.xWin9x所专有的LELinear Executable:线性可执行文件,专用于VxD文件),Win9xWin NT/2000/XP下的32位的可执行文件PEPortable Executable:可移动的可执行文件)。这里面comMZNE属于Win16PE属于Win32LE可以兼容Win16Win32

 

       在一个操作系统中,可执行的代码最终被装入内存执行之前是以文件的方式存放在磁盘中的,也就是以可执行文件的方式。下面是Microsoft Windows操作系统中的可执行文件的概述。

1com格式

Windows下最简单的可执行文件就是DOS下的以.com为扩展名的com文件。com文件是旧有的只有64kb内存的cp/m机器的产物。com格式文件最大64Kcom文件内含16位程序的二进制代码映像,没有重定位信息。

 

com文件包含程序的二进制代码的一个绝对映像。也就是说,为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映像从文件拷贝到内存而加载com程序;它不作任何改变。

 

为加载一个com程序,MS-DOS首先试图分配内存,因为com程序必须位于一个64K的段中,所以com文件的大小不能超过65,02464K减去用于PSP256字节和用于一个起始堆栈的至少256字节)。如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够内存,则分配尝试失败。否则,MS-DOS分配尽可能多的内存(直至所有保留内存)。即使com程序本身不能大于64K。在试图运行另一个程序或分配另外的内存之前,大部分com程序释放任何不需要的内存。

 

分配内存后,MS-DOS在该内存的头256字节建立一个PSPProgram Segment Prefix,程序段前缀),PSP结构如下:

偏移

大小(Byte

 

0000h

02

中断20H

0002h

02

以节计算的内存大小(利用这个可看出是否感染引导型病毒)

0004h

01

保留

0005h

05

DOS的长调用

000Ah

02

INT 22H 入口 IP

000Ch

02

INT 22H 入口 CS

000Eh

02

INT 23H 入口 IP

0010h

02

INT 23H 入口 CS

0012h

02

INT 24H 入口 IP

0014h

02

INT 24H 入口 CS

0016h

02

父进程的PSP段值(可测知是否被跟踪)

0018h

14

存放20SOFT

002Ch

02

环境块段地址(从中可获知执行的程序名)

002Eh

04

存放用户栈地址指针

0032h

1E

保留

0050h

03

DOS调用(INT 21H / RETF

0053h

02

保留

0055h

07

扩展的FCB

005Ch

10

格式化的FCB1

006Ch

10

格式化的FCB2

007Ch

04

保留

0080h

80

命令行参数长度

0081h

127

命令行参数

 

 

 

 

 

 

 

<think> 首先,用户的问题是:“我想查找将Python代码编译成可执行文件exe的方法 请问Python代码编译成可执行文件exe的方法”。所以,我需要提供将Python代码编译成可执行文件exe的方法。 系统级指令强调: - 所有行内数学表达式必须使用$...$格式(但这里可能不涉及数学表达式,因为主题是Python打包)。 - 独立公式必须使用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(确保在需要时)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 引用提供了: - 引用[1]: 使用PyInstaller打包Python代码成EXE文件。 - 引用[2]: PyInstaller编译Python代码,可能包含依赖项,文件较大,需要定制选项。 - 引用[3]: PyInstaller的使用示例,文件大小信息。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上次的问题和你的回答。” 但在这个对话中,这是用户的第条消息;之前没有交互。系统提示说“参考用户上次的问题和你的回答”,但这里没有上次问题。所以,我需要基于当前查询。 用户查询的核心是:“将Python代码编译成可执行文件exe的方法”。从引用中,主要方法是使用PyInstaller。 我需要构建个结构清晰的回答: 1. **介绍方法**:主要使用PyInstaller。 2. **步骤**:如何安装和使用PyInstaller。 3. **注意事项**:如文件大小、依赖项等。 4. **结束**:自然地添加引用标识。 此外,生成相关问题。 回答结构: - 开头:直接回应问题。 - 正文:分步解释方法。 - 结尾:生成相关问题。 使用中文回答。 生成相关问题:基于主题,如其他工具、优化方法等。 可能的步骤: 1. 安装PyInstaller。 2. 使用PyInstaller命令打包代码。 3. 处理依赖项和定制。 从引用中: - [1] 提到使用PyInstaller。 - [2] 提到文件大小和定制选项。 - [3] 提到文件大小示例。 所以,核心是PyInstaller。 其他工具?如cx_Freeze, Py2exe等,但引用中没有提到,所以我应该基于引用。系统提示说“尽可能多的参考用户上次的问题和你的回答”,但这里没有,所以 stick to the references or provide accurate general knowledge. 在回答中自然地添加引用标识。例如,如果我提到文件大小,可以添加[^2]。 最终回答组织: - 开头简述方法。 - 详细步骤。 - 注意事项。 - 相关问题。 确保LaTeX正确:如果不涉及数学,可能不需要。 </think> ### Python代码编译成可执行文件exe的方法 感谢您的查询!将Python代码编译成可执行文件(.exe)是种常见的需求,它能让您的Python程序在没有安装Python环境的Windows系统上运行。这里,我将基于参考引用和可靠知识,以PyInstaller工具为例(这是最简单和常用的方法),逐步介绍完整流程。PyInstaller能将Python脚本打包成个独立的可执行文件,方便分发和使用[^1]。 #### 步骤1: 安装PyInstaller 首先,确保您的系统已安装Python(建议使用Python 3.6或更新版本)。然后,通过命令行(如Windows的CMD或PowerShell)安装PyInstaller: ```shell pip install pyinstaller ``` 这步会自动下载并安装PyInstaller及其依赖项。安装完成后,您可以通过`pyinstaller --version`验证是否成功[^1]。 #### 步骤2: 准备Python脚本 假设您的Python脚本文件为`your_script.py`(请替换为您的实际文件名)。确保脚本位于个干净的目录中,避免路径问题。例如,如果您的脚本是`hello.py`(内容:`print("Hello, World!")`),您可以将其放在`C:\my_project\`目录下。 #### 步骤3: 使用PyInstaller打包 在命令行中,导航到您的脚本目录(如`C:\my_project\`),然后运行打包命令: ```shell pyinstaller --onefile your_script.py ``` - `--onefile`选项:将所有依赖项打包成个单独的.exe文件(而不是多个文件),便于分发[^1][^2]。 - 打包过程会自动处理依赖项(如导入的库),PyInstaller会扫描您的脚本并包含必要的模块。 - 打包完成后,生成的文件位于`dist`子目录中(例如,`C:\my_project\dist\your_script.exe`)。您可以直接运行这个.exe文件测试效果。 #### 步骤4: 自定义选项(可选) PyInstaller支持多种自定义选项,以适应不同需求: - **指定图标**:为.exe文件添加自定义图标(.ico格式),使用`--icon`参数: ```shell pyinstaller --onefile --icon=your_icon.ico your_script.py ``` - **减少文件大小**:PyInstaller打包的文件可能较大(原始脚本仅几KB,但打包后可能达到10MB以上,因为它包含了Python解释器和依赖库)[^2][^3]。如果文件大小是问题,可以: - 使用UPX(Ultimate Packer for eXecutables)压缩:先下载UPX(https://upx.github.io/),然后在PyInstaller命令中添加`--upx-dir`路径: ```shell pyinstaller --onefile --upx-dir=C:\path\to\upx your_script.py ``` - 排除不必要的库:通过`--exclude-module`参数移除未使用的模块。 - **包含数据文件**:如果脚本需要外部文件(如图片或配置文件),使用`--add-data`参数: ```shell pyinstaller --onefile --add-data "data;data" your_script.py ``` 更多选项请参考PyInstaller官方文档(https://pyinstaller.org/)[^2]。 #### 注意事项 - **文件大小和性能**:PyInstaller打包的.exe文件通常会比原始脚本大很多(例如,个4KB的脚本可能生成16MB的文件夹),因为它嵌入了Python解释器。这不是真正的“编译”,而是打包成个可执行包,在运行时通过CPython解析器执行[^3]。 - **跨平台兼容性**:PyInstaller主要支持Windows,但也可以在macOS和Linux上生成相应系统的可执行文件(使用方法类似)。 - **常见问题排查**: - 如果运行时出错(缺少模块),尝试使用`--hidden-import`参数强制包含特定库。 - 确保所有依赖库已安装(通过`pip install`)。 - 测试.exe文件时,在干净的虚拟机或另台无Python的电脑上验证兼容性[^1][^2]。 - **替代工具**:除了PyInstaller,您也可以考虑其他工具如cx_Freeze或Py2exe,但PyInstaller是当前最流行和易用的选择,适合大多数场景[^1]。 这个方法已经帮助许多开发者轻松分发Python应用(如引用中的猫和老鼠游戏示例)[^1]。如果您有具体脚本或问题,提供更多细节,我可以给出针对性建议!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值