GCC链接器不链接标准库

时间:2015-01-03 16:13:05

标签: c gcc assembly osdev

我正在为我的学期项目开发一个基本内核。到目前为止,我没有在我的项目中使用任何标准库,但我需要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) $<

1 个答案:

答案 0 :(得分:1)

您不能将C库用于内核,因为它是为现有内核构建 并依赖于其目标操作系统的系统调用。相反,您必须为键盘编写驱动程序以及从任何地方获取字符所需的一切。从这个角度来看,getc()是一个非常高级的函数,你应该考虑在编程任何东西之前使内核的基本函数稳定。

顺便说一句,你应该真正建立一个cross compiler。与使用笨拙的选项提供系统编译器相比,它有许多优点。毕竟,内核应该在不同的机器上运行,因此它应该被编译为裸x86,这是交叉编译器所做的。

继续编码这个东西! leitimmel