aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-12-04 07:48:42 -0700
committerTom Tromey <tom@tromey.com>2023-12-04 11:20:44 -0700
commite0a874120a21bd460bd922c337f4869f72751dcf (patch)
tree610559b69347e27e6c0cb5dd73fe3777c48aaf3e /binutils
parent9c2370293ebe8354cca0d9dfa745f3bebf238d6d (diff)
downloadgdb-e0a874120a21bd460bd922c337f4869f72751dcf.zip
gdb-e0a874120a21bd460bd922c337f4869f72751dcf.tar.gz
gdb-e0a874120a21bd460bd922c337f4869f72751dcf.tar.bz2
Fix two buglets in .debug_names dumping
While working on gdb's .debug_names writer, I found a couple of small bugs in binutils .debug_names dumping. First, the DWARF spec (section 6.1.1.4.6 Name Table) says: These two arrays are indexed starting at 1, [...] I think it is clearer for binutils to follow this, particularly because DW_IDX_parent refers to this number. Second, I think the handling of an empty hash table is slightly wrong. Currently the dumping 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.) This patch fixes both of these problems. FWIW I have some gdb patches in progress that change gdb both to omit the hash table and to use DW_IDX_parent. 2023-12-04 Tom Tromey <tom@tromey.com> * dwarf.c (display_debug_names): Handle empty .debug_names hash table. Name entries start at 1.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog5
-rw-r--r--binutils/dwarf.c11
2 files changed, 13 insertions, 3 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index b53a9e9..cfe081a 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,8 @@
+2023-12-04 Tom Tromey <tom@tromey.com>
+
+ * dwarf.c (display_debug_names): Handle empty .debug_names hash
+ table. Name entries start at 1.
+
2023-11-15 Arsen Arsenović <arsen@aarsen.me>
* aclocal.m4: Regenerate.
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 9e7d875..47eadfd 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -10353,7 +10353,8 @@ display_debug_names (struct dwarf_section *section, void *file)
const uint32_t *const hash_table_buckets = (uint32_t *) hdrptr;
hdrptr += bucket_count * sizeof (uint32_t);
const uint32_t *const hash_table_hashes = (uint32_t *) hdrptr;
- hdrptr += name_count * sizeof (uint32_t);
+ if (bucket_count != 0)
+ hdrptr += name_count * sizeof (uint32_t);
unsigned char *const name_table_string_offsets = hdrptr;
hdrptr += name_count * offset_size;
unsigned char *const name_table_entry_offsets = hdrptr;
@@ -10478,8 +10479,12 @@ display_debug_names (struct dwarf_section *section, void *file)
p = name_table_entry_offsets + namei * offset_size;
SAFE_BYTE_GET (entry_offset, p, offset_size, unit_end);
- printf ("[%3u] #%08x %s:", namei, hash_table_hashes[namei],
- fetch_indirect_string (string_offset));
+ /* The name table is indexed starting at 1 according to
+ DWARF, so be sure to use the DWARF numbering here. */
+ printf ("[%3u] ", namei + 1);
+ if (bucket_count != 0)
+ printf ("#%08x ", hash_table_hashes[namei]);
+ printf ("%s:", fetch_indirect_string (string_offset));
unsigned char *entryptr = entry_pool + entry_offset;