c++ - 是什么将汇编转换为实际可执行的材料?
问题描述
我对编译器的了解是,它们将源代码转换为程序集,然后神奇地将该程序集转换为可执行文件。
他们如何将程序集变成可执行文件?任何链接都会受到赞赏,因为我想用 C++ 制作自己的编译器。
解决方案
要将汇编语言转换为可执行文件,您首先使用汇编器,然后(通常)使用链接器。
汇编器将获取汇编语言源代码并(通常)以某种格式或其他格式(例如,COFF 或 ELF)生成目标文件。确切的细节因指令集而异,但典型的处理器将有一个表(或多个表)显示该处理器的指令是如何编码的。汇编器解析指令,然后使用编码表中的信息告诉它如何生成对这些指令进行编码的单词。
然后,链接器获取该目标文件,至少可能将它与包含它使用但未定义的外部例程的其他文件结合起来,并生成一个可执行文件。同样,细节有所不同,但在这种情况下,变化主要基于所涉及文件的格式。曾经,大多数链接器都生成静态可执行文件,因此程序使用的任何外部函数都需要链接器将该函数复制到可执行文件中。大多数现代操作系统/加载器都支持某种形式的动态链接,其中程序可以依赖于未静态复制到程序中的外部例程——相反,程序通常包含对文件名和函数名的引用,它是直到操作系统的加载器在加载时找到文件,为每个函数分配一个地址,
推荐阅读
- javascript - 为什么即使我正确输入了我的基本代码,我的注册页面也不起作用
- java - 如何让两个 dockerized 应用程序在给定端口上通信?
- r - R:润滑输出格式 DMY
- java - 我们可以在一个项目中同时使用 Java Spring mvc 和 Spring Boot 吗?
- python - 谁能建议一种更快的方法来创建这个数组?
- django - Reactjs SPA 在拆分代码后停止工作,(静态包未从 AWS S3 加载)
- javascript - 使用 fetch 检查图像是否存在(函数不返回响应)
- angular - How to change order of a drag and drop list in Angular Material with up or down buttons?
- sql-server - SSIS 建议中的 Foreach 循环容器
- java - 在产生事件 B 后手动确认 Kafka 事件 A 消费