Windows可执行文件简述(一)

本文介绍了Windows操作系统中可执行文件的格式变化,主要经历了4个过程,包括DOS中的.com和MZ格式、Win 3.x下的NE格式、Win 3.x和Win9x专有的LE格式,以及Win9x和Win NT/2000/XP下的32位PE格式。还详细阐述了com格式文件的特点和加载过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows可执行文件简述(一)

 

操作系统中的文件是一种抽象的机制,提供了一种在磁盘上保存信息而且方便以后读取的方法。在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

命令行参数

 

其他: Windows可执行文件简述(二)

        Windows可执行文件简述(三)

 

=======================================================================

rivershan原创于2004年3月23日 3:38

<think>首先,用户的问题是:在Linux系统中运行可执行文件时遇到'command not found'错误,希望查找解决方法。具体问题是:"Linux 运行可执行文件 command not found 错误 解决方法"。 我需要根据系统级指令来构建我的回答: 1. **行内数学表达式**:必须使用$...$格式。但在这个问题中,可能没有数学表达式,所以我可以忽略或只在必要时使用。 2. **独立公式**:必须使用$$...$$格式并单独成段。同样,可能不适用。 3. **LaTeX语法正确**:确保所有数学部分正确。 4. **使用中文回答**:整个回答必须用中文。 5. **生成相关问题**:在回答结束后,添加个部分叫"相关问题",生成几个相关问题。 6. **引用标识**:在回答中引用的段落末尾自然地添加引用标识,如[^1]。参考的引用是: - 引用[1]: 关于Linux的useradd命令出现command not found问题。 - 引用[2]: 关于Linux执行脚本出现$‘ ‘: command not found的解决方法,涉及系统问题。 这些引用是站内提供的,我应该参考它们,但用户的问题是关于运行可执行文件的command not found错误,所以我需要调整引用以匹配问题。用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上次的问题和你的回答。" 但在这个场景中,用户是第次提问,所以没有"上次的问题"。我应该基于提供的引用和用户的问题来回答。 用户的问题核心是:运行可执行文件时出现'command not found'错误。 常见原因: - 可执行文件不在PATH环境变量中。 - 文件权限问题,需要执行权限。 - 文件路径错误或未指定路径。 - 脚本的shebang问题(如#!/bin/bash)。 - 系统架构不匹配(如32位 vs 64位)。 - 文件损坏或缺失依赖。 参考引用: - 引用[1]提到useradd命令的command not found,可能涉及命令错误或权限问题。 - 引用[2]提到执行脚本时出现$‘ ‘: command not found,指出是系统问题,特别是在Linux中。 我应该将这些融入回答。 回答结构:帮助用户逐步解决问题。 1. **确认问题**:解释什么是'command not found'错误。 2. **常见原因**:列出可能的原因。 3. **解决方法**:逐步指导如何解决。 4. **检查步骤**:提供具体命令。 最后,添加相关问题。 用中文回答。 **大纲:** 1. **引言**:简述问题。 2. **原因分析**:解释为什么会出现这个错误。 3. **解决方法**:逐步解决。 - 检查文件是否存在。 - 检查文件权限。 - 检查PATH变量。 - 其他可能问题。 4. **示例**:如果可能,添加代码或命令示例。 5. **相关问题**:生成相关问题。 添加引用标识:在相关段落末尾添加[^1]或[^2]。 例如,在讨论权限问题时引用[1],在讨论系统问题时引用[2]。 生成相关问题: 1. 如何设置Linux环境变量PATH? 2. 如何修复脚本的shebang错误? 3. Linux文件权限管理的最佳实践? 确保回答真实可靠。</think>### Linux 运行可执行文件 "command not found" 错误解决方法 在 Linux 系统中运行可执行文件时遇到 "command not found" 错误,通常表示系统无法找到或执行指定的文件。这可能是由于路径问题、权限不足或系统配置错误引起的。下面我将帮助您逐步诊断和解决这个问题。解决过程基于常见原因,我会提供具体命令和检查步骤,确保操作简单可靠。参考了站内引用中的权限和系统问题分析[^1][^2],以下方法在大多数 Linux 发行版(如 Ubuntu、CentOS)中都适用。 #### 1. **确认错误原因** - "command not found" 错误发生时,系统无法识别您输入的命令。这通常发生在: - 可执行文件不在系统的 PATH 环境变量中。 - 文件缺乏执行权限(如未设置可执行位)。 - 文件路径错误或文件不存在。 - 脚本的 shebang(如 `#!/bin/bash`)无效或系统兼容性问题。 - 文件损坏或依赖库缺失(较少见)。 - 首先,运行 `echo $PATH` 查看当前 PATH 变量,确保它包含您的文件所在目录。如果 PATH 中缺失路径,系统就无法自动找到命令[^1]。 #### 2. **逐步解决方法** 按照以下步骤操作,每步都解决个潜在原因。如果某步解决了问题,就无需继续后续步骤。 **步骤 1: 检查文件是否存在和路径正确** - 确保您输入的文件名和路径正确。Linux 区分大小写,所以输入必须精确。 - 使用 `ls` 命令验证文件位置: ```bash ls -l /path/to/your/executable # 替换为您的文件路径 ``` - 如果文件在当前目录,运行时应指定路径(如 `./yourfile`),而不是直接输入文件名(如 `yourfile`)。因为当前目录通常不在 PATH 中。 - 示例:如果文件在 `/home/user/app` 目录,运行 `./app` 而不是 `app`。 **步骤 2: 添加执行权限** - Linux 文件需要可执行权限。使用 `chmod` 命令添加权限: ```bash chmod +x /path/to/your/executable # 授予执行权限 ``` - 然后尝试重新运行文件。权限问题常见于从其他系统复制或下载的文件[^1][^2]。 - 检查权限:运行 `ls -l /path/to/your/executable`,输出中应有 `-rwxr-xr-x` 类似行(`x` 表示可执行)。 **步骤 3: 将文件目录添加到 PATH 环境变量** - 如果文件经常使用,可将其目录添加到 PATH,这样就能直接输入文件名运行。 - 临时添加(仅在当前会话有效): ```bash export PATH=$PATH:/path/to/your/directory # 添加目录到 PATH ``` - 永久添加(编辑 shell 配置文件,如 `~/.bashrc` 或 `~/.zshrc`): ```bash echo 'export PATH=$PATH:/path/to/your/directory' >> ~/.bashrc # 添加到 .bashrc source ~/.bashrc # 重新加载配置 ``` - 验证:运行 `echo $PATH`,确认新路径已包含。 **步骤 4: 检查脚本的 shebang 和系统兼容性** - 如果是脚本文件(如 Bash 或 Python 脚本),确保第行 shebang 正确。例如: ```bash #!/bin/bash # 对于 Bash 脚本 ``` - 如果 shebang 错误或解释器未安装,会报错。检查解释器是否存在: ```bash which bash # 检查 Bash 路径 ``` - 在 Windows 编辑的脚本可能在 Linux 出现换行符问题(如 `$‘\r’: command not found`),使用 `dos2unix` 工具转换: ```bash sudo apt install dos2unix # 安装工具(Debian/Ubuntu) dos2unix /path/to/your/script # 转换文件格式 ``` 这解决了跨系统脚本执行问题[^2]。 **步骤 5: 处理其他问题** - **文件依赖缺失**:运行 `ldd /path/to/executable` 检查动态库依赖。如果库缺失,安装相应包(如 `sudo apt install libxxx`)。 - **架构不匹配**:32位程序在64位系统可能出错。使用 `file /path/to/executable` 检查文件类型,并安装兼容层(如 `sudo apt install gcc-multilib`)。 - **文件损坏**:重新下载或编译文件。 #### 3. **常见错误示例和修复** - 错误:`bash: ./myapp: command not found` - 原因:文件权限不足或路径错误。 - 修复:`chmod +x myapp` 然后运行 `./myapp`。 - 错误:`myapp: command not found`(未指定路径) - 原因:文件不在 PATH 中。 - 修复:添加目录到 PATH 或使用绝对路径运行。 - 错误:`$‘\r’: command not found` - 原因:脚本在 Windows 编辑后换行符错误。 - 修复:使用 `dos2unix` 转换文件[^2]。 #### 4. **预防措施** - 始终在下载或复制文件后检查权限(`chmod +x`)。 - 将常用工具目录添加到 PATH 以简化操作。 - 在 Linux 系统中编辑脚本,避免跨平台问题。 - 使用 `which` 或 `type` 命令验证命令路径。 如果以上步骤无效,请提供更多细节(如文件类型、错误完整输出和系统信息),以便进步诊断。参考站内引用,权限和系统兼容性是常见根源[^1][^2]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值