// SPDX-License-Identifier: MIT #include #include #include #include #include #include GDB_DECLARE_GPL_COMPATIBLE_READER; #define debugf(...) extern "C" { static enum gdb_status read_debug_info(struct gdb_reader_funcs* self, struct gdb_symbol_callbacks* cbs, void* memory, long memory_sz) { info_t* info = (info_t*)memory; blocks_t* blocks = (blocks_t*)(info->blocks_ofs + (long)memory); gdb_line_mapping* lines = (gdb_line_mapping*)(info->lines_ofs + (long)memory); debugf("info: %p\n", info); debugf("info: s %p\n", info->filename); debugf("info: s %s\n", info->filename); debugf("info: l %d\n", info->nlines); debugf("info: b %d\n", info->nblocks); struct gdb_object* object = cbs->object_open(cbs); struct gdb_symtab* symtab = cbs->symtab_open(cbs, object, info->filename); for (int i = 0; i < info->nblocks; i++) { debugf("info: %d\n", i); debugf("info: %lx\n", blocks[i].start); debugf("info: %lx\n", blocks[i].end); debugf("info: %s\n", blocks[i].name); cbs->block_open(cbs, symtab, NULL, blocks[i].start, blocks[i].end, blocks[i].name); } debugf("info: lines %d\n", info->nlines); debugf("info: lines %p\n", lines); for (int i = 0; i < info->nlines; i++) { debugf("info: line: %d\n", i); debugf("info: line pc: %lx\n", lines[i].pc); debugf("info: line file: %d\n", lines[i].line); } cbs->line_mapping_add(cbs, symtab, info->nlines, lines); // don't close here, symtab and object are cached cbs->symtab_close(cbs, symtab); cbs->object_close(cbs, object); return GDB_SUCCESS; } enum gdb_status unwind_frame(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs) { return GDB_SUCCESS; } struct gdb_frame_id get_frame_id(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs) { struct gdb_frame_id frame = {0x1234000, 0}; return frame; } void destroy_reader(struct gdb_reader_funcs* self) {} extern struct gdb_reader_funcs* gdb_init_reader(void) { static struct gdb_reader_funcs funcs = {GDB_READER_INTERFACE_VERSION, NULL, read_debug_info, unwind_frame, get_frame_id, destroy_reader}; return &funcs; } }