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