【问题标题】:Linker not recognizing extern statement链接器无法识别外部语句
【发布时间】: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 看看是否可行。

标签: c gcc ld extern


【解决方案1】:

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

#

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

【讨论】:

  • 它们在哪个源文件中? extern 行不算;他们承诺你确实在某处有一个实际的定义。
  • 人力资源部。我认为这没有任何问题(假设它是 System V ELF 链接器引入并被 GNU 采用的格式)。现在我想知道符号表,或者可能是一些奇怪的问题,比如一些东西是本机编译的,而另一些是交叉编译的。但是这里调试起来有点困难......
猜你喜欢
  • 2019-08-15
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2017-09-05
相关资源
最近更新 更多