GCC包括但不包括库

时间:2015-11-28 02:07:16

标签: c gcc operating-system glibc libc

我正在编写自己的内核以获得乐趣,并且这样做我需要安装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() } }

如果需要,可以提供更多信息。请问。

1 个答案:

答案 0 :(得分:3)

您正在使用-nostdlib正确编译内核,因为内核无法使用标准库。为什么不?因为它没有意义:标准库是用户程序和内核之间的接口,因此应用程序开发人员不需要知道内核的系统调用规范,所需要的只是一个端口C库。

哦,有答案。您需要C库的端口来使用您自己的系统调用。从glibc开始可能不是最容易移植的(它带有厨房水槽)。