bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug #17647] glibc: GCC 4.1


From: Thomas Schwinge
Subject: [bug #17647] glibc: GCC 4.1
Date: Sun, 19 Nov 2006 22:33:46 +0000
User-agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)

Update of bug #17647 (project hurd):

                  Status:                    None => In Progress            

    _______________________________________________________

Follow-up Comment #2:

I had a look today.  But now I think I need Roland's or someone else's help. 
The problem is --- so far --- only in `sysdeps/mach/hurd/i386/init-first.c'. 
As soon as I compile that file with GCC 4.0 and everything else with GCC 4.1,
the resulting `libc.so' doesn't fail anymore.  (I was only testing with a
primitive ``int main (void) { return 0; }'' so far, but that's already
something.)

So, what did I find.  The problem may be related to this change:

#v+
2005-10-16  Roland McGrath  <roland@frob.com>
[...]
        [BZ #1253]
        * sysdeps/mach/hurd/i386/init-first.c (init): Make cast kosher.
        (_hurd_stack_setup): Don't declare with arguments and ellipsis.
        Use __builtin_frame_address and __builtin_return_address.
        (_dl_init_first): Likewise.
#v-

#v+
[...]
 void
-_dl_init_first (int argc, ...)
+_dl_init_first (void)
 {
   first_init ();
 
-  init (&argc);
+  init ((int *) __builtin_frame_address (0) + 2);
 }
[...]
#v-


Now, experimenting a bit, there is a strange thing going on when using GCC
4.1 and `__builtin_frame_address':

Consider this test program:

#v+
#include <stdio.h>

void func (void)
{
  int *ra = __builtin_return_address (0);
  int *fa = __builtin_frame_address (0);

  printf ("%s:fa[0] = %u\tfa[1] = %u\tra = %u\n", __func__, fa[0], fa[1],
ra);
}

int main (void)
{
  int *ra = __builtin_return_address (0);
  int *fa = __builtin_frame_address (0);

  printf ("%s:fa = %u\tfa[1] = %u\tra = %u\n", __func__, fa, fa[1], ra);

  func ();
}
#v-

#v+
$ gcc-4.0 test.c && ./a.out
main:fa = 3216472808    fa[1] = 3084724428      ra = 3084724428
func:fa[0] = 3216472808 fa[1] = 134513645       ra = 134513645
#v-

This is what I would expect.  However:

#v+
main:fa = 3220364948    fa[1] = 3220365064      ra = 3085416652
func:fa[0] = 3220364952 fa[1] = 134513639       ra = 134513639
#v-

When applying optimizations via `-O' even the GCC 4.0 one produces unexpected
results, but that's due to function-inlining then, I guess.


So, perhaps there's something wrong with the usage of
`__builtin_frame_address' in `_dl_init_first'?


    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?17647>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]