GCC имеет включение, но не библиотеку

Я пишу свое собственное ядро ​​для развлечения, и при этом мне нужно было установить glibc, чтобы использовать стандартные библиотеки C. Однако после установки библиотеки в нужный каталог моя программа kernel.c включает заголовок stdio.h и пытается использовать fopen, однако я сталкиваюсь с этой ошибкой:

kernel.c:(.text+0x238): undefined reference tofopen'`

Оглядевшись, я заметил, что у меня нет реального кода для всех файлов заголовков, только сами файлы заголовков. Итак, я пошел и добавил флаг -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

При необходимости может быть предоставлена ​​дополнительная информация. Пожалуйста спросите.


person noah.davis    schedule 28.11.2015    source источник
comment
Вы удалили stdlib с опцией -nostdlib, если вы это сделаете, вы должны предоставить реализацию функций, которые вы использовали. Удалите эту опцию или добавьте -lc. В заголовочных файлах нет кода, так как это привело бы к множественным определениям функций.   -  person Iharob Al Asimi    schedule 28.11.2015


Ответы (1)


Вы правильно компилируете ядро, используя -nostdlib, потому что ядро ​​не может использовать стандартную библиотеку. Почему бы и нет? Потому что это не имеет смысла: стандартная библиотека — это интерфейс между пользовательскими программами и ядром, так что разработчикам приложений не нужно знать спецификацию системных вызовов для вашего ядра, все, что требуется, — это порт библиотеки C .

О, вот ответ. Вам нужен порт библиотеки C, чтобы использовать ваши собственные системные вызовы. Начать с glibc может быть не так просто для переноса (он поставляется с кухонной раковиной).

person dave    schedule 28.11.2015
comment
Вы не можете использовать libc stdio внутри вашего пользовательского ядра, даже если вы перенесли glibc в API/ABI системного вызова вашего пользовательского ядра. Вы можете использовать его для реализации любой функции, которая не выполняет системных вызовов, например, sprintf, strtol, memcpy и любых других полезных функций с хорошими оптимизированными реализациями. - person Peter Cordes; 28.11.2015