我正在编写自己的内核以获得乐趣,并且这样做我需要安装glibc
才能使用标准C库。但是,在将库安装到所需目录后,我的kernel.c程序包含stdio.h
标头并尝试使用fopen
,但是我遇到了这个错误:
kernel.c:(.text+0x238): undefined reference to
fopen'`
环顾四周后,我注意到我没有任何实际代码到所有头文件,只有头文件本身。所以我去了GCC添加了-L
标志,以添加在编译lib
期间创建的glibc
文件夹,我发现lib
build
文件夹没有我需要的东西。
我开玩笑地发现我在编译glibc
时使用的.o
目录包含我正在查找的iofopen.o
个文件(例如fopen
#!/bin/bash
nasm -felf32 boot.asm -o boot.o
/home/noah/opt/cross/bin/i686-elf-gcc -I/home/noah/Documents/NoahOS/include/ -L/home/noah/Documents/glibc/build -c *.c -std=gnu99 -ffreestanding -Wall -Wextra
/home/noah/opt/cross/bin/i686-elf-gcc -I/home/noah/Documents/NoahOS/include/ -L/home/noah/Documents/glibc/build -T linker.ld -o noahos.bin -ffreestanding -O2 -nostdlib *.o -lgcc
{1}}方法)。
那是怎么回事?
如果需要,我用来编译内核的命令是:
boot
第一行构建gcc
文件,即汇编。
第二行在所有C语言.c
文件上运行linker.ld
并创建其目标文件。
第三行将所有文件与noahos.bin
链接在一起,并使用
qemu-system-i386 -kernel noahos.bin
,这是一个可运行的内核
class Base {}
class A: Base {}
class B: Base {}
class C: Base {}
func next(obj: Base) -> Base {
if obj is A { return B() }
else if obj is B { return C() }
else if obj is C { return A() }
else { return A() }
}
如果需要,可以提供更多信息。请问。
答案 0 :(得分:3)
您正在使用-nostdlib
正确编译内核,因为内核无法使用标准库。为什么不?因为它没有意义:标准库是用户程序和内核之间的接口,因此应用程序开发人员不需要知道内核的系统调用规范,所需要的只是一个端口C库。
哦,有答案。您需要C库的端口来使用您自己的系统调用。从glibc开始可能不是最容易移植的(它带有厨房水槽)。