我正在为我的学期项目开发一个基本内核。到目前为止,我没有在我的项目中使用任何标准库,但我需要gets()
,我包括<stdio.h>
。 GCC找到标题位置但链接器给出错误:
ld -melf_i386 -Tlink.ld -o kernel boot.o main.o monitor.o common.o descriptor_tables.o isr.o interrupt.o gdt.o timer.o
main.o: In function `main':
main.c:(.text+0x53): undefined reference to `gets'
这是我的Makefile文件,
SOURCES=boot.o main.o monitor.o common.o descriptor_tables.o isr.o interrupt.o gdt.o timer.o
CFLAGS= -m32 -fno-stack-protector -fstack-check
LDFLAGS= -melf_i386 -Tlink.ld
ASFLAGS=-felf
all: $(SOURCES) link
clean:
-rm *.o kernel
link:
ld $(LDFLAGS) -o kernel $(SOURCES)
.s.o:
nasm $(ASFLAGS) $<
答案 0 :(得分:1)
您不能将C库用于内核,因为它是为现有内核构建 并依赖于其目标操作系统的系统调用。相反,您必须为键盘编写驱动程序以及从任何地方获取字符所需的一切。从这个角度来看,getc()
是一个非常高级的函数,你应该考虑在编程任何东西之前使内核的基本函数稳定。
顺便说一句,你应该真正建立一个cross compiler。与使用笨拙的选项提供系统编译器相比,它有许多优点。毕竟,内核应该在不同的机器上运行,因此它应该被编译为裸x86,这是交叉编译器所做的。
继续编码这个东西! leitimmel