aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2025-08-23 06:11:41 +0200
committerTom de Vries <tdevries@suse.de>2025-08-23 06:11:41 +0200
commit5a74ce37a50c8675ecfb10973eb1ec9139f36bd5 (patch)
tree659b55adffc15ecb3942efe48a1f724ba0ef1ce7
parentb0653e3db9c6d0d4f1f547e19aaad621aad58920 (diff)
downloadbinutils-5a74ce37a50c8675ecfb10973eb1ec9139f36bd5.zip
binutils-5a74ce37a50c8675ecfb10973eb1ec9139f36bd5.tar.gz
binutils-5a74ce37a50c8675ecfb10973eb1ec9139f36bd5.tar.bz2
[gdb/symtab] Bail out of create_addrmap_from_gdb_index on error
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>
-rw-r--r--gdb/dwarf2/read-gdb-index.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gdb/dwarf2/read-gdb-index.c b/gdb/dwarf2/read-gdb-index.c
index fc7b654..7db2834 100644
--- a/gdb/dwarf2/read-gdb-index.c
+++ b/gdb/dwarf2/read-gdb-index.c
@@ -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 ());