Если архитектура вашей собственной ОС такая же, как у вашей работающей ОС, то вам не нужен новый компилятор, подойдет тот, который у вас уже есть. Тем не менее, вам все еще может понадобиться пользовательский binutils
, но это зависит от формата исполняемых файлов, требуемых вашей собственной ОС.
Что я сделал для своей игрушечной ОС, так это заставил ее понимать двоичные файлы ELF: это абсурдно простой формат для загрузки и запуска. И таким образом вы можете использовать стандартный binutils
вашей ОС. Вам просто нужно связать свои исполняемые файлы с помощью специального скрипта компоновщика, а не с какой-либо библиотекой Linux.
Но обратите внимание, что многие люди считайте, что это не очень хорошая идея, но это может помочь вам продолжить работу на некоторое время.
Моя команда компилятора выглядит так:
%.o: %.c
gcc -c -o $@ -ffreestanding -fno-stack-protector -mpreferred-stack-boundary=2 -Os -g -Wall $<
И моя команда компоновщика:
%.myexe: %.o
ld -o $@ -T myexe.ld $^ `gcc -print-libgcc-file-name`
Для справки, скрипт компоновщика myexe.ld
:
ENTRY(main)
SECTIONS
{
.text :
{
*(.text)
}
.data :
{
*(.data)
}
.rodata :
{
*(.rodata)
}
.bss :
{
*(.bss)
}
}
person
rodrigo
schedule
16.07.2013