2011-12-04 350 views
4

这是我得到的错误: http://pastebin.com/VadUW6fyLinux内核编译错误:未定义的引用`__udivdi3' &'__umoddi3'

drivers/built-in.o: In function `gem_rxmac_reset': 
clkdev.c:(.text+0x212238): undefined reference to `__bad_udelay' 
drivers/built-in.o: In function `divide.part.4': 
clkdev.c:(.text.unlikely+0x7214): undefined reference to `__udivdi3' 
clkdev.c:(.text.unlikely+0x7244): undefined reference to `__umoddi3' 

我用Google搜索,发现这个补丁:https://lkml.org/lkml/2008/4/7/82

--- a/include/linux/time.h 
+++ b/include/linux/time.h 
@@ -174,6 +174,10 @@ static inline void timespec_add_ns(struct timespec *a, u64 ns) 
{ 
     ns += a->tv_nsec; 
     while(unlikely(ns >= NSEC_PER_SEC)) { 
+    /* The following asm() prevents the compiler from 
+    * optimising this loop into a modulo operation. */ 
+    asm("" : "+r"(ns)); 
+ 
       ns -= NSEC_PER_SEC; 
       a->tv_sec++; 
     } 

但未能应用(可能是由于该文件的新版本)。

 patching file linux/time.h 
    Hunk #1 FAILED at 174. 
    1 out of 1 hunk FAILED -- saving rejects to file linux/time.h.rej 

令人惊讶的是,文件time.h.rej不存在!

+0

[这将是可取的(http://meta.stackexchange.com/q/8259),包括这里问题的关键部分:这不仅对我们来说比在其他网站上阅读内容容易得多,而且Stack Overflow与其问题和答案一样有用 - 而且如果你的URL永远消失了,这个问题将来对其他人来说是无用的。 Thanks1 – sarnold

+0

[该补丁只是一行asm和评论](http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blobdiff;f=include /linux/time.h;h=d32ef0ad4c0aaf8964d94abe215c5dbf4dde8aaf;hp=2091a19f1655aab8e5130256f83af4103efa9e3f;hb=38332cb98772f5ea757e6486bed7ed0381cb5f98;hpb=e48af19f56eb47a1f908ee8f16df9d246f955b21) - 你尝试不仅仅是手打字那些由ASM到正确的位置的文件? – sarnold

+0

Sarnold,但问题是while循环不存在于新文件中。 (while(不太可能(ns> = NSEC_PER_SEC))) – inblueswithu

回答

1

我应该仔细阅读。该补丁程序适用于timespec_add_ns(),并且您有gem_rxmac_reset()divide.part.4函数失败。可能与您找到的补丁无关 - 相反,可能标准的64位div/mod函数在您的目标平台上没有实现。

您是否拥有Sun GEM或Apple GMAC网卡?如果没有,你可能只是禁用该驱动程序并摆脱第一个错误信息。

对于第二个,你可能需要实现在clkdev.c文件类似asm绝招 - 当我脱脂我的副本重复减法操作我没有发现一个 - 但也许你可以简单地窃取新clkdev.cclkdev.h来解决这个问题? (这是一个长镜头,这里只有一个进入git log drivers/clk/clkdev.c。)

+0

是的,您是正确的这不适用我正在为ARM编译(所以32位 - 不是64)我将研究这个内核配置,以删除那些GEM和NIC – inblueswithu

+1

至于为什么Sun GEM驱动程序无法编译,ARM udelay '函数最多需要2msec,驱动程序调用'udelay(5000)'。 – Hasturkun

+0

嘿,我已经移除了SunGEM和其他一些驱动程序回来,但没有把它清理干净。执行'$ make clean'并运行'$ make ARCH = $ {CLFS_ARCH} CROSS_COMPILE = $ {CLFS_TARGET}之后 - zImage'完美地编译了内核! :) 非常感谢 – inblueswithu