Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <mach.h>
5 #include "elf.h"
6 #include "stabs.h"
8 void
9 usage(void)
10 {
11 fprint(2, "usage: elf file list\n");
12 fprint(2, " elf file syms\n");
13 fprint(2, " elf file prog n\n");
14 fprint(2, " elf file sect n\n");
15 exits("usage");
16 }
18 void
19 main(int argc, char **argv)
20 {
21 int i, n, nn;
22 char buf[512];
23 ulong off, len;
24 Elf *elf;
25 ElfProg *p;
26 ElfSect *s;
28 ARGBEGIN{
29 default:
30 usage();
31 }ARGEND
33 if(argc < 2)
34 usage();
36 if((elf = elfopen(argv[0])) == nil)
37 sysfatal("elfopen %s: %r", argv[0]);
39 if(strcmp(argv[1], "syms") == 0){
40 ElfSym sym;
41 for(i=0; elfsym(elf, i, &sym) >= 0; i++){
42 print("%s 0x%lux +%lud bind %d type %d other %d shndx 0x%ux\n",
43 sym.name, (ulong)sym.value, (ulong)sym.size,
44 sym.bind, sym.type, sym.other, (uint)sym.shndx);
45 }
46 }
47 else if(strcmp(argv[1], "stabs") == 0){
48 ElfSect *s1, *s2;
49 Stab stabs;
50 StabSym sym;
52 if((s1 = elfsection(elf, ".stab")) == nil)
53 sysfatal("no stabs");
54 if(s1->link==0 || s1->link >= elf->nsect)
55 sysfatal("bad stabstr %d", s1->link);
56 s2 = &elf->sect[s1->link];
57 if(elfmap(elf, s1) < 0 || elfmap(elf, s2) < 0)
58 sysfatal("elfmap");
59 stabs.stabbase = s1->base;
60 stabs.stabsize = s1->size;
61 stabs.strbase = s2->base;
62 stabs.strsize = s2->size;
63 stabs.e2 = elf->hdr.e2;
64 stabs.e4 = elf->hdr.e4;
65 print("%ud %ud\n", stabs.stabsize, stabs.strsize);
66 for(i=0; stabsym(&stabs, i, &sym) >= 0; i++)
67 print("%s type 0x%x other %d desc %d value 0x%lux\n",
68 sym.name, sym.type, sym.other, (int)sym.desc, (ulong)sym.value);
69 fprint(2, "err at %d: %r\n", i);
70 }
71 else if(strcmp(argv[1], "list") == 0){
72 if(argc != 2)
73 usage();
74 print("elf %s %s v%d entry 0x%08lux phoff 0x%lux shoff 0x%lux flags 0x%lux\n",
75 elftype(elf->hdr.type), elfmachine(elf->hdr.machine),
76 elf->hdr.version, elf->hdr.entry, elf->hdr.phoff, elf->hdr.shoff,
77 elf->hdr.flags);
78 print("\tehsize %d phentsize %d phnum %d shentsize %d shnum %d shstrndx %d\n",
79 elf->hdr.ehsize, elf->hdr.phentsize, elf->hdr.phnum, elf->hdr.shentsize,
80 elf->hdr.shnum, elf->hdr.shstrndx);
81 for(i=0; i<elf->nprog; i++){
82 p = &elf->prog[i];
83 print("prog %d type %d offset 0x%08lux vaddr 0x%08lux paddr 0x%08lux filesz 0x%08lux memsz 0x%08lux flags 0x%08lux align 0x%08lux\n",
84 i, p->type, p->offset, p->vaddr, p->paddr,
85 p->filesz, p->memsz, p->flags, p->align);
86 }
87 for(i=0; i<elf->nsect; i++){
88 s = &elf->sect[i];
89 print("sect %d %s type %d flags 0x%lux addr 0x%08lux offset 0x%08lux size 0x%08lux link 0x%lux info 0x%lux align 0x%lux entsize 0x%lux\n",
90 i, s->name, s->type, s->flags, s->addr, s->offset, s->size, s->link, s->info,
91 s->align, s->entsize);
92 }
93 }
94 else if(strcmp(argv[1], "prog") == 0){
95 if(argc != 3)
96 usage();
97 i = atoi(argv[2]);
98 if(i < 0 || i >= elf->nprog)
99 sysfatal("bad prog number");
100 off = elf->prog[i].offset;
101 len = elf->prog[i].filesz;
102 fprint(2, "prog %d offset 0x%lux size 0x%lux\n", i, off, len);
103 copy:
104 seek(elf->fd, off, 0);
105 for(n=0; n<len; n+=nn){
106 nn = sizeof buf;
107 if(nn > len-n)
108 nn = len-n;
109 nn = read(elf->fd, buf, nn);
110 if(nn == 0)
111 break;
112 if(nn < 0)
113 sysfatal("read error");
114 write(1, buf, nn);
116 if(n < len)
117 fprint(2, "early eof\n");
119 else if(strcmp(argv[1], "sect") == 0){
120 if(argc != 3)
121 usage();
122 i = atoi(argv[2]);
123 if(i < 0 || i >= elf->nsect)
124 sysfatal("bad section number");
125 off = elf->sect[i].offset;
126 len = elf->sect[i].size;
127 fprint(2, "section %d offset 0x%lux size 0x%lux\n", i, off, len);
128 goto copy;
130 else
131 usage();
132 exits(0);