Фантазии о Вселенной и мой личный сайт
Техники компилирования GCC

Техники компилирования GCC

В этой секции я расскажу как скомпилировать ядро для 32-х битного защищенного режима на C.

Подготовка точки входа

nasm -felf32 -o startup.o startup.asm
  • -felf32 использовать 32-х разрядную систему
  • -o startup.o выходной файл

Минимальный файл для startup.asm

[BITS 32]
[EXTERN main]
[GLOBAL _start]
_start: mov     esp, 0x8000        ; Вершина стека
        jmp     main

Компиляция ядра

gcc -Os -ffreestanding -nostdlib -m32 -msse -msse2 -c kernel.c -o kernel.o
  • -ffreestanding означает, что стандартная библиотека не подключается, и main() может не быть
  • -m32 компиляция принудительно в 32-х битном режиме
  • -c kernel.c файл для компиляции
  • -o kernel.o исходящий объектный файл
  • -msse/-msse2 использовать возможности SSE при компиляции

Сборка

ld -m elf_i386 -nostdlib -nodefaultlibs --oformat binary -Ttext=0x400000 -Tdata=0x800000 startup.o kernel.o -o kernel.bin
  • -m elf_i386 использовать 386-й/32
  • -nostdlib не использовать стандартную библиотеку
  • -nodefaultlibs не использовать любые библиотеки
  • --oformat binary выходной формат (бинарный)
  • -Ttext=0x400000 начало кода
  • -Tdata=0x800000 начало данных
  • startup.o файл, откомпилированный через NASM (точка входа)
  • kernel.o файл, откомпилированный через GCC
  • -o kernel.bin конечный бинарный файл