GCC linker 没有 link 标准库
GCC linker does not link standard library
我正在为我的学期项目开发一个基本内核。到目前为止,我还没有在我的项目中使用任何标准库,但我需要 gets()
,我包含了 <stdio.h>
。 GCC 找到 header 位置,但链接器给出错误:
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) $<
您不能将 C 库用于内核,因为它是为现有内核构建的,并且依赖于其目标 OS 的系统调用。相反,您必须为键盘和从任何地方获取字符所需的一切编写驱动程序。 getc()
从这个角度来看是一个非常先进的功能,在编写任何与之交互的程序之前,您应该考虑使内核的基本功能稳定。
顺便说一句,你真的应该建立一个cross compiler。与向系统编译器提供笨拙的选项相比,它有很多优点。毕竟,内核是为了 运行 在不同的机器上,所以它应该针对裸 x86 进行编译,这就是交叉编译器所做的。
继续编码这个东西!
时间轴
我正在为我的学期项目开发一个基本内核。到目前为止,我还没有在我的项目中使用任何标准库,但我需要 gets()
,我包含了 <stdio.h>
。 GCC 找到 header 位置,但链接器给出错误:
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) $<
您不能将 C 库用于内核,因为它是为现有内核构建的,并且依赖于其目标 OS 的系统调用。相反,您必须为键盘和从任何地方获取字符所需的一切编写驱动程序。 getc()
从这个角度来看是一个非常先进的功能,在编写任何与之交互的程序之前,您应该考虑使内核的基本功能稳定。
顺便说一句,你真的应该建立一个cross compiler。与向系统编译器提供笨拙的选项相比,它有很多优点。毕竟,内核是为了 运行 在不同的机器上,所以它应该针对裸 x86 进行编译,这就是交叉编译器所做的。
继续编码这个东西! 时间轴