| // Copyright 2012 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /* |
| * objdump simulation - only enough to make pprof work on Macs |
| */ |
| |
| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include <mach.h> |
| |
| void |
| usage(void) |
| { |
| fprint(2, "usage: objdump binary start stop\n"); |
| fprint(2, "Disassembles binary from PC start up to stop.\n"); |
| exits("usage"); |
| } |
| |
| void |
| main(int argc, char **argv) |
| { |
| int fd, n; |
| uvlong pc, start, stop; |
| Fhdr fhdr; |
| Biobuf bout; |
| char buf[1024]; |
| Map *text; |
| |
| ARGBEGIN{ |
| default: |
| usage(); |
| }ARGEND |
| |
| if(argc != 3) |
| usage(); |
| start = strtoull(argv[1], 0, 16); |
| stop = strtoull(argv[2], 0, 16); |
| |
| fd = open(argv[0], OREAD); |
| if(fd < 0) |
| sysfatal("open %s: %r", argv[0]); |
| if(crackhdr(fd, &fhdr) <= 0) |
| sysfatal("crackhdr: %r"); |
| machbytype(fhdr.type); |
| if(syminit(fd, &fhdr) <= 0) |
| sysfatal("syminit: %r"); |
| text = loadmap(nil, fd, &fhdr); |
| if(text == nil) |
| sysfatal("loadmap: %r"); |
| |
| Binit(&bout, 1, OWRITE); |
| for(pc=start; pc<stop; ) { |
| if(fileline(buf, sizeof buf, pc)) |
| Bprint(&bout, "%s\n", buf); |
| buf[0] = '\0'; |
| machdata->das(text, pc, 0, buf, sizeof buf); |
| Bprint(&bout, " %llx: %s\n", pc, buf); |
| n = machdata->instsize(text, pc); |
| if(n <= 0) |
| break; |
| pc += n; |
| } |
| Bflush(&bout); |
| exits(0); |
| } |