gdb/jit: fix jit-reader linetable integrity

The custom linetable functionality in GDB's JIT Interface has been broken
since commit 1acc9dca42.

In that commit, linetables were made independent from the objfile, which
requires objfile->section_offsets to be initialized. However, section_offsets
were never initialized in objfiles generated by GDB's JIT Interface
with custom jit-readers, leading to GDB crashes when stepping into JITed code
blocks with the following command already executed:

  jit-reader-load libmygdbjitreader.so

This patch fixes the issue by initializing the minimum section_offsets required
for linetable parsing procedures.

A minimal test is included.  The test sets up some very simple line
table information, which is enough to trigger the bug.  However, the
line table information is crafted such that none of the line table
entries will end up being displayed in GDB's output when the test is
run, as such, none of the expected output actually changes.

It might be nice in the future to extend some of the jit tests to
actually test hitting line table entries added via the jit reader.

Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Yang Liu 2024-12-23 00:33:30 +08:00 committed by Andrew Burgess
parent 39c219c58c
commit d3685ec080
2 changed files with 14 additions and 0 deletions

View file

@ -665,6 +665,8 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb,
objfile *objfile = objfile::make (nullptr, current_program_space,
objfile_name.c_str (), OBJF_NOT_FILENAME);
objfile->section_offsets.push_back (0);
objfile->sect_index_text = 0;
objfile->per_bfd->gdbarch = priv_data->gdbarch;
for (gdb_symtab &symtab : obj->symtabs)

View file

@ -62,6 +62,18 @@ read_debug_info (struct gdb_reader_funcs *self,
(GDB_CORE_ADDR) symfile->function_stack_mangle.end,
"jit_function_stack_mangle");
/* Add some line table information. This ensures that GDB can handle
accepting this information, and can scan the table. However, this
information is constructed such that none of the tests actually hit any
of these line entries. */
struct gdb_line_mapping mangle_lines[] =
{
{ 1, (GDB_CORE_ADDR) symfile->function_stack_mangle.begin + 0 },
{ 0, (GDB_CORE_ADDR) symfile->function_stack_mangle.begin + 1 },
};
int mangle_nlines = sizeof (mangle_lines) / sizeof (mangle_lines[0]);
cbs->line_mapping_add (cbs, symtab, mangle_nlines, mangle_lines);
cbs->block_open (cbs, symtab, NULL,
(GDB_CORE_ADDR) symfile->function_add.begin,
(GDB_CORE_ADDR) symfile->function_add.end,