addr2line.c: Support DW_FORM_strx* forms
This commit is contained in:
parent
5234f99b76
commit
515f816b7f
Notes:
git
2022-12-22 15:32:55 +00:00
24
addr2line.c
24
addr2line.c
@ -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
|
||||
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);
|
||||
break;
|
||||
case DW_FORM_strx:
|
||||
set_uint_value(v, uleb128(&reader->p));
|
||||
set_cstr_value(v, resolve_strx(reader, uleb128(&reader->p)));
|
||||
break;
|
||||
case DW_FORM_addrx:
|
||||
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));
|
||||
break;
|
||||
case DW_FORM_strx1:
|
||||
set_uint_value(v, read_uint8(&reader->p));
|
||||
set_cstr_value(v, resolve_strx(reader, read_uint8(&reader->p)));
|
||||
break;
|
||||
case DW_FORM_strx2:
|
||||
set_uint_value(v, read_uint16(&reader->p));
|
||||
set_cstr_value(v, resolve_strx(reader, read_uint16(&reader->p)));
|
||||
break;
|
||||
case DW_FORM_strx3:
|
||||
set_uint_value(v, read_uint24(&reader->p));
|
||||
set_cstr_value(v, resolve_strx(reader, read_uint24(&reader->p)));
|
||||
break;
|
||||
case DW_FORM_strx4:
|
||||
set_uint_value(v, read_uint32(&reader->p));
|
||||
set_cstr_value(v, resolve_strx(reader, read_uint32(&reader->p)));
|
||||
break;
|
||||
case DW_FORM_addrx1:
|
||||
set_addr_idx_value(v, read_uint8(&reader->p));
|
||||
|
Loading…
x
Reference in New Issue
Block a user