Линкер не распознает внешнее утверждение - PullRequest
1 голос
/ 29 июня 2011

Я следую учебному пособию по разработке ядра на osdever , и я нахожусь на печати к экранной части учебника.Он компилируется просто отлично, без ошибок и предупреждений, но когда он идет по ссылке, я получаю:

screen.o: In function `scroll':
screen.c:(.text+0x12c): undefined reference to `memcpy'
screen.o: In function `put_str':
screen.c:(.text+0x249): undefined reference to `strlen'

У меня есть оператор включения для system.h вверху screen.c и в системе.h У меня есть

#ifndef __SYSTEM_H
#define __SYSTEM_H

extern unsigned char *memcpy(unsigned char *dest, const unsigned char *src, int count);
extern unsigned char *memset(unsigned char *dest, unsigned char val, int count);
extern unsigned short *memsetw(unsigned short *dest, unsigned short val, int count);
extern int strlen(const char *str);
extern unsigned char inportb (unsigned short _port);
extern void outportb (unsigned short _port, unsigned char _data);
extern void clear();
extern void put_char(unsigned char c);
extern void put_str(unsigned char *str);
extern void set_color(unsigned char fcol, unsigned char bcol);
extern void init_video();

#endif

Я ничего не могу найти в Интернете, и в этом уроке нет никакой помощи.Кажется, что когда я изменяю порядок в операторе компоновщика, с

/usr/local/cross/bin/i586-elf-ld -T link.ld -o kernel.bin start.o main.o screen.o

на

/usr/local/cross/bin/i586-elf-ld -T link.ld -o kernel.bin start.o screen.o main.o

я получаю

screen.o: In function `put_str':
screen.c:(.text+0x249): undefined reference to `strlen'
main.o: In function `main':
main.c:(.text+0x9b): undefined reference to `init_video'

Редактировать http://pastebin.com/ibBAVpe5 - Main.c

1 Ответ

4 голосов
/ 29 июня 2011

Вы не предоставили strlen, так откуда именно он должен появиться? При обычной компиляции в командной строке ld будет добавлено -lc к cc для добавления в стандартную библиотеку. С учетом указаний на то, что он предназначен для использования в автономном режиме, вам потребуется предоставить собственные подпрограммы поддержки, такие как strlen и memcpy; вы не можете использовать стандартную библиотеку C (или должны быть очень осторожны), потому что она попытается вызвать ядро ​​для некоторых вещей.

#

Это не объясняет ни другую проблему с переупорядочением объектов, ни обсуждение в комментариях ниже. Это заставляет меня думать, что у вас сломанный или, возможно, несовместимый скрипт компоновщика (-T link.ld). Вставить это?

...