【发布时间】:2011-06-28 22:46:06
【问题描述】:
我正在关注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 的包含语句,而在 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
【问题讨论】:
-
如果您有
nm,请在.o文件上试用。 -
@lhf 我做了,不知道是什么意思,但这里是:pastebin.com/mMEVf2bv
-
从您提供的
nm输出中,不应有任何未定义的引用。顺便说一句,T标记定义和U标记使用。输出中的每个U都与T匹配。所以我的猜测是您应该尝试将main.o放在对象列表的首位,尽管这不是必需的。 -
@lhf @geekosaur 感谢您的帮助。我想我会尝试用不同的目标重新编译 gcc 看看是否可行。