Формат файла для исполняемого файла в Mac OS X
Я пытаюсь (по одному шагу за раз) создать свою собственную копию Forth для работы на Mac OS X.
В настоящее время у меня есть версия Forth, работающая на Apache и localhost на PHP, Ruby и Python.
Я хочу сделать версию Forth в C, которая создаст собственную исполняемую версию Forth, которая может создавать собственные собственные исполняемые файлы из любого скомпилированного кода Forth. Извините за полурекурсивное предложение. Моя цель - начать с C и закончить с моим собственным компилятором Forth (больше не работает ни в одном C-коде).
Моя отправная точка - попытаться запустить минимальную тестовую программу в качестве двоичного исполняемого файла для терминала. Как только я смог понять, что делает существующий компилятор C, я могу изменить его методы для своих собственных целей.
Я создал небольшую программу "hello world" на C и получил исполняемый файл размером 8 497 байт, который состоял в основном из массивов 0x00 (предположительно, буферов). Я предполагаю, что вся библиотека stdio была включена.
Затем я создал наименьшую возможную C-программу, о которой только мог подумать (кроме совершенно нулевой программы - я хотел, чтобы я мог найти свой код в результирующем гексе):
int main(void)
{
char testitem;
testitem = 'A';
return -1;
}
Это должно было бы дать мне как можно меньшие накладные расходы с хранением ASCII A и возвращаемым значением всех, которые легко найти.
Вместо этого я получил файл размером 4313 байт. Было четыре местоположения с 0x41 (ASCII 'A'), но ни одно из них не было частью инструкции непосредственного байта MOV. Предположительно, 0x41 был сохранен как постоянные данные и загружен с другой инструкцией MOV.
Снова было много массивов 0x00 (3731 байт, или все, кроме 402 байт). Предположительно, есть какие-то данные заголовка в объектном файле (который работает правильно в Терминале и дает сигнал -1), и кто знает, что еще.
На данный момент меня не интересует наличие пакета приложений - моя краткосрочная цель - запуск. Как только у меня будет работать этот первый шаг, я могу перейти к полной заявке.
Любые предложения о том, как определить, что мне нужно иметь в объектном файле, чтобы он правильно работал как инструмент терминала?
1 ответ
Это оказывается общей проблемой. Вы можете проверить следующие ссылки, которые предоставляют довольно подробную информацию: