119 lines
3.6 KiB
Diff
119 lines
3.6 KiB
Diff
http://sourceware.org/ml/binutils/2011-12/msg00298.html
|
||
Subject: [patch] Fix zero registers core files w/gcc-4.7
|
||
|
||
Hello H.J.,
|
||
|
||
there is a regression by:
|
||
commit 2c9c556617a7de8657c25b512d272c26b070ae22
|
||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||
Date: Thu Jun 16 22:08:10 2011 +0000
|
||
Suport x32 gcore.
|
||
|
||
when built with -O2 by
|
||
gcc (GCC) 4.7.0 20111223 (experimental)
|
||
(not by 4.6.x)
|
||
|
||
as the code violates ISO C99 6.2.4 item 5 by using local variable outside of
|
||
its block, GCC optimizes out the second memcpy, keeping there only that
|
||
memset.
|
||
|
||
./gdb -nx ./gdb -ex start -ex 'gcore 1' -ex 'set confirm no' -ex q;gdb -nx ./gdb ./1 -ex q
|
||
will print:
|
||
Core was generated by `.../gdb/gdb'.
|
||
#0 0x0000000000000000 in ?? ()
|
||
|
||
No regressions on x86_64-fedora16-linux-gnu.
|
||
|
||
Probably obvious, OK to check it in?
|
||
|
||
|
||
Thanks,
|
||
Jan
|
||
|
||
|
||
bfd/
|
||
2011-12-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||
|
||
Fix zero registers core files when built by gcc-4.7.
|
||
* elf64-x86-64.c (elf_x86_64_write_core_note): Remove variables p and
|
||
size. Call elfcore_write_note for the local variables. Remove the
|
||
final elfcore_write_note call. Add NOTREACHED comments.
|
||
|
||
--- a/bfd/elf64-x86-64.c
|
||
+++ b/bfd/elf64-x86-64.c
|
||
@@ -420,8 +420,6 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
|
||
int note_type, ...)
|
||
{
|
||
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
||
- const void *p;
|
||
- int size;
|
||
va_list ap;
|
||
const char *fname, *psargs;
|
||
long pid;
|
||
@@ -445,8 +443,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
|
||
memset (&data, 0, sizeof (data));
|
||
strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
|
||
strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
|
||
- p = (const void *) &data;
|
||
- size = sizeof (data);
|
||
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
|
||
+ &data, sizeof (data));
|
||
}
|
||
else
|
||
{
|
||
@@ -454,10 +452,10 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
|
||
memset (&data, 0, sizeof (data));
|
||
strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
|
||
strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
|
||
- p = (const void *) &data;
|
||
- size = sizeof (data);
|
||
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
|
||
+ &data, sizeof (data));
|
||
}
|
||
- break;
|
||
+ /* NOTREACHED */
|
||
|
||
case NT_PRSTATUS:
|
||
va_start (ap, note_type);
|
||
@@ -475,8 +473,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
|
||
prstat.pr_pid = pid;
|
||
prstat.pr_cursig = cursig;
|
||
memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
|
||
- p = (const void *) &prstat;
|
||
- size = sizeof (prstat);
|
||
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
|
||
+ &prstat, sizeof (prstat));
|
||
}
|
||
else
|
||
{
|
||
@@ -485,8 +483,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
|
||
prstat.pr_pid = pid;
|
||
prstat.pr_cursig = cursig;
|
||
memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
|
||
- p = (const void *) &prstat;
|
||
- size = sizeof (prstat);
|
||
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
|
||
+ &prstat, sizeof (prstat));
|
||
}
|
||
}
|
||
else
|
||
@@ -496,14 +494,11 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
|
||
prstat.pr_pid = pid;
|
||
prstat.pr_cursig = cursig;
|
||
memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
|
||
- p = (const void *) &prstat;
|
||
- size = sizeof (prstat);
|
||
+ return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
|
||
+ &prstat, sizeof (prstat));
|
||
}
|
||
- break;
|
||
}
|
||
-
|
||
- return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, p,
|
||
- size);
|
||
+ /* NOTREACHED */
|
||
}
|
||
#endif
|
||
|
||
|