Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "elf.h"
5 #include "dwarf.h"
7 static int
8 readblock(int fd, DwarfBlock *b, ulong off, ulong len)
9 {
10 b->data = malloc(len);
11 if(b->data == nil)
12 return -1;
13 if(seek(fd, off, 0) < 0 || readn(fd, b->data, len) != len){
14 free(b->data);
15 b->data = nil;
16 return -1;
17 }
18 b->len = len;
19 return 0;
20 }
22 static int
23 findsection(Elf *elf, char *name, ulong *off, ulong *len)
24 {
25 ElfSect *s;
27 if((s = elfsection(elf, name)) == nil)
28 return -1;
29 *off = s->offset;
30 *len = s->size;
31 return s - elf->sect;
32 }
34 static int
35 loadsection(Elf *elf, char *name, DwarfBlock *b)
36 {
37 ulong off, len;
39 if(findsection(elf, name, &off, &len) < 0)
40 return -1;
41 return readblock(elf->fd, b, off, len);
42 }
44 Dwarf*
45 dwarfopen(Elf *elf)
46 {
47 Dwarf *d;
49 if(elf == nil){
50 werrstr("nil elf passed to dwarfopen");
51 return nil;
52 }
54 d = mallocz(sizeof(Dwarf), 1);
55 if(d == nil)
56 return nil;
58 d->elf = elf;
59 if(loadsection(elf, ".debug_abbrev", &d->abbrev) < 0
60 || loadsection(elf, ".debug_aranges", &d->aranges) < 0
61 || loadsection(elf, ".debug_line", &d->line) < 0
62 || loadsection(elf, ".debug_pubnames", &d->pubnames) < 0
63 || loadsection(elf, ".debug_info", &d->info) < 0)
64 goto err;
65 loadsection(elf, ".debug_frame", &d->frame);
66 loadsection(elf, ".debug_ranges", &d->ranges);
67 loadsection(elf, ".debug_str", &d->str);
69 /* make this a table once there are more */
70 switch(d->elf->hdr.machine){
71 case ElfMach386:
72 d->reg = dwarf386regs;
73 d->nreg = dwarf386nregs;
74 break;
75 default:
76 werrstr("unsupported machine");
77 goto err;
78 }
80 return d;
82 err:
83 free(d->abbrev.data);
84 free(d->aranges.data);
85 free(d->frame.data);
86 free(d->line.data);
87 free(d->pubnames.data);
88 free(d->ranges.data);
89 free(d->str.data);
90 free(d->info.data);
91 free(d);
92 return nil;
93 }
95 void
96 dwarfclose(Dwarf *d)
97 {
98 free(d->abbrev.data);
99 free(d->aranges.data);
100 free(d->frame.data);
101 free(d->line.data);
102 free(d->pubnames.data);
103 free(d->ranges.data);
104 free(d->str.data);
105 free(d->info.data);
106 free(d);