This bug can also be reproduced without systemtap. Simple demo attached.
Usage (on i386):
% gcc-4.0 -g -mregparm=2 -O2 driver.c 1.c
% gdb ./a.out
GNU gdb 6.4.90-debian
...cut...
(gdb) br sys_open
Breakpoint 1 at 0x8048363: file 1.c, line 5.
(gdb) run
Starting program: /tmp/out/a.out
Breakpoint 1, sys_open (filename=0xbff7f024 "��) at 1.c:5
5 {
(gdb)
The interesting thing here is how filename argument value is displayed.
This bug cannot be reproduced with gcc-4.1. GDB also displays correct
contents of 'filename' if files compiled without -O2.
There is also one mail that suggests that gcc generates debug info as if
'filename' was stored in register (but it is stored in stack due to regpram(0)
attribute):
http://sourceware.org/ml/systemtap/2005-q4/msg00210.html
17 липня 2006 о 18:12 -0300 Tiago Macambira написав(-ла):
> Linux kernels compiled with gcc 4.0.3 have invalid debuging information.
>
> More information on this issue and how to verify this error can be
> obtained in bug #378621. I'll also have to use gcc 4.0.3 to compile a
> kernel with CONFIG_DEBUG_INFO, CONFIG_KPROBES, and optionally
> CONFIG_RELAY. You also need the resulting kernel unstripped vmlinux.
>
> Notice that bug 378621 was filed against systemtap but the issue here is
> gcc 4.0. GCC 4.1 seems to provide correct/good debug information though.
> Besides, although this error was spoted in a kernel compiled with 4.0,
--
Eugeniy Meshcheryakov
#define asmlinkage __attribute__((regparm(0)))
extern asmlinkage long sys_open(const char *filename);
long do_sys_open(const char *filename)
{
return 0;
}
int main(int arc, char **argv)
{
return sys_open("/tmp/out");
}
extern long do_sys_open(const char *);
#define asmlinkage __attribute__((regparm(0)))
asmlinkage long sys_open(const char *filename)
{
long ret;
ret = do_sys_open(filename);
return ret;
}
Attachment:
signature.asc
Description: Digital signature