【问题标题】:GCC linker does not link standard libraryGCC 链接器不链接标准库
【发布时间】:2015-01-03 16:13:05
【问题描述】:

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

【问题讨论】:

  • 如果你用gcc而不是ld链接?
  • 您是否尝试将 -lc 添加到 LDFLAGS 中?
  • @MOehm AFAIK,因为我还有要编译和链接的程序集文件,所以我必须使用 ld 进行链接
  • @DarioOO 是的,它看起来像。我试图跳过映射所有关键中断,但显然我必须这样做。顺便谢谢大家。

标签: c gcc assembly osdev


【解决方案1】:

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

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

继续编码这个东西! 莱蒂梅尔

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2020-05-14
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多