This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix gcore for vDSO (on ppc64)


Hi,

on ppc64 GNU/Linux one gets in live process or kernel-generated core file:

#0  0x00003fff9e946b3c in __pause_nocancel () from /lib64/libc.so.6
#1  0x000000001000080c in handle_alrm (signo=14) at small.c:16
#2  <signal handler called>
#3  0x00003fff9e946b3c in __pause_nocancel () from /lib64/libc.so.6
#4  0x0000000010000914 in main (argc=2, argv=0x3fffcd00dec8) at small.c:32

while with gcore generated core file one gets:

#0  0x00003fff9e946b3c in __pause_nocancel () from /lib64/libc.so.6
#1  0x000000001000080c in handle_alrm (signo=14) at small.c:16
#2  0x00003fff9ea70448 in ?? ()
#3  0x0000000010000914 in main (argc=2, argv=0x3fffcd00dec8) at small.c:32

This is because on ppc64 GNU/Linux the signal handler frame is in vDSO (and
not in libc as on x86_64 GNU/Linux).  And if one has kernel-debuginfo
installed GDB gcore thinks it can omit the vDSO page from core file.

As vDSO cannot be reliably found from link_map it should be rather fully
present in the core file.  Which also gcore_create_callback tries to do but it
gets mistaken by the separate debug info.

It seems pretty obvious patch to me.


Thanks,
Jan


gdb/
2013-05-03  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gcore.c (gcore_create_callback): Ignore sections with
	separate_debug_objfile_backlink != NULL.

--- gdb-7.6-orig/gdb/gcore.c	2013-01-01 07:32:42.000000000 +0100
+++ gdb-7.6/gdb/gcore.c	2013-05-03 03:31:34.795312996 +0200
@@ -428,8 +428,9 @@ gcore_create_callback (CORE_ADDR vaddr,
 
 	     This BFD was synthesized from reading target memory,
 	     we don't want to omit that.  */
-	  if (((vaddr >= start && vaddr + size <= end)
-	       || (start >= vaddr && end <= vaddr + size))
+	  if (objfile->separate_debug_objfile_backlink == NULL
+	      && ((vaddr >= start && vaddr + size <= end)
+	          || (start >= vaddr && end <= vaddr + size))
 	      && !(bfd_get_file_flags (abfd) & BFD_IN_MEMORY))
 	    {
 	      flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]