Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Alexander Larsson <alexl@redhat.com>
To: gdb@sources.redhat.com
Subject: External debug symbols
Date: Tue, 20 Aug 2002 12:50:00 -0000	[thread overview]
Message-ID: <Pine.LNX.4.44.0208201535320.12684-200000@devserv.devel.redhat.com> (raw)

[-- Attachment #1: Type: TEXT/PLAIN, Size: 2023 bytes --]

Hi

I've been experimenting some with removing debug information from binaries 
and placing it in a separate file, and then having gdb automatically load 
these if availible. (The goal here is to package debug information in 
separate packages that can be on-demand downloaded and installed.)

I have written a libelf based application that takes an elf file, splits 
out debug information to a separate file, strips the original file and 
adds a ".debuglink" section to the stripped file. This section contains 
the basename of the filename of the debug file and a crc32 checksum of it.

I've also written an "unstrip" application that puts together the original 
ELF file from the stripped one and the debug file (and some extra 
information I put in a section of the debug file). This produces a bitwise 
identical file to the original.

My next step is to make gdb automatically follow ".debuglink" sections so 
that i don't have to use the unstrip application. Attached to this mail is 
a patch that implements a "badhack" which seems to almost work. In order 
for it to work I had to add all the original section headers to the debug 
file (but SHT_NOBITS, so they take no space). It seems to work for the 
main binary, but setting breakpoints in libraries doesn't work. I think it 
gets the base address wrong or something.

What are your opinions about this solution? Has anything like this been 
done or tought of before? I'm pretty scared of the gdb codebase (looked at 
it for the first time today), so my solution is probably both buggy and 
generally wrong, tips of other ways to do this are appreciated.

-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Alexander Larsson                                            Red Hat, Inc 
                   alexl@redhat.com    alla@lysator.liu.se 
He's a benighted Jewish romance novelist plagued by the memory of his family's 
brutal murder. She's a time-travelling Bolivian traffic cop with only herself 
to blame. They fight crime! 

[-- Attachment #2: Type: TEXT/PLAIN, Size: 2735 bytes --]

diff -ur gdb-5.2.1/gdb/objfiles.c gdb-5.2.1.separate_debug_symbols/gdb/objfiles.c
--- gdb-5.2.1/gdb/objfiles.c	Thu Dec  6 21:59:11 2001
+++ gdb-5.2.1.separate_debug_symbols/gdb/objfiles.c	Tue Aug 20 15:32:15 2002
@@ -397,6 +397,11 @@
 void
 free_objfile (struct objfile *objfile)
 {
+  if (objfile->separate_debug_objfile)
+    {
+      free_objfile (objfile->separate_debug_objfile);
+    }
+  
   /* First do any symbol file specific actions required when we are
      finished with a particular symbol file.  Note that if the objfile
      is using reusable symbol information (via mmalloc) then each of
Only in gdb-5.2.1.separate_debug_symbols/gdb: objfiles.c~
diff -ur gdb-5.2.1/gdb/objfiles.h gdb-5.2.1.separate_debug_symbols/gdb/objfiles.h
--- gdb-5.2.1/gdb/objfiles.h	Sat Jun 29 00:05:47 2002
+++ gdb-5.2.1.separate_debug_symbols/gdb/objfiles.h	Tue Aug 20 15:15:56 2002
@@ -409,6 +409,8 @@
     ExportEntry *export_list;
     int export_list_size;
 
+    struct objfile *separate_debug_objfile;
+    
     /* Place to stash various statistics about this objfile */
       OBJSTATS;
   };
diff -ur gdb-5.2.1/gdb/symfile.c gdb-5.2.1.separate_debug_symbols/gdb/symfile.c
--- gdb-5.2.1/gdb/symfile.c	Sat Jun 22 18:49:33 2002
+++ gdb-5.2.1.separate_debug_symbols/gdb/symfile.c	Tue Aug 20 16:15:33 2002
@@ -837,6 +837,7 @@
   struct objfile *objfile;
   struct partial_symtab *psymtab;
   bfd *abfd;
+  asection *sect = NULL;
 
   /* Open a bfd for the file, and give user a chance to burp if we'd be
      interactively wiping out any existing symbols.  */
@@ -926,6 +927,42 @@
   if (target_new_objfile_hook)
     target_new_objfile_hook (objfile);
 
+  
+  sect = bfd_get_section_by_name (objfile->obfd, ".debuglink");
+  if (sect)
+    {
+      bfd_size_type size = bfd_section_size (objfile->obfd, sect);
+      char *debuglink;
+      char *dir;
+      char *debugfile;
+      char *name_copy;
+      char *p;
+      
+      debuglink = alloca (size);
+      bfd_get_section_contents (objfile->obfd, sect, debuglink,
+				(file_ptr)0, (bfd_size_type)size);
+
+      dir = xstrdup (name);
+      p = strrchr (dir, '/');
+      if (p != NULL)
+	{
+	  *(p+1) = 0;
+	  
+	  debugfile = alloca ( strlen (dir) + strlen (debuglink) + 1);
+	  strcpy (debugfile, dir);
+	  strcat (debugfile, debuglink);
+	}
+      else
+	{
+	  debugfile = alloca ( strlen (debuglink) + 1);
+	  strcpy (debugfile, debuglink);
+	}
+      xfree (dir);
+      
+      printf_filtered ("loading separate debug info from '%s'\n", debugfile);
+      objfile->separate_debug_objfile = symbol_file_add (debugfile, from_tty, addrs, 0, flags);
+    }
+  
   return (objfile);
 }
 

             reply	other threads:[~2002-08-20 19:50 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-08-20 12:50 Alexander Larsson [this message]
2002-08-21  6:39 ` Alexander Larsson
2002-08-21 10:46 ` Jim Blandy
2002-08-21 23:51   ` Alexander Larsson
2002-08-27  3:59   ` Alexander Larsson
2002-09-16  6:59     ` Alexander Larsson
2002-09-20  8:13       ` Elena Zannoni
2002-09-20  8:22         ` Daniel Jacobowitz
2002-09-23  0:46           ` Alexander Larsson
2002-09-23  0:43         ` Alexander Larsson
2002-09-23  8:21         ` Alexander Larsson
2002-09-23  8:25           ` Daniel Jacobowitz
2002-09-23 10:03             ` Alexander Larsson
2002-09-23 21:45           ` Eli Zaretskii
2002-09-25  1:51             ` Alexander Larsson
2002-09-25 22:00               ` Eli Zaretskii
2002-10-02  7:42                 ` Alexander Larsson
2002-10-02 21:40                   ` Eli Zaretskii
2002-10-08  8:21                     ` Alexander Larsson
2002-10-08  9:33                       ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.44.0208201535320.12684-200000@devserv.devel.redhat.com \
    --to=alexl@redhat.com \
    --cc=gdb@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox