blob: 728944f42a94e33c9f364817c1c28393ea87046e [file] [log] [blame]
rsca84cbb22004-04-19 19:29:25 +00001#include <u.h>
2#include <libc.h>
3#include <bio.h>
4#include "elf.h"
5#include "dwarf.h"
6
7static int
8readblock(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}
21
22static int
23findsection(Elf *elf, char *name, ulong *off, ulong *len)
24{
25 ElfSect *s;
26
27 if((s = elfsection(elf, name)) == nil)
28 return -1;
29 *off = s->offset;
30 *len = s->size;
31 return s - elf->sect;
32}
33
34static int
35loadsection(Elf *elf, char *name, DwarfBlock *b)
36{
37 ulong off, len;
38
39 if(findsection(elf, name, &off, &len) < 0)
40 return -1;
41 return readblock(elf->fd, b, off, len);
42}
43
44Dwarf*
45dwarfopen(Elf *elf)
46{
47 Dwarf *d;
48
49 if(elf == nil){
50 werrstr("nil elf passed to dwarfopen");
51 return nil;
52 }
53
54 d = mallocz(sizeof(Dwarf), 1);
55 if(d == nil)
56 return nil;
57
58 d->elf = elf;
59 if(loadsection(elf, ".debug_abbrev", &d->abbrev) < 0
60 || loadsection(elf, ".debug_aranges", &d->aranges) < 0
rsca84cbb22004-04-19 19:29:25 +000061 || loadsection(elf, ".debug_line", &d->line) < 0
62 || loadsection(elf, ".debug_pubnames", &d->pubnames) < 0
rsca84cbb22004-04-19 19:29:25 +000063 || loadsection(elf, ".debug_info", &d->info) < 0)
64 goto err;
rscebd39542004-04-20 05:43:05 +000065 loadsection(elf, ".debug_frame", &d->frame);
66 loadsection(elf, ".debug_ranges", &d->ranges);
67 loadsection(elf, ".debug_str", &d->str);
rsca84cbb22004-04-19 19:29:25 +000068
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 }
79
80 return d;
81
82err:
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}
94
95void
96dwarfclose(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);
107}