[binutils-gdb] [gdb/symtab] Fix assert in write_one_signatured_type

Tom de Vries vries@sourceware.org
Tue Feb 2 07:37:48 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2bd3e4b8d2580839a457e221d4e1e09105248215

commit 2bd3e4b8d2580839a457e221d4e1e09105248215
Author: Tom de Vries <tdevries@suse.de>
Date:   Tue Feb 2 08:37:45 2021 +0100

    [gdb/symtab] Fix assert in write_one_signatured_type
    
    When running test-case gdb.dwarf2/fission-reread.exp with target board
    cc-with-gdb-index, we run into an abort during the generation of the gdb-index
    by cc-with-tweaks.sh:
    ...
    build/gdb/testsuite/cache/gdb.sh: line 1: 27275 Aborted  (core dumped)
    ...
    
    This can be reproduced on the command line like this:
    ...
    $ gdb -batch ./outputs/gdb.dwarf2/fission-reread/fission-reread \
      -ex 'save gdb-index  ./outputs/gdb.dwarf2/fission-reread'
    warning: Could not find DWO TU fission-reread.dwo(0x9022f1ceac7e8b19) \
      referenced by TU at offset 0x0 [in module fission-reread]
    warning: Could not find DWO CU fission-reread.dwo(0x807060504030201) \
      referenced by CU at offset 0x561 [in module fission-reread]
    Aborted (core dumped)
    ...
    
    The abort is a segfault due to a using a nullptr psymtab in
    write_one_signatured_type.
    
    The problem is that we're trying to write index entries for the type unit
    with signature:
    ...
    (gdb) p /x entry->signature
    $2 = 0x9022f1ceac7e8b19
    ...
    which is a skeleton type unit:
    ...
    Contents of the .debug_types section:
    
      Compilation Unit @ offset 0x0:
       Length:        0x4a (32-bit)
       Version:       4
       Abbrev Offset: 0x165
       Pointer Size:  4
       Signature:     0x9022f1ceac7e8b19
       Type Offset:   0x0
     <0><17>: Abbrev Number: 2 (DW_TAG_type_unit)
        <18>   DW_AT_comp_dir    : /tmp/src/gdb/testsuite
        <2f>   DW_AT_GNU_dwo_name: fission-reread.dwo
        <42>   DW_AT_GNU_pubnames: 0x0
        <46>   DW_AT_GNU_pubtypes: 0x0
        <4a>   DW_AT_GNU_addr_base: 0x0
    ...
    referring to a .dwo file, but as the warnings show, the .dwo file is not
    found.
    
    Fix this by skipping the type unit in write_one_signatured_type if
    psymtab == nullptr.
    
    Tested on x86_64-linux.
    
    gdb/ChangeLog:
    
    2021-02-02  Tom de Vries  <tdevries@suse.de>
    
            PR symtab/24620
            * dwarf2/index-write.c (write_one_signatured_type): Skip if
            psymtab == nullptr.
    
    gdb/testsuite/ChangeLog:
    
    2021-02-02  Tom de Vries  <tdevries@suse.de>
    
            PR symtab/24620
            * gdb.dwarf2/fission-reread.exp: Add test-case.

Diff:
---
 gdb/ChangeLog                               |  6 ++++++
 gdb/dwarf2/index-write.c                    |  8 ++++++++
 gdb/testsuite/ChangeLog                     |  5 +++++
 gdb/testsuite/gdb.dwarf2/fission-reread.exp | 15 +++++++++++++++
 4 files changed, 34 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7323a13e0f2..0592c8643d6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2021-02-02  Tom de Vries  <tdevries@suse.de>
+
+	PR symtab/24620
+	* dwarf2/index-write.c (write_one_signatured_type): Skip if
+	psymtab == nullptr.
+
 2021-02-01  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* Makefile.in (HFILES_NO_SRCDIR): Add corefile.h.
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
index 66781feaf46..a7b9ae66cae 100644
--- a/gdb/dwarf2/index-write.c
+++ b/gdb/dwarf2/index-write.c
@@ -616,6 +616,14 @@ write_one_signatured_type (void **slot, void *d)
   struct signatured_type *entry = (struct signatured_type *) *slot;
   partial_symtab *psymtab = entry->per_cu.v.psymtab;
 
+  if (psymtab == nullptr)
+    {
+      /* We can end up here when processing a skeleton CU referring to a
+	 .dwo file that hasn't been found.  There's not much we can do in
+	 such a case, so skip this CU.  */
+      return 1;
+    }
+
   write_psymbols (info->symtab, info->psyms_seen,
 		  psymtab->global_psymbols, info->cu_index,
 		  0);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index a557765c4b6..0f3f445b8f2 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2021-02-02  Tom de Vries  <tdevries@suse.de>
+
+	PR symtab/24620
+	* gdb.dwarf2/fission-reread.exp: Add test-case.
+
 2021-02-01  Tom de Vries  <tdevries@suse.de>
 
 	* gdb.dwarf2/fission-base.S: Pass -DDWO=$dwo.
diff --git a/gdb/testsuite/gdb.dwarf2/fission-reread.exp b/gdb/testsuite/gdb.dwarf2/fission-reread.exp
index b97c48ad1b3..58132794ee7 100644
--- a/gdb/testsuite/gdb.dwarf2/fission-reread.exp
+++ b/gdb/testsuite/gdb.dwarf2/fission-reread.exp
@@ -56,3 +56,18 @@ pass $testfile
 gdb_unload
 # If we get this far gdb didn't crash, nor did an error occur.
 pass "$testfile - unload"
+
+# Test-case for PR24620: Delete the .dwo file and verify that
+# save gdb-index doesn't crash.
+remote_file target delete $dwo
+clean_restart $binfile
+set output_dir [standard_output_file ""]
+set cmd "save gdb-index"
+gdb_test_multiple "$cmd $output_dir" $cmd {
+    -re -wrap "Cannot use an index to create the index.*" {
+	unsupported $gdb_test_name
+    }
+    -re "^$cmd \[^\r\n\]*\r\n$gdb_prompt $" {
+	pass $gdb_test_name
+    }
+}


More information about the Gdb-cvs mailing list