Какова структура основного символа инструмента 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
таким образом, вызываемый абонент может получить доступ к любой дополнительной информации, которая ему потребуется.)