* Sync the recent cmake branch changes.
[reactos.git] / lib / rossym / dwarfopen.c
1 #define NTOSAPI
2 #include <ntddk.h>
3 #include <reactos/rossym.h>
4 #include "rossympriv.h"
5 #include <ntimage.h>
6
7 #define NDEBUG
8 #include <debug.h>
9
10 #include "dwarf.h"
11 #include "pe.h"
12
13 /* Adapted for PE */
14
15 Dwarf*
16 dwarfopen(Pe *pe)
17 {
18 Dwarf *d;
19
20 if(pe == nil){
21 werrstr("nil pe passed to dwarfopen");
22 return nil;
23 }
24
25 d = mallocz(sizeof(Dwarf), 1);
26 if(d == nil)
27 return nil;
28
29 d->pe = pe;
30 if(pe->loadsection(pe, ".debug_abbrev", &d->abbrev) < 0
31 || pe->loadsection(pe, ".debug_aranges", &d->aranges) < 0
32 || pe->loadsection(pe, ".debug_line", &d->line) < 0
33 || pe->loadsection(pe, ".debug_pubnames", &d->pubnames) < 0
34 || pe->loadsection(pe, ".debug_info", &d->info) < 0
35 || pe->loadsection(pe, ".debug_loc", &d->loc) < 0)
36 goto err;
37 pe->loadsection(pe, ".debug_frame", &d->frame);
38 pe->loadsection(pe, ".debug_ranges", &d->ranges);
39 pe->loadsection(pe, ".debug_str", &d->str);
40
41 return d;
42
43 err:
44 DPRINT("Failed to open dwarf\n");
45 free(d->abbrev.data);
46 free(d->aranges.data);
47 free(d->frame.data);
48 free(d->line.data);
49 free(d->pubnames.data);
50 free(d->ranges.data);
51 free(d->str.data);
52 free(d->info.data);
53 free(d->loc.data);
54 free(d);
55 return nil;
56 }
57
58 void
59 dwarfclose(Dwarf *d)
60 {
61 free(d->abbrev.data);
62 free(d->aranges.data);
63 free(d->frame.data);
64 free(d->line.data);
65 free(d->pubnames.data);
66 free(d->ranges.data);
67 free(d->str.data);
68 free(d->info.data);
69 pefree(d->pe);
70 free(d);
71 }
72