Какова структура основного символа инструмента MPW?

Этот вопрос касается Mac OS Classic, который уже несколько лет устарел. Я надеюсь, что кто-то еще что-то знает об этом!

В течение последних нескольких недель я создавал анализатор исполняемых файлов PEF и подключил к нему интерпретатор PowerPC. С большой долей волшебства я ожидаю, что смогу запустить (до некоторой степени) некоторые программы Mac OS 9 под Mac OS X. Фактически, теперь я готов начать тестирование с небольшими приложениями.

Чтобы помочь мне с этим, я установил старую версию Mac OS внутри SheepShaver и загрузил (теперь бесплатно) MPW Tools 1, и я создал MPW-инструмент "hello world" (просто ваш классический puts("Hello World!") C программой, кроме скомпилированной для Mac OS 9).

При сборке генерируется программа с разделом кода и разделом данных. Я ожидал, что смогу просто перейти к главному символу исполняемого файла (как указано в заголовке раздела загрузчика), но меня удивил большой сюрприз: компилятор поместил главный символ в раздел данных.

Очевидно, в разделе данных нет исполняемого кода.

Возвращаясь к документу " Архитектура среды выполнения Mac OS" (опубликованному в 1997 году, который на удивление все еще находится на веб-сайте Apple), я обнаружил, что это абсолютно законно:

Использование основного символа в качестве структуры данных

Как упоминалось ранее, главный символ не обязательно должен указывать на подпрограмму, но вместо этого может указывать на блок данных. Вы можете использовать этот факт для хорошего эффекта с плагинами, где блок данных, на который ссылается главный символ, может содержать важную информацию о плагине. Использование главного символа таким способом имеет несколько преимуществ:

  • Диспетчер фрагментов кода возвращает адрес основного символа при программной подготовке фрагмента, поэтому вам не нужно вызывать FindSymbol.
  • Вам не нужно резервировать и документировать конкретное имя экспорта для вашего плагина.

Однако отсутствие определенного имени символа означает, что цель плагина не столь очевидна. Плагин может хранить свое имя, значок или информацию о своих символах в структуре данных основного символа. Хранение символической информации таким способом устраняет необходимость в нескольких вызовах FindSymbol.

Поэтому я пришел к выводу, что инструменты MPW работают как плагины внутри оболочки MPW, и что главный символ исполняемого файла указывает на некоторую структуру данных, которая должна указывать ему, как запускаться.

Но это все еще не помогает мне понять, что находится в этой структуре данных, и просто посмотреть на ее шестнадцатеричный дамп не очень поучительно (у меня есть идея, где компилятор поместил __start адрес для этой конкретной программы, но этого явно недостаточно, чтобы сделать "замену" универсальной оболочки MPW). И очевидно, что наиболее ценные источники информации на эту тему исчезли с Mac OS 9 в 2004 году.

Итак, в каком формате структура данных указывается основным символом инструмента MPW?

1. Очевидно, что Apple совсем недавно отключила FTP-сервер, с которого я получил MPW Tools, поэтому он, вероятно, больше не доступен; хотя поиск в Google для "MPW_GM.img.bin" действительно находит некоторые альтернативы).

1 ответ

Решение

Оказывается, это не так уж сложно. Эта "структура данных" является просто вектором перехода.

Я не сразу понял это из-за ошибок в моей реализации виртуальной машины перемещения, из-за которых эти два указателя выглядели как мусор.

Векторы перехода - это структуры, которые содержат (в этом порядке) точку входа (4 байта) и смещение "оглавление" (4 байта). Это смещение должно быть загружено в регистр r2 перед выполнением кода, на который указывает точка входа.

(Среда выполнения Mac OS Classic использует только первые 8 байтов вектора перехода, но технически они могут иметь любой размер. Адрес вектора перехода всегда передается в r12 таким образом, вызываемый абонент может получить доступ к любой дополнительной информации, которая ему потребуется.)

Другие вопросы по тегам