diff options
author | Tom Tromey <tom@tromey.com> | 2023-12-04 07:58:48 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2024-01-18 08:20:17 -0700 |
commit | 3a862152958a1d17742cef7fc43c4d51dd2dcbab (patch) | |
tree | 6f1bfb2ba15de0f1b184670b5eb6b6673f8db523 /gdb | |
parent | 36cde74bd8ba912604dd675bc5046c20fb8c5d68 (diff) | |
download | gdb-3a862152958a1d17742cef7fc43c4d51dd2dcbab.zip gdb-3a862152958a1d17742cef7fc43c4d51dd2dcbab.tar.gz gdb-3a862152958a1d17742cef7fc43c4d51dd2dcbab.tar.bz2 |
Empty hash table fix in .debug_names reader
The handling of an empty hash table in the .debug_names reader is
slightly wrong.
Currently the code assumes there is always an array of hashes.
However, section 6.1.1.4.5 Hash Lookup Table says:
The optional hash lookup table immediately follows the list of
type signatures.
and then:
The hash lookup table is actually two separate arrays: an array of
buckets, followed immediately by an array of hashes.
My reading of this is that the hash table as a whole is optional, and
so the hashes will not exist in this case. (This also makes sense
because the hashes are not useful without the buckets anyway.)
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25950
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/dwarf2/read-debug-names.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/gdb/dwarf2/read-debug-names.c b/gdb/dwarf2/read-debug-names.c index a2a9fd4..b4ff36f 100644 --- a/gdb/dwarf2/read-debug-names.c +++ b/gdb/dwarf2/read-debug-names.c @@ -294,7 +294,8 @@ read_debug_names_from_section (struct objfile *objfile, map.bucket_table_reordered = reinterpret_cast<const uint32_t *> (addr); addr += map.bucket_count * 4; map.hash_table_reordered = reinterpret_cast<const uint32_t *> (addr); - addr += map.name_count * 4; + if (map.bucket_count != 0) + addr += map.name_count * 4; /* Name Table */ map.name_table_string_offs_reordered = addr; |