summaryrefslogtreecommitdiff
blob: 3e1406196e9bb73ab1c8e2ff3bc518eedfc6e2bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
add DWARF 4 support

https://bugs.gentoo.org/400663
https://bugzilla.redhat.com/show_bug.cgi?id=707677

--- debugedit-5.3.5/debugedit.c	2011-10-11 05:37:49.000000000 +0200
+++ debugedit-5.3.5/debugedit.c	2012-01-25 01:27:23.487999039 +0100
@@ -70,6 +70,10 @@
 #include <rpmtag.h>
 
 #define DW_TAG_partial_unit 0x3c
+#define DW_FORM_sec_offset 0x17
+#define DW_FORM_exprloc 0x18
+#define DW_FORM_flag_present 0x19
+#define DW_FORM_ref_sig8 0x20
 
 char *base_dir = NULL;
 char *dest_dir = NULL;
@@ -246,6 +250,7 @@
 #define DEBUG_STR	8
 #define DEBUG_FRAME	9
 #define DEBUG_RANGES	10
+#define DEBUG_TYPES	11
     { ".debug_info", NULL, NULL, 0, 0, 0 },
     { ".debug_abbrev", NULL, NULL, 0, 0, 0 },
     { ".debug_line", NULL, NULL, 0, 0, 0 },
@@ -257,6 +262,7 @@
     { ".debug_str", NULL, NULL, 0, 0, 0 },
     { ".debug_frame", NULL, NULL, 0, 0, 0 },
     { ".debug_ranges", NULL, NULL, 0, 0, 0 },
+    { ".debug_types", NULL, NULL, 0, 0, 0 },
     { NULL, NULL, NULL, 0, 0, 0 }
   };
 
@@ -349,7 +355,8 @@
 		goto no_memory;
 	    }
 	  form = read_uleb128 (ptr);
-	  if (form == 2 || form > DW_FORM_indirect)
+	  if (form == 2
+	      || (form > DW_FORM_flag_present && form != DW_FORM_ref_sig8))
 	    {
 	      error (0, 0, "%s: Unknown DWARF DW_FORM_%d", dso->filename, form);
 	      htab_delete (h);
@@ -378,7 +385,6 @@
 canonicalize_path (const char *s, char *d)
 {
   char *rv = d;
-  const char *sroot;
   char *droot;
 
   if (IS_DIR_SEPARATOR (*s))
@@ -394,7 +400,6 @@
 	s++;
     }
   droot = d;
-  sroot = s;
 
   while (*s)
     {
@@ -513,7 +518,7 @@
     }
 
   value = read_16 (ptr);
-  if (value != 2 && value != 3)
+  if (value != 2 && value != 3 && value != 4)
     {
       error (0, 0, "%s: DWARF version %d unhandled", dso->filename,
 	     value);
@@ -529,8 +534,8 @@
       return 1;
     }
   
-  opcode_base = ptr[4];
-  ptr = dir = ptr + 4 + opcode_base;
+  opcode_base = ptr[4 + (value >= 4)];
+  ptr = dir = ptr + 4 + (value >= 4) + opcode_base;
   
   /* dir table: */
   value = 1;
@@ -758,7 +763,8 @@
 	{
 	  if (t->attr[i].attr == DW_AT_stmt_list)
 	    {
-	      if (form == DW_FORM_data4)
+	      if (form == DW_FORM_data4
+		  || form == DW_FORM_sec_offset)
 		{
 		  list_offs = do_read_32_relocated (ptr);
 		  found_list_offs = 1;
@@ -864,6 +870,8 @@
 	      else
 		ptr += 4;
 	      break;
+	    case DW_FORM_flag_present:
+	      break;
 	    case DW_FORM_addr:
 	      ptr += ptr_size;
 	      break;
@@ -878,10 +886,12 @@
 	      break;
 	    case DW_FORM_ref4:
 	    case DW_FORM_data4:
+	    case DW_FORM_sec_offset:
 	      ptr += 4;
 	      break;
 	    case DW_FORM_ref8:
 	    case DW_FORM_data8:
+	    case DW_FORM_ref_sig8:
 	      ptr += 8;
 	      break;
 	    case DW_FORM_sdata:
@@ -910,6 +920,7 @@
 	      form = DW_FORM_block1;
 	      break;
 	    case DW_FORM_block:
+	    case DW_FORM_exprloc:
 	      len = read_uleb128 (ptr);
 	      form = DW_FORM_block1;
 	      assert (len < UINT_MAX);
@@ -1213,7 +1224,7 @@
 		}
 	      
 	      cu_version = read_16 (ptr);
-	      if (cu_version != 2 && cu_version != 3)
+	      if (cu_version != 2 && cu_version != 3 && cu_version != 4)
 		{
 		  error (0, 0, "%s: DWARF version %d unhandled", dso->filename,
 			 cu_version);