undefined reference to `__umoddi3'解决办法

主机配置:ubuntu 11.10下利用交叉编译工具arm-linux-gcc编译内核;

目标板:AT91SAM9260

内核版本:linux-2.6.24


在编译内核linux-2.6.24的过程中遇到错误:

kernel/built-in.o: In function `getnstimeofday':
utsname_sysctl.c:(.text+0x23c64): undefined reference to `__umoddi3'
kernel/built-in.o: In function `do_gettimeofday':
utsname_sysctl.c:(.text+0x23d18): undefined reference to `__udivdi3'
utsname_sysctl.c:(.text+0x23d34): undefined reference to `__umoddi3'
kernel/built-in.o: In function `timekeeping_resume':
utsname_sysctl.c:(.text+0x23ec0): undefined reference to `__udivdi3'
utsname_sysctl.c:(.text+0x23ee0): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
utsname_sysctl.c:(.text+0x24640): undefined reference to `__udivdi3'
utsname_sysctl.c:(.text+0x24660): undefined reference to `__umoddi3'
utsname_sysctl.c:(.text+0x246f4): undefined reference to `__udivdi3'
utsname_sysctl.c:(.text+0x24714): undefined reference to `__umoddi3'
make: *** [.tmp_vmlinux1] Error 1

网上查阅了,说是include/linux/time.h文件中函数timespec_add_ns()的loop循环在编译过程中被优化掉了。

static inline void timespec_add_ns(struct timespec *a, u64 ns)
{
	ns += a->tv_nsec;
	while(unlikely(ns >= NSEC_PER_SEC)) {
		ns -= NSEC_PER_SEC;
		a->tv_sec++;
	}
	a->tv_nsec = ns;
}
利用 https://lkml.org/lkml/2008/2/22/464的patch,可以解决这个问题。打上patch之后的函数是:

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++;
	}
	a->tv_nsec = ns;
}
更改之后编译顺利通过。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值