gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 1 Feb 2013 19:39:04 +0000 (19:39 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 1 Feb 2013 19:39:04 +0000 (19:39 +0000)
* elfread.c (elf_symfile_read): Limit separate debug info additions to
files with no separate debug info.
* objfiles.c (add_separate_debug_objfile): Add gdb_assert calls.
* symfile.c (read_symbols): Call find_separate_debug_file_in_section
only for files with no separate debug info.

gdb/testsuite/
* gdb.base/gnu-debugdata.exp): Create ${binfile}.debug,
${binfile}.mini_debuginfo-debuglink, add -k to xz, use now
${binfile}.mini_debuginfo-debuglink and
${binfile}.mini_debuginfo-debuglink.xz.

gdb/ChangeLog
gdb/elfread.c
gdb/objfiles.c
gdb/symfile.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/gnu-debugdata.exp

index e4cbe05e3619c2159da2708cccfcb9a6a7ffcec1..c95c1b388921725cac94b8cec751aa8be125c2f9 100644 (file)
@@ -1,3 +1,11 @@
+2013-02-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * elfread.c (elf_symfile_read): Limit separate debug info additions to
+       files with no separate debug info.
+       * objfiles.c (add_separate_debug_objfile): Add gdb_assert calls.
+       * symfile.c (read_symbols): Call find_separate_debug_file_in_section
+       only for files with no separate debug info.
+
 2013-01-31  Tom Tromey  <tromey@redhat.com>
 
        * jit.c (jit_program_space_data): Rename from jit_inferior_data;
index 9d630cdaa4c78fcabb65ccc9814b490e3bcfb6b0..6ca659f92a756dda79b7a4eafa16e08187e1d997 100644 (file)
@@ -1431,8 +1431,18 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
   /* If the file has its own symbol tables it has no separate debug
      info.  `.dynsym'/`.symtab' go to MSYMBOLS, `.debug_info' goes to
      SYMTABS/PSYMTABS.  `.gnu_debuglink' may no longer be present with
-     `.note.gnu.build-id'.  */
-  else if (!objfile_has_partial_symbols (objfile))
+     `.note.gnu.build-id'.
+
+     .gnu_debugdata is !objfile_has_partial_symbols because it contains only
+     .symtab, not .debug_* section.  But if we already added .gnu_debugdata as
+     an objfile via find_separate_debug_file_in_section there was no separate
+     debug info available.  Therefore do not attempt to search for another one,
+     objfile->separate_debug_objfile->separate_debug_objfile GDB guarantees to
+     be NULL and we would possibly violate it.  */
+
+  else if (!objfile_has_partial_symbols (objfile)
+          && objfile->separate_debug_objfile == NULL
+          && objfile->separate_debug_objfile_backlink == NULL)
     {
       char *debugfile;
 
index 5232c8ffb9131f76a8807d3a5020c95af2c35d50..5829699131dcd53bbaec3e9a4ab320a4fa84130f 100644 (file)
@@ -476,6 +476,9 @@ add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent)
   /* Must not be already in a list.  */
   gdb_assert (objfile->separate_debug_objfile_backlink == NULL);
   gdb_assert (objfile->separate_debug_objfile_link == NULL);
+  gdb_assert (objfile->separate_debug_objfile == NULL);
+  gdb_assert (parent->separate_debug_objfile_backlink == NULL);
+  gdb_assert (parent->separate_debug_objfile_link == NULL);
 
   objfile->separate_debug_objfile_backlink = parent;
   objfile->separate_debug_objfile_link = parent->separate_debug_objfile;
index 63bf3295d7fd6d2c2780d9b9c0d2fa369c0b9ba8..6f968b7abd891b4f05f09fca4af3c72780b5bf3e 100644 (file)
@@ -823,7 +823,12 @@ static void
 read_symbols (struct objfile *objfile, int add_flags)
 {
   (*objfile->sf->sym_read) (objfile, add_flags);
-  if (!objfile_has_partial_symbols (objfile))
+
+  /* find_separate_debug_file_in_section should be called only if there is
+     single binary with no existing separate debug info file.  */
+  if (!objfile_has_partial_symbols (objfile)
+      && objfile->separate_debug_objfile == NULL
+      && objfile->separate_debug_objfile_backlink == NULL)
     {
       bfd *abfd = find_separate_debug_file_in_section (objfile);
       struct cleanup *cleanup = make_cleanup_bfd_unref (abfd);
index 47fed7744801ea3f2b92e4adc10163b19d3211cb..8fc13fe066fb8249a117913f65d1f655dd62c2d1 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.base/gnu-debugdata.exp): Create ${binfile}.debug,
+       ${binfile}.mini_debuginfo-debuglink, add -k to xz, use now
+       ${binfile}.mini_debuginfo-debuglink and
+       ${binfile}.mini_debuginfo-debuglink.xz.
+
 2013-02-01  Tom Tromey  <tromey@redhat.com>
 
        * gdb.dwarf2/method-ptr.exp: Use correct form for non-string
index f34e4e83119cede2173c30a7394358dccbcd9919..55aa3c6ff413361f7bbcada326f72835fe57e9bb 100644 (file)
@@ -127,14 +127,30 @@ if {[run "strip" [transform strip] \
     return -1
 }
 
+# Separate full debug info into ${binfile}.debug.
+remote_file host delete ${binfile}.debug
+if {[run "copydebug" [transform objcopy] \
+        "--only-keep-debug ${binfile} ${binfile}.debug"]} {
+    return -1
+}
+
+# Add the .gnu_debuglink section to the .gnu_debugdata file.
+# .gnu_debuglink is normally not present in the .gnu_debugdata section but in
+# some files there may be PT_NOTE with NT_GNU_BUILD_ID and GDB could look up
+# the .debug file from it.
+if {[run "addlink" [transform objcopy] \
+        "--add-gnu-debuglink=${binfile}.debug ${binfile}.mini_debuginfo ${binfile}.mini_debuginfo-debuglink"]} {
+    return -1
+}
+
 # Inject the compressed data into the .gnu_debugdata section of the
 # original binary.
-remote_file host delete ${binfile}.mini_debuginfo.xz
-if {[run "xz" "xz" "${binfile}.mini_debuginfo"]} {
+remote_file host delete ${binfile}.mini_debuginfo-debuglink.xz
+if {[run "xz" "xz" "-k ${binfile}.mini_debuginfo-debuglink"]} {
     return -1
 }
 remote_file host delete ${binfile}.test
-if {[run "objcopy 2" [transform objcopy] "--add-section .gnu_debugdata=${binfile}.mini_debuginfo.xz ${binfile}.strip ${binfile}.test"]} {
+if {[run "objcopy 2" [transform objcopy] "--add-section .gnu_debugdata=${binfile}.mini_debuginfo-debuglink.xz ${binfile}.strip ${binfile}.test"]} {
     return -1
 }