我正在尝试(一步一步)构建我自己的Forth副本,以便在Mac OS x上运行。
我目前有一个版本的Forth运行在Apache和localhost上,使用PHP、Ruby和Python。
我想用C语言制作一个Forth版本,它将创建一个本机可执行版本的Forth,可以为任何编译后的Forth代码制作自己的本机可执行文件。抱歉,半递归的句子。我的目标是从C开始,以我自己的Forth编译器结束(不再在任何C代码中运行)。
我的出发点是尝试获得一个最小的测试程序,作为终端的二进制可执行文件运行。一旦我能理解现有的C编译器在做什么,我就可以根据自己的目的修改它的方法。
我用C语言创建了一个小的"hello world"程序,最后得到了一个8,497字节的可执行文件,它主要由0x00数组(可能是缓冲区)组成。我猜整个studio库都包含在内。
接下来,我创建了我能想到的最小的C程序(除了一个完全空的程序——我希望能够在结果十六进制中找到我的代码):
int main(void)
{
char testitem;
testitem = 'A';
return -1;
}
这应该给了我尽可能少的开销与存储ASCII A和所有的返回值很容易找到。
相反,我最终得到了一个4313字节的文件。有四个位置有0x41 (ASCII 'A'),但没有一个是MOV直接字节指令的一部分。据推测,0x41是作为常量数据存储的,并加载了不同的MOV指令。同样有很多0x00数组(3731字节,即除了402字节之外的所有字节)。假设在目标文件中有某种头数据(它在Terminal中正确运行并发出-1信号),谁知道还有什么。
目前我并不关心是否有一个应用程序包——在终端中运行是我的短期目标。一旦我完成了第一步,我就可以继续制作完整的应用程序了。
关于如何确定我需要在对象文件中为其正确工作作为终端工具的任何建议?
这是一个常见的挑战。您可能需要查看以下提供相当深入信息的链接:
- 让我们构建一个Mach-O可执行文件
- 你好Mach-O