【问题标题】:Creating an a.out executable from scratch从头开始创建 a.out 可执行文件
【发布时间】:2013-12-29 19:01:56
【问题描述】:

我用 C 从头开始​​创建了一种编程语言。我构建了一个编译器,它处理输入文件中的代码并将其转换为标记并检查标记的顺序是否正确。我在编译器的最后一步:输出/可执行文件。我想创建一个可以在终端中运行的输出。我想创建一个 a.out 输出,但我能找到的唯一资源是 this from nasm,这对我没有帮助。

所以我的问题是,如何创建可以在终端中运行的 a.out 文件(unix 可执行文件)?

【问题讨论】:

  • “最简单”的方式是生成汇编代码,然后使用现有的汇编器+链接器生成最终的可执行文件。
  • 我认为你应该阅读一些 ELF 文档。
  • @OliCharlesworth 我想在我的应用程序内完成所有处理和编译
  • 那么你确实需要查看你提到的nasm源。 aout_write 函数从头开始创建一个新的可执行文件,正如您所见,它并不像“只输出原始代码”那么简单。
  • 选择一种格式,a.out、elf、intel hex 等,找到有关该格式的详细信息,然后创建该文件。就是这么简单,在我写这篇文章的时候,我搜索了 a.out 格式并找到了详细信息。

标签: c unix compiler-construction executable machine-code


【解决方案1】:

你写的很好,你正处于编译器的最后一步......

  • 你确定吗?
  • 它是什么类型的语言?
  • 例如 Pascal/C/C++ 等非 asm 语言需要引擎

正如之前在 cmets 中提到的,您可以:

  1. 在您的应用中使用现有的汇编编译器/链接器

    • 这是最简单的方法
    • 您需要在 asm 中创建语言运行时引擎代码
    • 然后将源代码编译为 asm
    • 将这两个来源放在一起
    • 并调用编译器/链接器
    • 但您可以忘记断点和跟踪...
    • 如果你不喜欢 asm,也有 C/C++ 编译器/链接器
  2. 创建自己的编译链接器

    • 首先你需要学习可执行文件格式
    • 为其创建模板
    • 其次您需要编写自己的 asm 编译器
    • 不需要完整的指令集
    • 只是为了拥有将您的语言翻译成机器代码所需的所有东西
    • 然后只需将您的语言编译为机器代码
    • 并用代码和所有必要的数据填充模板
    • 另存为 a.out ...

语言运行时引擎:

  • 它类似于您的程序的操作系统
  • 您的语言支持的一组子例程
  • 类似于终端/真实操作系统与您的程序之间的接口
  • 内存/资源管理
  • 处理本地/全局/静态变量
  • 堆/栈...
  • 线程
  • 调试中
  • 还有更多...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2020-04-21
    • 2021-04-12
    • 2021-11-18
    相关资源
    最近更新 更多