Я пишу свое собственное ядро для развлечения, и при этом мне нужно было установить glibc
, чтобы использовать стандартные библиотеки C. Однако после установки библиотеки в нужный каталог моя программа kernel.c включает заголовок stdio.h
и пытается использовать fopen
, однако я сталкиваюсь с этой ошибкой:
kernel.c:(.text+0x238): undefined reference to
fopen'`
Оглядевшись, я заметил, что у меня нет реального кода для всех файлов заголовков, только сами файлы заголовков. Итак, я пошел и добавил флаг -L
в GCC, чтобы добавить папку lib
, которая была создана во время компиляции glibc
, и я обнаружил, что в папке lib
нет ничего из того, что мне нужно.
Я порылся и обнаружил, что каталог build
, который я использовал при компиляции glibc
, содержит файлы .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
, который представляет собой сборку. Вторая строка запускает gcc
все файлы языка C .c
и создает их объектные файлы. Третья строка связывает все файлы вместе с linker.ld
и выводит окончательное ядро в noahos.bin
, которое является исполняемым ядром с использованием
qemu-system-i386 -kernel noahos.bin
При необходимости может быть предоставлена дополнительная информация. Пожалуйста спросите.
stdlib
с опцией-nostdlib
, если вы это сделаете, вы должны предоставить реализацию функций, которые вы использовали. Удалите эту опцию или добавьте-lc
. В заголовочных файлах нет кода, так как это привело бы к множественным определениям функций. - person Iharob Al Asimi   schedule 28.11.2015