diff options
Diffstat (limited to 'src/format/dwarf')
-rw-r--r-- | src/format/dwarf/abbrev.c | 28 | ||||
-rw-r--r-- | src/format/dwarf/info.c | 57 |
2 files changed, 61 insertions, 24 deletions
diff --git a/src/format/dwarf/abbrev.c b/src/format/dwarf/abbrev.c index a9fee2c..ba6cfb0 100644 --- a/src/format/dwarf/abbrev.c +++ b/src/format/dwarf/abbrev.c @@ -397,11 +397,13 @@ bool _read_dwarf_abbrev_attribute(dwarf_format *format, off_t *pos, DwarfForm fo uint16_t *val16; /* Données sur 16 bits */ uint32_t *val32; /* Données sur 32 bits */ uint64_t *val64; /* Données sur 64 bits */ + uint64_t *sval64; /* Données sur 64 bits (signée)*/ bool *boolval; /* Valeur booléenne */ uint8_t tmp8; /* Données sur 8 bits */ uint16_t tmp16; /* Données sur 16 bits */ uint32_t tmp32; /* Données sur 32 bits */ uint64_t tmp64; /* Données sur 64 bits */ + uint64_t stmp64; /* Données sur 64 bits (signée)*/ uint64_t size_to_read; /* Nombre d'octets à lire */ off_t offset; /* Décallage dans une zone */ char **strval; /* Chaîne de caractères */ @@ -420,8 +422,7 @@ bool _read_dwarf_abbrev_attribute(dwarf_format *format, off_t *pos, DwarfForm fo { if (format->format == DWF_32_BITS) { - tmp32 = *((uint32_t *)&DBG_FORMAT(format)->content[*pos]); - //memcpy(&tmp32, &DBG_FORMAT(format)->content[*pos], 4); + memcpy(&tmp32, &DBG_FORMAT(format)->content[*pos], 4); *val64 = tmp32; } else memcpy(val64, &DBG_FORMAT(format)->content[*pos], 8); @@ -571,13 +572,11 @@ bool _read_dwarf_abbrev_attribute(dwarf_format *format, off_t *pos, DwarfForm fo break; case DWF_SDATA: - result = ((*pos + 4) <= DBG_FORMAT(format)->length); - - printf("bad\n"); exit(0); - + sval64 = va_arg(ap, int64_t *); + if (sval64 == NULL) sval64 = &stmp64; + result = read_uleb128(format, pos, sval64, true); break; - case DWF_STRP: result = read_abbrev_offset(format, pos, &offset); if (result) @@ -594,19 +593,16 @@ bool _read_dwarf_abbrev_attribute(dwarf_format *format, off_t *pos, DwarfForm fo } break; - case DWF_UDATA: - result = ((*pos + 4) <= DBG_FORMAT(format)->length); - - printf("bad\n"); exit(0); - + val64 = va_arg(ap, uint64_t *); + if (val64 == NULL) val64 = &tmp64; + result = read_uleb128(format, pos, val64, true); break; - case DWF_REF_ADDR: result = ((*pos + 4) <= DBG_FORMAT(format)->length); - printf("bad\n"); exit(0); + printf("bad at %d\n", __LINE__); exit(0); break; @@ -654,7 +650,7 @@ bool _read_dwarf_abbrev_attribute(dwarf_format *format, off_t *pos, DwarfForm fo case DWF_REF_UDATA: result = ((*pos + 4) <= DBG_FORMAT(format)->length); - printf("bad\n"); exit(0); + printf("bad at %d\n", __LINE__); exit(0); break; @@ -662,7 +658,7 @@ bool _read_dwarf_abbrev_attribute(dwarf_format *format, off_t *pos, DwarfForm fo case DWF_INDIRECT: result = ((*pos + 4) <= DBG_FORMAT(format)->length); - printf("bad\n"); exit(0); + printf("bad at %d\n", __LINE__); exit(0); break; diff --git a/src/format/dwarf/info.c b/src/format/dwarf/info.c index 30d2391..a45b556 100644 --- a/src/format/dwarf/info.c +++ b/src/format/dwarf/info.c @@ -558,7 +558,7 @@ bool look_for_dwarf_subprograms(dwarf_format *format, off_t *pos, const compil_u } - exit_loop: + exit_loop: proto_len += 1; prototype = (char *)realloc(prototype, (proto_len + 1) * sizeof(char)); @@ -584,10 +584,6 @@ bool look_for_dwarf_subprograms(dwarf_format *format, off_t *pos, const compil_u printf("error skipping :(\n"); - printf(" == progress %d\n", *pos - oldpos); - printf(" == %d < %d\n", *pos, cu->endpos); - - } @@ -634,11 +630,25 @@ char *resolve_dwarf_function_type(dwarf_format *format, const dw_abbrev *abbrev, switch (abbrev->tag) { - case DWT_BASE_TYPE: + /* 0x04 */ + case DWT_ENUMERATION_TYPE: + oldpos = *pos; - read_dwarf_abbrev_attribute(format, &oldpos, true, abbrev, DWA_NAME, &result); + read_dwarf_abbrev_attribute(format, &oldpos, true /* ??? */, abbrev, DWA_NAME, &result); + + if (result != NULL) + { + len = strlen(result); + + result = (char *)realloc(result, (strlen("enum ") + len + 1) * sizeof(char)); + memmove(&result[strlen("enum ")], result, len); + memcpy(result, "enum ", strlen("enum ")); + + } + break; + /* 0x0f */ case DWT_POINTER_TYPE: if (read_dwarf_abbrev_attribute(format, &oldpos, true, abbrev, DWA_TYPE, &type_pos)) @@ -675,6 +685,37 @@ char *resolve_dwarf_function_type(dwarf_format *format, const dw_abbrev *abbrev, break; + /* 0x13 */ + case DWT_STRUCTURE_TYPE: + + oldpos = *pos; + read_dwarf_abbrev_attribute(format, &oldpos, true /* ??? */, abbrev, DWA_NAME, &result); + + if (result != NULL) + { + len = strlen(result); + + result = (char *)realloc(result, (strlen("struct ") + len + 1) * sizeof(char)); + memmove(&result[strlen("struct ")], result, len); + memcpy(result, "struct ", strlen("struct ")); + + } + + break; + + /* 0x16 */ + case DWT_TYPEDEF: + oldpos = *pos; + read_dwarf_abbrev_attribute(format, &oldpos, true /* ??? */, abbrev, DWA_NAME, &result); + break; + + /* 0x24 */ + case DWT_BASE_TYPE: + oldpos = *pos; + read_dwarf_abbrev_attribute(format, &oldpos, true /* ??? */, abbrev, DWA_NAME, &result); + break; + + /* 0x26 */ case DWT_CONST_TYPE: @@ -702,7 +743,7 @@ char *resolve_dwarf_function_type(dwarf_format *format, const dw_abbrev *abbrev, { len = strlen(result); - result = (char *)realloc(result, (len + strlen("const ") + 1) * sizeof(char)); + result = (char *)realloc(result, (strlen("const ") + len + 1) * sizeof(char)); memmove(&result[strlen("const ")], result, len); memcpy(result, "const ", strlen("const ")); |