Windows可执行文件简述(二)

本文介绍了MS-DOS下的三种主要可执行文件格式:COM、MZ和NE。详细解释了每种格式的特点及结构,包括它们如何被加载到内存中运行、头部信息的作用以及重定位过程。

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

如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL00h,否则为0FFhMS-DOS还置AH00h0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符。

 

建造PSP后,MS-DOSPSP后立即开始(偏移100h)加载com文件,它置SSDSESPSP的段地址,接着创建一个堆栈。为了创建这个堆栈,MS-DOSSP0000h。如果没有分配64K内存,则要置寄存器为比所分配的字节总数大2的值。最后,它把0000h推进栈,这是为了保证与在早期MS-DOS版本上设计的程序的兼容性。

 

MS-DOS通过把控制传递偏移100h处的指令而启动程序。程序设计者必须保证com文件的第一条指令是程序的入口点。

 

注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于100h.汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始使用语句org 100h)。

 

下面是一个简单的com文件Win32 ASM的例子:

 

MAN STRUCT                           ;定义一个结构

       W  dw 1234h                ;dw 也可用 word

       B  db 9 dup(?)               ;db 也可用 byte

MAN ENDS

 

.model tiny                          ;com格式文件

.data                                   ;对于com格式文件,数据段的内容会自动放到代码段后

zz  MAN <>,<1,"abcd">,<3,"Ldf">

.code                                  ;代码段

.startup                               ;可使下面的指令从0100H 开始(com格式文件要求)

mov ax,3031h

mov zz.W,ax                ;对结构赋值

mov zz.B,'1'

mov ax,type(MAN)       ;取结构所占字节数

.exit                                  ;可设置返回码

end

 

2MZ格式

com发展下去就是MZ格式的可执行文件,这是DOS所能了解的具有重定位功能的可执行文件格式。MZ可执行文件内含16位代码,在这些代码之前加了一个文件头,文件头中包括各种说明数据,如第一句可执行代码执行指令时所需要的文件入口点、堆栈的位置、重定位表等,操作系统根据文件头重的信息将代码部分装入内存,让后根据重定位表修正代码,最后在设置好堆栈后从文件头中指定的入口开始执行。所以DOS可以把程序放在任何它想要的地方。下图是MZ格式的可执行文件的简单结构示意图:

 

MZ标志

MZ文件头

其它信息

重定位表的字节偏移量

重定位表

重定位表

可重定位程序映像

二进制代码

3NE格式

为了保持对DOS的兼容性和保证Windows的需要,在Win 3.x中出现的NE格式的可执行文件中保留了MZ格式的头(具体原因后面会说,这里就不赘述了),同时NE文件又加了一个自己的头,之后才是可执行文件的可执行代码。Win 3.x中的16Windows程序或OS/2程序都有可能是NE格式的。NE类型包括了.exe.dll.drv.fon四种类型的文件。NE格式的关键特性是:它把程序代码、数据、资源隔离在不同的可加载区块中。它也藉由符号输入和输出,实现所谓的执行时期动态链接。16位的NE格式文件装载程序(NE Loader)读取部分磁盘文件,并生成一个完全不同的数据结构,在内存中建立模块。当代码或数据需要装入时,装载程序必须从全局内存中分配出一块,查找原始数据在文件的什么地方,找到位置后再读取原始的数据,最后再进行一些修整。还有,每一个16位的Module要负责记住现在使用的所有段选择符,该选择符表示该段是否已经被抛弃等等。下图是NE格式的可执行文件的结构示意图:

 

MS-DOS

DOS文件头

保留区域

Windows头偏移

DOS Stub程序

信息块

NE文件头

段表

资源表

驻留名表

模块引用表

引入名字表

入口表

非驻留名表

代码段和数据段

程序区

重定位表

 

 

 

 

 

 

 

 

 

<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]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值