链接后的exe文件是否仅包含机器语言?

Does exe file after linking consist of machine language only?

提问人:lotusrootmilk 提问时间:11/14/2023 最后编辑:Harithlotusrootmilk 更新时间:11/14/2023 访问量:81

问:

我在学习C语言时有一个问题。

如果我们编译编写源代码的高级语言,它就会变成一个 .obj 文件,如果我们链接这些文件,它就会变成一个 exe 文件,每个 obj 文件和 exe 文件由什么语言组成?集会?机器语言?我很好奇。

我认为exe文件是机器语言,因为我们的硬件理解exe文件来启动程序。

C EXE 计算机科学 机器代码

评论

0赞 john 11/14/2023
exe 文件的可执行部分将是机器代码。同样,目标文件也包含机器代码,尽管它不完整。
0赞 greg spears 11/14/2023
呜您可以在不同的文件查看器中打开许多EXE文件,以发现大量纯文本(人类语言)。针对用户的错误消息通常最容易挑选出来。即:“此程序无法在DOS模式下运行”......从 thinkorswim.exe
0赞 lotusrootmilk 11/14/2023
谢谢你的回答!!我很感激你的好意。祝你有美好的一天,谢谢!!
1赞 nielsen 11/14/2023
这回答了你的问题吗?除了原始机器指令之外,可执行文件中还有什么?
0赞 Martin James 11/14/2023
如果使用调试符号构建,可能会有很多可读的文本:)

答:

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!有好的一天