c-链接器无法识别外部语句



我正在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'

我确实在屏幕.c的顶部有一个对system.h的include语句,在system.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

您还没有提供strlen,那么它到底应该从哪里来呢?在正常编译中,ld命令行将由cc添加一个-lc,以引入标准库。鉴于有迹象表明这是独立的,您需要提供自己的支持例程,如strlenmemcpy;你不能使用标准的C库(或者必须非常小心),因为这会试图调用内核来处理一些事情。

#

这并不能解释重新排序对象的其他问题,也不能解释下面评论中的讨论。这让我相信您有一个损坏的或可能不兼容的链接器脚本(-T link.ld)。粘贴?

最新更新