Handle unaligned mapping of .gdb_index
authorTom Tromey <tom@tromey.com>
Sat, 17 Apr 2021 19:56:36 +0000 (13:56 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 17 Apr 2021 19:56:36 +0000 (13:56 -0600)
commit42c2c69462fd83db2e0532ee57c44091bc1032f9
tree13355973b52c4ffc51df5db1838a4907138e6270
parentda314dd397ab967af558f2929a79349aa5f96ac8
Handle unaligned mapping of .gdb_index

The .gdb_index was designed such that all data would be aligned.
Unfortunately, we neglected to require this alignment in the objcopy
instructions in the manual.  As a result, in many cases, a .gdb_index
in the wild will not be properly aligned by mmap.  This yields
undefined behavior, which is PR gdb/23743.

This patch fixes the bug by always assuming that the mapping is
unaligned, and using extract_unsigned_integer when needed.  A new
helper class is introduced to make this less painful.

gdb/ChangeLog
2021-04-17  Tom Tromey  <tom@tromey.com>

PR gdb/23743:
* dwarf2/read.c (class offset_view): New.
(struct symbol_table_slot): Remove.
(struct mapped_index) <symbol_table, constant_pool>: Change type.
<symbol_name_index, symbol_vec_index>: New methods.
<symbol_name_slot_invalid, symbol_name_at, symbol_name_count>:
Rewrite.
(read_gdb_index_from_buffer): Update.
(struct dw2_symtab_iterator) <vec>: Change type.
(dw2_symtab_iter_init_common, dw2_symtab_iter_init)
(dw2_symtab_iter_next, dw2_expand_marked_cus): Update.
* dwarf2/index-write.c (class data_buf) <append_data>: Remove.
<append_array, append_offset>: New methods.
(write_hash_table, add_address_entry, write_gdbindex_1)
(write_debug_names): Update.
* dwarf2/index-common.h (byte_swap, MAYBE_SWAP): Remove.
gdb/ChangeLog
gdb/dwarf2/index-common.h
gdb/dwarf2/index-write.c
gdb/dwarf2/read.c