提问人:lotusrootmilk 提问时间:11/14/2023 最后编辑:Harithlotusrootmilk 更新时间:11/14/2023 访问量:81
链接后的exe文件是否仅包含机器语言?
Does exe file after linking consist of machine language only?
问:
我在学习C语言时有一个问题。
如果我们编译编写源代码的高级语言,它就会变成一个 .obj 文件,如果我们链接这些文件,它就会变成一个 exe 文件,每个 obj 文件和 exe 文件由什么语言组成?集会?机器语言?我很好奇。
我认为exe文件是机器语言,因为我们的硬件理解exe文件来启动程序。
答:
1赞
Yunnosch
11/14/2023
#1
除了纯文本(正如 gregspears 在评论中提到的)之外,通常还有初始化值列表,这些值在启动时被复制到全局启动变量中,即用于初始化它们。显式初始化的局部静态变量也是如此。提到的明文是其中的一个特例,伴随着整数值、浮点值等。
这些只是值,不是“设置...”的一部分。指令,在启动时复制它们的代码在其他地方,基本上是一个循环。
简而言之:不。
2赞
Serge Ballesta
11/14/2023
#2
这取决于操作系统,更准确地说取决于它的加载器。加载程序定义一个约定,通过该约定读取可执行文件,并且:
- 可选的读取描述符表,以了解文件的哪些部分将被标记为可执行和/或只读
- 可选分配额外的内存
- (可选)读取加载器描述符以动态链接新的可执行文件到动态链接的库(如果尚未加载,则首先加载)
- 可选解析内部地址,即存储内存段的起始点,以允许程序的不同部分相互了解
- 初始化指向堆栈顶部的堆栈指针
- 初始化指向可执行代码开头的程序指针
从那时起,所有直接可执行的代码都应包含纯本机机器代码。但是,该机器代码可用于动态解释完整的源代码或中间可移植字节码。例如,Python 编译器的工作方式是:它们将本机 Python 字节码解释器和 Python 模块的字节码嵌入到单个可执行文件中。
话虽如此,我还记得 CP/M 中的标准格式,并且 MS/DOS 支持兼容性:.COM
- 文件的内容在一个段中加载到内存中
- 段寄存器(Intel 8086 实模式)全部初始化为该段
- 前 256 个字节的某些部分被重写以包含程序环境和父程序环境的地址(以及其他我不再记得的东西......
- 堆栈指针已初始化到段的顶部
- 程序计数器初始化为值 256(十六进制0x100),相对于 当然
没有表,没有额外的分配,没有动态链接......然而,该程序必须包含其初始化的数据,无论是文本数据还是二进制数据。
评论
0赞
lotusrootmilk
11/14/2023
谢谢!!我很感激你的好意,我学编程已经一个月了。所以你的评论有点难以理解。哈哈,但是我会继续研究和理解它。我也想帮助像你这样的人。谢谢Ballesta!有好的一天
评论