3

この質問は、数年前から廃止されているMac OS Classicに関するものです。誰かがまだそれについて何か知っていることを願っています!

ここ数週間、PEF実行可能パーサーを作成しており、PowerPC インタープリターをプラグインしました。ある程度の魔法があれば、Mac OS X でいくつかの Mac OS 9 プログラムを (ある程度) 実行できると思います。実際、小さなアプリケーションでテストを開始する準備ができました。

それを支援するために、古いバージョンの Mac OS を SheepShaver 内にインストールし、(現在は無料の) MPW Tools 1をダウンロードし、「hello world」MPW ツールを構築しました ( puts("Hello World!")Mac OS 用にコンパイルされたものを除く、従来の C プログラムのみ)。 9)。

ビルドすると、コード セクションとデータ セクションを含むプログラムが生成されます。実行可能ファイルのメイン シンボル (ローダー セクションのヘッダーで指定) にジャンプできると思っていましたが、大きな驚きを覚えました。コンパイラはメイン シンボルをデータ セクション内に配置しました。

明らかに、データ セクションには実行可能なコードはありません。

Mac OS ランタイム アーキテクチャのドキュメント (1997 年に発行され、驚くべきことに今も Apple の Web サイトに掲載されています) に戻ると、これは完全に合法であることがわかりました。

メイン シンボルをデータ構造として使用する

前述のように、メイン シンボルはルーチンを指す必要はありませんが、代わりにデータ ブロックを指すことができます。この事実をプラグインに利用すると、メイン シンボルによって参照されるデータ ブロックにプラグインに関する重要な情報を含めることができます。この方法でメイン シンボルを使用すると、いくつかの利点があります。

  • コード フラグメント マネージャーは、プログラムでフラグメントを準備するときにメイン シンボルのアドレスを返すため、FindSymbol を呼び出す必要はありません。
  • プラグインのエクスポートの特定の名前を予約して文書化する必要はありません。

ただし、特定のシンボル名がないということは、プラグインの目的がそれほど明白ではないことを意味します。プラグインは、その名前、アイコン、またはそのシンボルに関する情報をメイン シンボル データ構造に保存できます。この方法でシンボリック情報を格納すると、FindSymbol を複数回呼び出す必要がなくなります。

したがって、私の結論は、MPW ツールは MPW シェル内のプラグインとして実行され、実行可能ファイルのメイン シンボルは、開始方法を指示するデータ構造を指しているということです。

しかし、それはまだそのデータ構造に何があるかを理解するのに役立たず、その16進ダンプを見るだけではあまり有益ではありませんでした(コンパイラがこの特定のプログラム__startのアドレスをどこに置いたかはわかりますが、それだけでは十分ではありませんジェネリック MPW シェル「置換」を作成します)。そして明らかに、このトピックに関する最も貴重な情報源は、2004 年の Mac OS 9 で姿を消したようです。

では、MPW ツールのメイン シンボルが指すデータ構造の形式は何ですか?

1. どうやら、Apple はごく最近、私が MPW Tools を入手した FTP サーバーのプラグを抜いたようです。「MPW_GM.img.bin」をグーグルで検索すると、いくつかの代替手段が見つかります)。

4

1 に答える 1

1

結局のところ、それほど複雑ではありません。その「データ構造」は単なる遷移ベクトルです。

再配置仮想マシンの実装にバグがあり、これら 2 つのポインターがゴミのように見えたため、すぐには気づきませんでした。

遷移ベクトルは、エントリ ポイント (4 バイト) と「目次」オフセット (4 バイト) を (この順序で) 含む構造体です。このオフセットはr2、エントリ ポイントが指すコードを実行する前にレジスタにロードする必要があります。

(Mac OS Classic ランタイムは遷移ベクトルの最初の 8 バイトのみを使用しますが、技術的には任意のサイズにすることができます。遷移ベクトルのアドレスは常に渡されるr12ため、呼び出し先は必要な追加情報にアクセスできます。)

于 2012-11-07T19:45:21.887 に答える