【问题标题】:GCC have include but not libraryGCC 有包含但没有库
【发布时间】: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


【解决方案1】:

您正在使用-nostdlib 正确编译内核,因为内核不能使用标准库。为什么不?因为它没有意义:标准库是用户程序和内核之间的接口,所以应用程序开发人员不需要知道你的内核的系统调用规范,只需要一个 C 库的端口.

哦,这就是答案。您需要 C 库的 port 来使用您自己的系统调用。从 glibc 开始可能不是最容易移植的(它带有厨房水槽)。

【讨论】:

  • 你不能使用libcstdio inside你的自定义内核,即使你将glibc移植到你的自定义内核的系统调用API/ABI。你可以使用它来实现任何不进行系统调用的函数,例如sprintfstrtolmemcpy,以及任何其他具有良好优化实现的有用函数。
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多