addr2line.c: Support DW_FORM_strx* forms

This commit is contained in:
Yusuke Endoh 2022-12-22 22:34:34 +09:00
parent 5234f99b76
commit 515f816b7f
Notes: git 2022-12-22 15:32:55 +00:00

View File

@ -1124,6 +1124,20 @@ get_cstr_value(DebugInfoValue *v)
} }
} }
static const char *
resolve_strx(DebugInfoReader *reader, uint64_t idx)
{
const char *p = reader->obj->debug_str_offsets.ptr + reader->current_str_offsets_base;
uint64_t off;
if (reader->format == 4) {
off = ((uint32_t *)p)[idx];
}
else {
off = ((uint64_t *)p)[idx];
}
return reader->obj->debug_str.ptr + off;
}
static void static void
debug_info_reader_read_value(DebugInfoReader *reader, uint64_t form, DebugInfoValue *v) debug_info_reader_read_value(DebugInfoReader *reader, uint64_t form, DebugInfoValue *v)
{ {
@ -1236,7 +1250,7 @@ debug_info_reader_read_value(DebugInfoReader *reader, uint64_t form, DebugInfoVa
set_uint_value(v, 1); set_uint_value(v, 1);
break; break;
case DW_FORM_strx: case DW_FORM_strx:
set_uint_value(v, uleb128(&reader->p)); set_cstr_value(v, resolve_strx(reader, uleb128(&reader->p)));
break; break;
case DW_FORM_addrx: case DW_FORM_addrx:
set_addr_idx_value(v, uleb128(&reader->p)); set_addr_idx_value(v, uleb128(&reader->p));
@ -1272,16 +1286,16 @@ debug_info_reader_read_value(DebugInfoReader *reader, uint64_t form, DebugInfoVa
set_uint_value(v, read_uint64(&reader->p)); set_uint_value(v, read_uint64(&reader->p));
break; break;
case DW_FORM_strx1: case DW_FORM_strx1:
set_uint_value(v, read_uint8(&reader->p)); set_cstr_value(v, resolve_strx(reader, read_uint8(&reader->p)));
break; break;
case DW_FORM_strx2: case DW_FORM_strx2:
set_uint_value(v, read_uint16(&reader->p)); set_cstr_value(v, resolve_strx(reader, read_uint16(&reader->p)));
break; break;
case DW_FORM_strx3: case DW_FORM_strx3:
set_uint_value(v, read_uint24(&reader->p)); set_cstr_value(v, resolve_strx(reader, read_uint24(&reader->p)));
break; break;
case DW_FORM_strx4: case DW_FORM_strx4:
set_uint_value(v, read_uint32(&reader->p)); set_cstr_value(v, resolve_strx(reader, read_uint32(&reader->p)));
break; break;
case DW_FORM_addrx1: case DW_FORM_addrx1:
set_addr_idx_value(v, read_uint8(&reader->p)); set_addr_idx_value(v, read_uint8(&reader->p));