c++ - 为自制操作码列表创建 C++ 编译器/链接器

标签 c++ compiler-construction licensing

<分区>

有没有办法告诉 C++ 编译器/链接器将源代码编译到我自己的自制操作码列表中?我的虚拟机需要它,它将在微 Controller 上执行。
我不想从头开始创建一个 C++ 编译器,而只是更改操作码、CPU 状态寄存器的地址、堆栈指针和 GPIO 寄存器、程序内存和数据内存来自现有的开源编译器,以便人们为它不必重写整个代码,而只需使用与我自己的编译器库兼容的库来移植它。
示例是 avr-gcc 编译器。
编译器及其库不得以我或任何程序员必须为其付费的方式专有,并且我不希望它成为 GPL,以至于程序员必须为他们自己的项目公开源代码。我希望我所有的程序员都可以自由使用我的编译器,可以自由地以他们想要的任何方式许可他们的工作,也可以选择将其开源或专有。

最佳答案

让我们考虑一下所涉及的步骤:

重新定位现有的 C++ 编译器:目前可以免费获得多种生产质量、可重新定位的 C++ 编译器。例如,LLVM 平台 (clang++) 提供了 some pointers关于为新硬件架构编写后端(这自然也适用于 VM!)。不幸的是,很难获得有关移植 GNU 编译器的最新文档。许多 older 完全有可能documents今天仍然很重要,但我对 GCC 知之甚少。

请注意,重新定位任一编译器所需的工作可能取决于虚拟机的指令集与编译器的低级匹配程度 intermediate representation .由于它们通常(至少语义上)采用三地址代码的形式——即具有两个源操作数和一个目标的指令——编写一个代码生成器,例如,一个堆栈机(其中所有操作数都被隐式寻址)可能会更加困难。

从现在开始,您真的有两个选择。您可以坚持编译 C++ 程序的传统方式,即从源代码到程序集、目标文件、链接的可执行文件或库。这涉及完成我在下面概述的步骤。但是由于您的目标是虚拟机,它的要求可能与现代硬件架构的要求截然不同。在这种情况下,您可能希望避开现有的软件,例如 binutils,并使用您自己的汇编器和链接器。

编写或移植汇编器:除非您选择的编译器能够直接生成机器代码,否则您很可能还需要为虚拟机编写汇编器,或移植现有的汇编器。如果你的虚拟机的指令集看起来像现代机器的指令集,并且你想使用标准的 C++ 编译/链接管道,你可以查看 porting binutils ,特别是 gas,GNU 汇编程序。

编写或移植链接器:汇编器生成的目标文件本身不是可执行程序。必须将地址分配给符号和段,并且必须解析目标文件之间的引用。这意味着链接器需要对您的指令集有所了解。特别是,它必须能够找到并修补代码和数据中寻址内存的位置。我在上面链接的 binutils 移植指南也与这里相关;您可能还喜欢阅读 Linkers and Loaders .


正如@Mat 在上面的评论部分指出的那样,GPL 通常不会“感染”在其下获得许可的程序的输出。参见 this section .特别是:

The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work.

我不是律师,但我认为这意味着异常(exception)情况,比如用自身编译编译器——输出仍然受 GPL 条款的约束。

关于c++ - 为自制操作码列表创建 C++ 编译器/链接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010902/

相关文章:

c++ - 碰撞后移除物体(子弹物理)

javascript - bool 文字和 bool 值有什么区别?

android - 运行时权限检查许可 Android M

java - 许可管理器工具开发?

c++ - 我如何在 Eigen 中创建复数矩阵

c++ - 如果你编写了一个 C++/OO 跨平台框架,发现它因为没有时间而在你的磁盘上放置了太多,你会怎么做?

c++ - 寻找 16 位 x86 编译器

licensing - 何时才能确切发布依赖LGPL库的GPL软件?

c++ - 带索引二维数组的逗号运算符

gcc - 几年前构建的gcc版本的编译器如何仍能针对最近发布的处理器进行编译?