Re: [2.6.30-rc8] gcc 3.3 : __udivdi3 undefined.

From: Andrew Morton
Date: Thu Jun 04 2009 - 23:17:49 EST


On Fri, 5 Jun 2009 10:38:35 +0800 Amerigo Wang <xiyou.wangcong@xxxxxxxxx> wrote:

> On Fri, Jun 05, 2009 at 09:38:04AM +0900, Tetsuo Handa wrote:
> >[2.6.30-rc8] gcc 3.3 : __udivdi3 undefined.
> >
> >"make allmodconfig" + "CONFIG_KVM=n" on 2.6.30-rc8 triggers build failure
> >when built with gcc 3.3.5 .
> >
> ># make -s
> >/usr/src/all/vanilla/src/linux-2.6.30-rc8/arch/x86/Makefile:82: stack protector enabled but no compiler support
> >WARNING: modpost: Found 2 section mismatch(es).
> >To see full details build your kernel with:
> >'make CONFIG_DEBUG_SECTION_MISMATCH=y'
> >arch/x86/mm/built-in.o(.init.text+0x43f7): In function `__change_page_attr':
> >arch/x86/mm/pageattr.c:114: undefined reference to `__udivdi3'
> >make: *** [.tmp_vmlinux1] Error 1
> >
>
> Probably you are compiling on i386?
>
> Weird...
>
> All the types in __change_page_attr() are either 'long' or 'int', how
> can gcc generate software divide for these integer operations?

It could be in some function which was manually or automatically
inlined into __change_page_attr(). Or it could be that ld simply
screwed up in identifying the function - it tends to do that.

Do

make arch/x86/mm/pageattr.s

then have a look in pageattr.s to find the __udivdi3 callsite.

It might not even be in arch/x86/mm/pageattr.o at all. If not, keep
building .s files in that directory until you find it.

Building with CONFIG_DEBUG_INFO=1 will allow you to find the exact C
file-n-line where the __udivdi3() call is being emmitted (look at the
.loc lines).

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/