/* test.c */
void func1()
{
}
int main()
{
func1();
}
Hello, I am making kernel code using C. But I tested above code to know how to build C
The only viable way if you're really into operating system development is by using some Unix-like OS like GNU/Linux or Mac OS X.
The following two are a must:
-ffreestanding -nostdlib -lgcc
Then things like -Wall
, -Wextra
, and -Werror
are recommended because bugs in kernel code are extremely hard to debug.
With respect to the entry point, you usually use a linker script that you pass to ld
via -T linker.ld
. For example, mine (don't copy paste it!) looks as follows. It's for a higher-half kernel with support for virtual memory:
ENTRY(__start__)
OUTPUT_FORMAT(elf32-i386)
SECTIONS {
. = 0xC0100000;
.text BLOCK(4K) : AT(ADDR(.text) - 0xC0000000) {
KEEP(*(.multiboot))
KEEP(*(.boot))
*(.text)
}
.rodata ALIGN(0x1000) : AT(ADDR(.rodata) - 0xC0000000) {
*(.rodata*)
}
.data ALIGN(0x1000) : AT(ADDR(.data) - 0xC0000000) {
*(.data)
}
.bss : AT(ADDR(.bss) - 0xC0000000) {
*(COMMON)
*(.bss)
*(.stack)
}
__kend__ = .;
}
You could use gcc
instead of ld
to perform the linking:
gcc -o test test.o -nostdlib -lgcc
The -lgcc
option provides the __main
function.