【发布时间】:2015-11-28 02:07:15
【问题描述】:
我编写自己的内核是为了好玩,为此我需要安装 glibc 以使用标准 C 库。但是,在将库安装到所需目录后,我的 kernel.c 程序包含stdio.h 标头并尝试使用fopen,但是我遇到了这个错误:
kernel.c:(.text+0x238): undefined reference tofopen'`
环顾四周后,我注意到我没有所有头文件的任何实际代码,只有头文件本身。因此,我将-L 标志添加到GCC 以添加在glibc 编译期间创建的lib 文件夹,我发现lib 文件夹没有我需要的东西。
我四处寻找,发现我在编译glibc 时使用的build 目录有我正在寻找的.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
第一行构建boot 文件,它是程序集。
第二行在所有 C 语言 .c 文件上运行 gcc 并创建它们的目标文件。
第三行将所有文件与linker.ld 链接在一起,并将最终内核输出到noahos.bin,这是一个可运行的内核,使用
qemu-system-i386 -kernel noahos.bin
如果需要,可以提供更多信息。请问一下。
【问题讨论】:
-
您使用
-nostdlib选项删除了stdlib,如果您这样做,您必须提供您使用过的功能的实现。删除该选项,或添加-lc。头文件中没有代码,因为这会导致函数的多个定义。
标签: c gcc operating-system glibc libc