summaryrefslogtreecommitdiff
path: root/src/format/dwarf
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/dwarf')
-rw-r--r--src/format/dwarf/abbrev.c28
-rw-r--r--src/format/dwarf/info.c57
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 "));