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");
19 main(int argc, char **argv)
36 if((elf = elfopen(argv[0])) == nil)
37 sysfatal("elfopen %s: %r", argv[0]);
39 if(strcmp(argv[1], "syms") == 0){
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);
47 else if(strcmp(argv[1], "stabs") == 0){
52 if((s1 = elfsection(elf, ".stab")) == nil)
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)
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);
71 else if(strcmp(argv[1], "list") == 0){
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,
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++){
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);
87 for(i=0; i<elf->nsect; 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);
94 else if(strcmp(argv[1], "prog") == 0){
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);
104 seek(elf->fd, off, 0);
105 for(n=0; n<len; n+=nn){
109 nn = read(elf->fd, buf, nn);
113 sysfatal("read error");
117 fprint(2, "early eof\n");
119 else if(strcmp(argv[1], "sect") == 0){
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);