]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/symtab] Bail out of create_addrmap_from_gdb_index on error
authorTom de Vries <tdevries@suse.de>
Sat, 23 Aug 2025 04:11:41 +0000 (06:11 +0200)
committerTom de Vries <tdevries@suse.de>
Sat, 23 Aug 2025 04:11:41 +0000 (06:11 +0200)
Currently, in create_addrmap_from_gdb_index, when finding an incorrect entry
in the address table of a .gdb_index section:
- a (by default silent) complaint is made,
- the entry is skipped, and
- the rest of the entries is processed.

This is the use-what-you-can approach, which make sense in general.

But in the case that the .gdb_index section is incorrect while the other debug
info is correct, this approach prevents gdb from building a correct cooked
index (assuming there's no bug in gdb that would cause an incorrect index to
be generated).

Instead, bail out of create_addrmap_from_gdb_index on finding errors in the
address table.

I wonder about the following potential drawback of this approach: in the case
that the .gdb_index section is incorrect because the debug info is incorrect,
this approach rejects the .gdb_index section and spents time rebuilding a
likewise incorrect index.  But I'm not sure if this is a real problem.
Perhaps gdb will refuse to generate such an index, in which case this is a
non-issue.

Tested on aarch64-linux.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/dwarf2/read-gdb-index.c

index fc7b654be1a189721d55d98a68dd084fd852f4bb..7db2834f4d328dcb23a53e99e858c9501a51f040 100644 (file)
@@ -1395,9 +1395,10 @@ create_signatured_type_table_from_gdb_index
   per_bfd->signatured_types = std::move (sig_types_hash);
 }
 
-/* Read the address map data from the mapped GDB index.  */
+/* Read the address map data from the mapped GDB index.  Return true if no
+   errors were found, otherwise return false.  */
 
-static void
+static bool
 create_addrmap_from_gdb_index (dwarf2_per_objfile *per_objfile,
                               mapped_gdb_index *index)
 {
@@ -1423,14 +1424,14 @@ create_addrmap_from_gdb_index (dwarf2_per_objfile *per_objfile,
        {
          complaint (_(".gdb_index address table has invalid range (%s - %s)"),
                     hex_string (lo), hex_string (hi));
-         continue;
+         return false;
        }
 
       if (cu_index >= index->units.size ())
        {
          complaint (_(".gdb_index address table has invalid CU number %u"),
                     (unsigned) cu_index);
-         continue;
+         return false;
        }
 
       mutable_map.set_empty (lo, hi - 1, index->units[cu_index]);
@@ -1438,6 +1439,8 @@ create_addrmap_from_gdb_index (dwarf2_per_objfile *per_objfile,
 
   index->index_addrmap
     = new (&per_bfd->obstack) addrmap_fixed (&per_bfd->obstack, &mutable_map);
+
+  return true;
 }
 
 /* Sets the name and language of the main function from the shortcut table.  */
@@ -1559,7 +1562,8 @@ dwarf2_read_gdb_index
 
   finalize_all_units (per_bfd);
 
-  create_addrmap_from_gdb_index (per_objfile, map.get ());
+  if (!create_addrmap_from_gdb_index (per_objfile, map.get ()))
+    return false;
 
   set_main_name_from_gdb_index (per_objfile, map.get ());