我正在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'
我在screen.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
答案 0 :(得分:4)
您还没有提供strlen
,所以它究竟应该来自哪里?在正常编译中,ld
命令行将-lc
添加cc
以引入标准库。鉴于有迹象表明这是独立的,您需要提供自己的支持例程,例如strlen
和memcpy
;你不能使用标准的C库(或者必须非常小心)因为它会尝试调用内核来处理某些事情。
这不能解释重新排序对象的其他问题,也不能解释下面评论中的讨论。这让我相信你有一个破碎的或可能不兼容的链接描述文件(-T link.ld
)。粘贴?