Автор: lonesome [TSH/Digital Daemons]
Дата: 7.06.2003
Раздел: Разработка ОС
Все исходники, опубликованные в каких-либо выпусках этой рассылки, теперь можно взять по адресу:
http://www.lowlevel.ru/osdev/sources.htm
При компиляции кода, приведенного в выпуске 9, многие из вас (те, кто использовали Windows и MinGW) столкнулись с ошибкой компоновщика, которую я совершенно не ожидал. С невероятными усилиями :) нам с 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.
На этом проблемы для пользователей Windows не заканчиваются. Оказалось, что у них под рукой нет утилиты Make. Взять GNU Make для Windows можно здесь:
http://www.atnetsend.net/files/make-3.77.zip
Но не спешите ее скачивать (сначала посмотрите, может она у вас уже есть :) - Make обычно поставляется вместе с другими средствами разработки, например она есть в комплекте LCC-WIN32.
Также существует версия Make от Microsoft - называется NMake.