Blame


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