http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51784

--- Comment #14 from Dominique d'Humieres <dominiq at lps dot ens.fr> 
2012-01-13 23:11:40 UTC ---
Created attachment 26319
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26319
patch for libgcc/libgcov.c to debug findenv

Patch to use the findenv in
http://www.opensource.apple.com/source/Libc/Libc-498.1.7/stdlib/getenv-fbsd.c .
Debugging session

[macbook] f90/bug% /opt/gcc/gcc4.7p/bin/gcc pr44777_db.c -fprofile-generate
-D_PROFILE_GENERATE -m32 -g -save-temps
[macbook] f90/bug% gdb a.out
...
(gdb) b 25
Breakpoint 1 at 0x28bb: file pr44777_db.c, line 25.
(gdb) run
Starting program: /Users/dominiq/Documents/Fortran/g95bench/win/f90/bug/a.out 

Breakpoint 1, y (a=0) at pr44777_db.c:25
25        goto xlab;
(gdb) p/x _NSGetEnviron()
$1 = 0x50a8
(gdb) p/x *_NSGetEnviron()
$2 = 0xbfffd9b4
(gdb) p/x **_NSGetEnviron()
Cannot access memory at address 0xbfffd9b4
(gdb) stepi
0x000028bd    25        goto xlab;
(gdb) stepi
0x000028c3    25        goto xlab;
(gdb) stepi
0x000028c5 in y (a=-1881144004) at pr44777_db.c:25
25        goto xlab;
(gdb) stepi
0x000028c8    25        goto xlab;
(gdb) stepi
0x000029a2 in x (a=-1881144004) at pr44777_db.c:29
29      y (a);
(gdb) stepi
0x000029a5 in x (a=1) at pr44777_db.c:29
29      y (a);
(gdb) stepi
0x000029ab    29      y (a);
(gdb) stepi
0x000029ae    29      y (a);
(gdb) stepi
0x000029b1    29      y (a);
(gdb) stepi
0x000029b4    29      y (a);
(gdb) stepi
0x000029b7    29      y (a);
(gdb) stepi
0x000029bd    29      y (a);
(gdb) p/x _NSGetEnviron()
$3 = 0x50a8
(gdb) p/x *_NSGetEnviron()
$4 = 0xbfffd9b4
(gdb) p/x **_NSGetEnviron()
Cannot access memory at address 0xbfffd9b4
(gdb) x/x 0x000029bd
0x29bd <x+162>:    0x89084189
(gdb) stepi
0x000029c0    29      y (a);
(gdb) p/x _NSGetEnviron()
$5 = 0x50a8
(gdb) p/x *_NSGetEnviron()
$6 = 0xc000d9b4         <----- address changed from 0xbfffd9b4 to 0xc000d9b4
(gdb) p/x **_NSGetEnviron()
Cannot access memory at address 0xc000d9b4
(gdb) x/x 0x000029c0
0x29c0 <x+165>:    0x8b0c5189
(gdb) stepi
31      return a;
(gdb) stepi
0x000029c6    31      return a;
(gdb) x/x 0x000029c6
0x29c6 <x+171>:    0x2857838d
(gdb) stepi
0x000029cc    31      return a;
(gdb) x/x 0x000029cc
0x29cc <x+177>:    0x8b14508b
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x00003198 in my_findenv (name=0x45cf "GCOV_PREFIX_STRIP", offset=0xbfffd79c,
environ=0xc000d9b4) at ../../../../p_work/libgcc/libgcov.c:296
296        for (p = environ; (cp = *p) != NULL; ++p) {
(gdb) c
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.

pr44777_db.c is the original test with '#define DEPTH 1000' replaced with
'#define DEPTH 1'.

If I am not mistaken, findenv crashes because the address for environ has been 
changed from 0xbfffd9b4 to 0xc000d9b4 at the end of the proc 'x'.

Reply via email to