3

这个问题是关于 Mac OS Classic的,它已经过时了好几年了。我希望有人仍然对此有所了解!

在过去的几周里,我一直在构建一个PEF 可执行解析器,并且我已经插入了一个 PowerPC 解释器。借助大量的魔法,我希望能够(在某种程度上)在 Mac OS X 下运行一些 Mac OS 9 程序。事实上,我现在已经准备好开始使用小型应用程序进行测试了。

为了帮助我解决这个问题,我在 SheepShaver 中安装了旧版本的 Mac OS 并下载了(现在免费的) MPW Tools 1,我构建了一个“hello world” MPW 工具(只是你的经典puts("Hello World!")C 程序,除了为 Mac OS 编译9)。

构建后,它会生成一个带有代码段和数据段的程序。我希望我能够直接跳转到可执行文件的主符号(在加载程序部分的标题中指定),但我大吃一惊:编译器将主符号放在数据部分中。

显然,数据部分中没有可执行代码。

回到Mac OS Runtime Architectures文档(1997 年发布,令人惊讶的是仍然在 Apple 的网站上),我发现这是完全合法的:

使用主符号作为数据结构

如前所述,主符号不必指向例程,而是可以指向数据块。您可以将此事实用于插件,其中主要符号引用的数据块可以包含有关插件的基本信息。以这种方式使用主符号有几个优点:

  • 当您以编程方式准备片段时,代码片段管理器会返回主符号的地址,因此您无需调用 FindSymbol。
  • 您不必为插件保留和记录导出的特定名称。

但是,没有特定的符号名称意味着插件的用途并不那么明显。插件可以将其名称、图标或有关其符号的信息存储在主符号数据结构中。以这种方式存储符号信息消除了对多个 FindSymbol 调用的需要。

因此,我的结论是 MPW 工具在 MPW shell 内作为插件运行,并且可执行文件的主要符号指向一些应该告诉它如何启动的数据结构。

但这仍然不能帮助我弄清楚该数据结构中的内容,并且仅查看其十六进制转储并不是很有启发性(我知道编译器将这个特定程序__start的地址放在哪里,但这绝对不足以做一个通用的 MPW 外壳“替换”)。显然,关于这个主题的最有价值的信息来源似乎在 2004 年随着 Mac OS 9 消失了。

那么,一个 MPW 工具的主符号所指向的数据结构的格式是什么?

1. 显然,Apple 最近取消了我从中获取 MPW 工具的 FTP 服务器的插件,因此它可能不再可用;虽然谷歌搜索“MPW_GM.img.bin”确实找到了一些替代品)。

4

1 回答 1

1

事实证明,它并不太复杂。该“数据结构”只是一个转换向量。

我没有立即意识到这一点,因为我的重定位虚拟机实现中的错误使这两个指针看起来像垃圾。

转换向量是包含(按此顺序)入口点(4 个字节)和“目录”偏移量(4 个字节)的结构。r2在执行入口点指向的代码之前,应将此偏移量加载到寄存器中。

(Mac OS Classic 运行时仅使用转换向量的前 8 个字节,但从技术上讲,它们可以是任何大小。转换向量的地址总是被传入,r12因此被调用者可以访问它需要的任何附加信息。)

于 2012-11-07T19:45:21.887 回答