Сборка ядра своей ОС при помощи cmake

Рейтинг: 0Ответов: 0Опубликовано: 01.08.2023

Хочу начать писать свою операционную систему и для этого настраиваю инструменты сборки. Для сборки взял cmake. Простейшая ОС состоит всего из двух файлов: загрузчика на ассемблере и ядра:

Загрузчик на NASM:

[bits 32]
global start
extern KernelMain

MODULE_ALIGN equ 1 << 0
MEM_INFO     equ 1 << 1
FLAGS        equ MODULE_ALIGN | MEM_INFO
MAGIC        equ 0x1BADB002
CHECKSUM     equ -(MAGIC + FLAGS)

section .multiboot
align 4
dd MAGIC
dd FLAGS
dd CHECKSUM

start:
        push ebx
        call KernelMain

Ядро на C++:

void printf(const char *source)
{
    static unsigned short *video = (unsigned short *)0xB8000;

    for (int i = 0; source[i] != '\0'; i++)
    {
        video[i] = (video[i] & 0xFF00) | source[i];
    }
}

extern "C" void KernelMain()
{
    printf("Hello World");
    while (true);
}

Скрипт сборки:

cmake_minimum_required(VERSION 3.5)

project(operating-systems)

enable_language(ASM_NASM)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_ASM_NASM_FLAGS "-f elf32")
set(CMAKE_CXX_FLAGS "-c -ffreestanding -fno-exceptions -fno-rtti")

add_executable(kernel boot.asm kernel.cpp)

target_link_options(kernel PRIVATE -T${CMAKE_SOURCE_DIR}/linker.ld)

Руками ядро собирается (вызываю вручную компилеры, а потом линкер). Однако симейк собрать ядро не может, я получаю ошибки:

:-1: warning: CMakeFiles/kernel.dir/boot.asm.o: linker input file unused because linking not done

:-1: warning: CMakeFiles/kernel.dir/kernel.cpp.o: linker input file unused because linking not done

Почему проект не собирается? Как его собрать?

И еще вопрос: как в современном симейке правильно задавать флаги компиляции и линковки для каждого таргета? Есть лучшие практики?

Файл linker.ld

ENTRY(start)
OUTPUT_FORMAT(elf64-x86-64)
OUTPUT_ARCH(i386:x86-64)

SECTIONS
{
    . = 0x0100000;
    
    .text :
    {
        *(.multiboot)
        *(.text*)
        *(.rodata)
    }
    
    .data :
    {
        start_ctors = .;
        KEEP(*(.init_array));
        KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )));
        end_ctors = .;
        
        *(.data)
    }
    
    .bss :
    {
        *(.bss)
    }
    
    /DISCARD/ :
    {
        *(.fini_array*)
        *(.comment)
    }
}

Руками я собираю так:

gcc -c -m32 kernel.cpp -ffreestanding -fno-exceptions -fno-rtti

nasm -f elf32 boot.asm -o boot.o

ld boot.o kernel.o -T linker.ld -o kernel

Ответы

Ответов пока нет.