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 <mach.h>
4 a84cbb2a 2004-04-19 devnull #include "stabs.h"
5 a84cbb2a 2004-04-19 devnull #include "macho.h"
6 a84cbb2a 2004-04-19 devnull
7 a84cbb2a 2004-04-19 devnull void
8 a84cbb2a 2004-04-19 devnull usage(void)
9 a84cbb2a 2004-04-19 devnull {
10 a84cbb2a 2004-04-19 devnull fprint(2, "usage: machodump file list\n");
11 a84cbb2a 2004-04-19 devnull fprint(2, " machodump file stabs\n");
12 a84cbb2a 2004-04-19 devnull exits("usage");
13 a84cbb2a 2004-04-19 devnull }
14 a84cbb2a 2004-04-19 devnull
15 a84cbb2a 2004-04-19 devnull uchar*
16 a84cbb2a 2004-04-19 devnull load(int fd, ulong off, int size)
17 a84cbb2a 2004-04-19 devnull {
18 a84cbb2a 2004-04-19 devnull uchar *a;
19 a84cbb2a 2004-04-19 devnull
20 a84cbb2a 2004-04-19 devnull a = malloc(size);
21 a84cbb2a 2004-04-19 devnull print("malloc %d -> %p\n", size, a);
22 a84cbb2a 2004-04-19 devnull if(a == nil)
23 a84cbb2a 2004-04-19 devnull sysfatal("malloc: %r");
24 a84cbb2a 2004-04-19 devnull if(seek(fd, off, 0) < 0)
25 a84cbb2a 2004-04-19 devnull sysfatal("seek %lud: %r", off);
26 a84cbb2a 2004-04-19 devnull if(readn(fd, a, size) != size)
27 a84cbb2a 2004-04-19 devnull sysfatal("readn: %r");
28 a84cbb2a 2004-04-19 devnull return a;
29 a84cbb2a 2004-04-19 devnull }
30 a84cbb2a 2004-04-19 devnull
31 a84cbb2a 2004-04-19 devnull void
32 a84cbb2a 2004-04-19 devnull main(int argc, char **argv)
33 a84cbb2a 2004-04-19 devnull {
34 a84cbb2a 2004-04-19 devnull int i;
35 a84cbb2a 2004-04-19 devnull Macho *m;
36 a84cbb2a 2004-04-19 devnull
37 a84cbb2a 2004-04-19 devnull ARGBEGIN{
38 a84cbb2a 2004-04-19 devnull default:
39 a84cbb2a 2004-04-19 devnull usage();
40 a84cbb2a 2004-04-19 devnull }ARGEND
41 a84cbb2a 2004-04-19 devnull
42 a84cbb2a 2004-04-19 devnull if(argc < 2)
43 a84cbb2a 2004-04-19 devnull usage();
44 a84cbb2a 2004-04-19 devnull
45 a84cbb2a 2004-04-19 devnull if((m = machoopen(argv[0])) == nil)
46 a84cbb2a 2004-04-19 devnull sysfatal("machoopen %s: %r", argv[0]);
47 a84cbb2a 2004-04-19 devnull
48 a84cbb2a 2004-04-19 devnull if(strcmp(argv[1], "stabs") == 0){
49 a84cbb2a 2004-04-19 devnull Stab stabs;
50 a84cbb2a 2004-04-19 devnull StabSym sym;
51 a84cbb2a 2004-04-19 devnull
52 a84cbb2a 2004-04-19 devnull for(i=0; i<m->ncmd; i++){
53 a84cbb2a 2004-04-19 devnull if(m->cmd[i].type == MachoCmdSymtab){
54 a84cbb2a 2004-04-19 devnull stabs.stabbase = load(m->fd, m->cmd[i].sym.symoff, m->cmd[i].sym.nsyms*16);
55 a84cbb2a 2004-04-19 devnull stabs.stabsize = m->cmd[i].sym.nsyms*16;
56 a84cbb2a 2004-04-19 devnull stabs.strbase = load(m->fd, m->cmd[i].sym.stroff, m->cmd[i].sym.strsize);
57 a84cbb2a 2004-04-19 devnull stabs.strsize = m->cmd[i].sym.strsize;
58 a84cbb2a 2004-04-19 devnull stabs.e4 = m->e4;
59 a84cbb2a 2004-04-19 devnull stabs.e2 = (m->e4 == beload4 ? beload2 : leload2);
60 a84cbb2a 2004-04-19 devnull print("cmd%d: %p %ud %p %ud\n", i, stabs.stabbase, stabs.stabsize, stabs.strbase, stabs.strsize);
61 a84cbb2a 2004-04-19 devnull for(i=0; stabsym(&stabs, i, &sym) >= 0; i++)
62 a84cbb2a 2004-04-19 devnull print("%s type 0x%x other %d desc %d value 0x%lux\n",
63 a84cbb2a 2004-04-19 devnull sym.name, sym.type, sym.other, (int)sym.desc, (ulong)sym.value);
64 a84cbb2a 2004-04-19 devnull print("err at %d: %r\n", i);
65 a84cbb2a 2004-04-19 devnull }
66 a84cbb2a 2004-04-19 devnull }
67 a84cbb2a 2004-04-19 devnull }
68 a84cbb2a 2004-04-19 devnull else if(strcmp(argv[1], "list") == 0){
69 a84cbb2a 2004-04-19 devnull print("macho cpu %ud sub %ud filetype %lud flags %lud\n",
70 a84cbb2a 2004-04-19 devnull m->cputype, m->subcputype, m->filetype, m->flags);
71 a84cbb2a 2004-04-19 devnull for(i=0; i<m->ncmd; i++){
72 a84cbb2a 2004-04-19 devnull switch(m->cmd[i].type){
73 a84cbb2a 2004-04-19 devnull case MachoCmdSymtab:
74 a84cbb2a 2004-04-19 devnull print("cmd%d: symtab %lud+%lud %lud+%lud\n", i,
75 a84cbb2a 2004-04-19 devnull m->cmd[i].sym.symoff, m->cmd[i].sym.nsyms,
76 a84cbb2a 2004-04-19 devnull m->cmd[i].sym.stroff, m->cmd[i].sym.strsize);
77 a84cbb2a 2004-04-19 devnull break;
78 a84cbb2a 2004-04-19 devnull case MachoCmdSegment:
79 a84cbb2a 2004-04-19 devnull print("cmd%d: segment %s vm 0x%lux+0x%lux file 0x%lux+0x%lux prot 0x%lux/0x%lux ns %d flags 0x%lux\n", i,
80 a84cbb2a 2004-04-19 devnull m->cmd[i].seg.name, m->cmd[i].seg.vmaddr, m->cmd[i].seg.vmsize,
81 a84cbb2a 2004-04-19 devnull m->cmd[i].seg.fileoff, m->cmd[i].seg.filesz, m->cmd[i].seg.maxprot,
82 a84cbb2a 2004-04-19 devnull m->cmd[i].seg.initprot, m->cmd[i].seg.nsect, m->cmd[i].seg.flags);
83 a84cbb2a 2004-04-19 devnull break;
84 a84cbb2a 2004-04-19 devnull default:
85 a84cbb2a 2004-04-19 devnull print("cmd%d: type %d offset %lud\n", i, m->cmd[i].type, m->cmd[i].off);
86 a84cbb2a 2004-04-19 devnull break;
87 a84cbb2a 2004-04-19 devnull }
88 a84cbb2a 2004-04-19 devnull }
89 a84cbb2a 2004-04-19 devnull }
90 a84cbb2a 2004-04-19 devnull else
91 a84cbb2a 2004-04-19 devnull usage();
92 a84cbb2a 2004-04-19 devnull exits(0);
93 a84cbb2a 2004-04-19 devnull }