При компиляции кода, приведенного в выпуске 9, многие из вас (те, кто использовали Windows и MinGW) столкнулись с ошибкой компоновщика, которую я совершенно не ожидал. С невероятными усилиями :) нам с LaFlour удалось решить эту проблему. Он вам расскажет поподробнее о том, что же случилось и о способах исправления этой ошибки.
Выпуск 9.a (2003-05-31) от LaFlour
Изменения для пользователей win32 платформ.
Все действия Lonesome описывал для *nix систем. Но пользователи windows столкнутся с особеностями софта, который не позволит им создать исходный бинарник с применением кода на си как было описано в 9м выпуске. Здесь я постараюсь внести некоторые пояснения и опишу какие изменения нам надо будет предпринять с вами.
Все дело заключается в компоновщике, который не хочет понимать полученный от Nasm объектный код в формате ELF (Примечание: для тех кто не смог создать объектный файл с ключом -felf - вам надо взять Nasm для win32)
Но из этой ситуации есть выход. Давайте заменим наш startup.asm на аналогичный, но переделанный на си. Вот код startup.c:
void _start()
{
kernel_main();
}
Теперь давайте его откомпилируем: gcc -ffreestanding -c -o startup.o startup.c
Проблем быть не должно.
После этого если мы попробуем скомпоновать файлы: ld --oformat binary -Ttext 0x200000 -o kernel.bin startup.o ktty.o kernel.o
То получим ошибку: ":ld: PE operations on non PE file"
Вот такой наш LD. Ну не хочет он создавать сырые бинарники под Win32. Но из этой ситуации есть выход. Скомпонуем наши файлы в бинарник (не сырой), то есть в тот формат, который нам LD предлагает по умолчанию: ld -Ttext 0x200000 -o kernel.bin startup.o ktty.o kernel.o
Все! Победили :) Теперь осталось получить сырой бинарник. Для этого делаем: objcopy kernel.bin -O binary
Готово. Теперь по очереди соберем sb.bin и bootsect.bin. Итоговый bootsect.bin (содержащий все наши мучения) можем смело писать на флоп и тестить в VMWare. В итоге мы должны получить на экране надпись: "We use C, isn't this great?"
Если у вас она не появилась, то что-то вы сделали не так. Проверьте все шаги по очереди. На этом все.
Данный пример был проверен и отлажен на системe Windows XP, Nasm for Win32.
Выпуск 9.b
На этом проблемы для пользователей Windows не заканчиваются. Оказалось, что у них под рукой нет утилиты Make. Взять GNU Make для Windows можно здесь: http://www.atnetsend.net/files/make-3.77.zip
Но не спешите ее скачивать (сначала посмотрите, может она у вас уже есть :) - Make обычно поставляется вместе с другими средствами разработки, например она есть в комплекте LCC-WIN32.
Также существует версия Make от Microsoft - называется NMake.
Outro
Обязательно добейтесь, чтобы все работало, прежде чем мы продолжим! Если что-то не получается - пишите, будем разбираться.