Subject: Re: [vserver] Undefined references to `__umoddi3' and `__udivdi3'
From: Herbert Poetzl <herbert@13thfloor.at>
Date: Sun, 1 Nov 2009 13:31:42 +0100

On Sun, Nov 01, 2009 at 04:18:46AM +0000, Daniël W. Crompton wrote:
> Sorry Herbert you are absolutely right.

> From Gentoo Portage, 2.6.22-vs2.2.0.7-gentoo, using gcc 
> (Gentoo 4.3.2-r3 p1.6, pie-10.1.5) 4.3.2

that kernel is 1.5 years old, and your gcc is pretty
new, so it optimizes out the loop and uses a div/mod,
which is not available to the kernel (lack of libgcc)

I think the patch you mentioned should be fine, but
I see no point in adding it to the 2.6.22.x branch ...
(would require additional testing with older and newer
 gcc as well as verification that it doesn't harm 
 anything)

possible alternative solutions:

 - get an older gcc, which is known to compile that
   kernel fine (vanilla)

 - get a newer kernel, preferably 2.6.31.x and use
   that instead of the old 2.6.22.x branch

best,
Herbert

> Ciao,
> Daniel

> blaze your trail

> --
> redhat
> 
> http://feeds.feedburner.com/GeneralMusing
> 
> 2009/10/31 Herbert Poetzl <herbert@13thfloor.at>
> 
> > On Sat, Oct 31, 2009 at 07:04:33PM +0000, Daniël W. Crompton wrote:
> > > Happy Halloween,
> > >
> > > I was getting a error (below) while compiling a new kernel, I found out
> > that
> > > a patch (also below) was required for linux/include/time.h as part of the
> > > code is being optimized away losing the references.
> > >
> > > I check the vserver mailing list and didn't see any post about this
> > issue,
> > > so I am posting it here so we now have a record of it.
> > >
> > > Ciao,
> > > Daniel
> > >
> > >
> > > *ERROR:*
> > > make bzImage
> > > ...
> > >   LD      .tmp_vmlinux1
> > > kernel/built-in.o: In function `getnstimeofday':
> > > (.text+0x22bdc): undefined reference to `__umoddi3'
> > > kernel/built-in.o: In function `getnstimeofday':
> > > (.text+0x22bfc): undefined reference to `__udivdi3'
> > > kernel/built-in.o: In function `do_gettimeofday':
> > > (.text+0x22d0e): undefined reference to `__udivdi3'
> > > kernel/built-in.o: In function `do_gettimeofday':
> > > (.text+0x22d2c): undefined reference to `__umoddi3'
> > > kernel/built-in.o: In function `timekeeping_resume':
> > > timekeeping.c:(.text+0x22fd4): undefined reference to `__umoddi3'
> > > timekeeping.c:(.text+0x22ff4): undefined reference to `__udivdi3'
> > > kernel/built-in.o: In function `update_wall_time':
> > > (.text+0x23306): undefined reference to `__umoddi3'
> > > kernel/built-in.o: In function `update_wall_time':
> > > (.text+0x23326): undefined reference to `__udivdi3'
> > > kernel/built-in.o: In function `update_wall_time':
> > > (.text+0x23796): undefined reference to `__umoddi3'
> > > kernel/built-in.o: In function `update_wall_time':
> > > (.text+0x237b6): undefined reference to `__udivdi3'
> > > make: *** [.tmp_vmlinux1] Error 1
> >
> > what kernel and Linux-VServer patch is that?
> > and what compiler do you use?
> >
> > TIA,
> > Herbert
> >
> > > *PATCH:*
> > >
> > > diff --git a/include/linux/time.h b/include/linux/time.h
> > > index 2091a19..d32ef0a 100644
> > > --- 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++;
> > >       }
> > >
> > >
> > >
> > >
> > > blaze your trail
> > >
> > > --
> > > redhat
> > >
> > > http://feeds.feedburner.com/GeneralMusing
> >