【问题标题】:Producing executables within Linux (in relation to implementing a compiler)在 Linux 中生成可执行文件(与实现编译器有关)
【发布时间】:2011-07-04 23:43:53
【问题描述】:

在我的大学毕业论文中,我将为 C 编程语言的骨架形式实现一个编译器,然后继续对其进行扩展,直到它类似于带有数组边界检查、类型 - 的 Java检查等等。

我比较能胜任编译器构造相关的大部分理论,并且有使用 MIPS 汇编语言编程的经验,所以我对编写极低级代码是什么有点了解。

我主要担心的是,我可能能够一直到需要生成实际机器代码输出的地步,但从运行它的操作系统。

所以,我的实际问题基本上是,“有没有人知道最好的地方来阅读关于编写程序集以在 linux 下的 intel x86-64 处理器上运行?”

我所知道的主要差距是机器代码是如何在实践中实际运行的。它是直接在处理器上运行,当它需要内核提供的服务时进行“系统调用”(或 x86 等价物),还是汇编语言以某种方式是一种封装描述,告诉内核如何 em> 执行指令(以类似于 Java 等解释性语言的方式)?

您能提供的任何帮助将不胜感激。

【问题讨论】:

  • 我也会读一下,谢谢你的帮助:)
  • 你可能想谷歌一下 ELF 文件格式
  • 您是要直接发出 ELF 可执行文件,还是可以与其他库链接的目标文件?后一个选项更强大,因为链接到 glibc 和其他汇编程序、C 和 C++ 模块意味着您根本不用担心系统调用。
  • 你是想直接发出一个 ELF 可执行文件,还是一个可以与其他库链接的目标文件?事实上,在阅读之后我也不确定其他用户的建议,我倾向于让我的编译器生成一个 ELF 可执行文件。但我对两者的优势/特点还不够了解,无法做出明智的选择。我对可执行文件几乎一无所知,直到现在,知道我为给定语言所用的编译器制作了一个就足够了,而不是它们实际上是如何工作的

标签: linux compiler-construction assembly linux-kernel compiler-theory


【解决方案1】:

本文档解释了如何实现外部函数接口与其他代码交互:http://www.x86-64.org/documentation/abi.pdf

【讨论】:

  • 这是x86_64上Linux使用的外部ABI,对OP会有很大帮助。
【解决方案2】:

首先,机器码从这里开始:http://www.intel.com/products/processor/manuals/

接下来,我假设您关于机器代码如何运行的问题实际上是关于操作系统如何将 exe 加载到内存中并调用 main()?这些链接可能会有所帮助

链接器和加载器: http://www.linuxjournal.com/article/6463

ELF 文件格式: http://en.wikipedia.org/wiki/Executable_and_Linkable_Formathttp://www.linuxjournal.com/article/1060

您的机器代码将进入可执行文件的 .text 部分

最后,祝你好运。您的项目与我最后一年的项目类似,除了我针对 JVM 并编译了 Visual Basic 的子集!

【讨论】:

  • 以 JVM 为目标实际上可能是一个更好的主意......因为我有一个标准的机器语言,我可以在任何系统上演示我的编译器......嗯,谢谢你的回答,我会考虑的。 (我的项目的具体细节还没有确定,目前的标题只是“A Compiler for C in Haskell”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多