github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/cmd/objdump/main.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Objdump disassembles executable files. 6 // 7 // Usage: 8 // 9 // go tool objdump [-s symregexp] binary 10 // 11 // Objdump prints a disassembly of all text symbols (code) in the binary. 12 // If the -s option is present, objdump only disassembles 13 // symbols with names matching the regular expression. 14 // 15 // Alternate usage: 16 // 17 // go tool objdump binary start end 18 // 19 // In this mode, objdump disassembles the binary starting at the start address and 20 // stopping at the end address. The start and end addresses are program 21 // counters written in hexadecimal with optional leading 0x prefix. 22 // In this mode, objdump prints a sequence of stanzas of the form: 23 // 24 // file:line 25 // address: assembly 26 // address: assembly 27 // ... 28 // 29 // Each stanza gives the disassembly for a contiguous range of addresses 30 // all mapped to the same original source file and line number. 31 // This mode is intended for use by pprof. 32 package main 33 34 import ( 35 "flag" 36 "fmt" 37 "log" 38 "os" 39 "regexp" 40 "strconv" 41 "strings" 42 43 "cmd/internal/objfile" 44 ) 45 46 var printCode = flag.Bool("S", false, "print go code alongside assembly") 47 var symregexp = flag.String("s", "", "only dump symbols matching this regexp") 48 var symRE *regexp.Regexp 49 50 func usage() { 51 fmt.Fprintf(os.Stderr, "usage: go tool objdump [-S] [-s symregexp] binary [start end]\n\n") 52 flag.PrintDefaults() 53 os.Exit(2) 54 } 55 56 func main() { 57 log.SetFlags(0) 58 log.SetPrefix("objdump: ") 59 60 flag.Usage = usage 61 flag.Parse() 62 if flag.NArg() != 1 && flag.NArg() != 3 { 63 usage() 64 } 65 66 if *symregexp != "" { 67 re, err := regexp.Compile(*symregexp) 68 if err != nil { 69 log.Fatalf("invalid -s regexp: %v", err) 70 } 71 symRE = re 72 } 73 74 f, err := objfile.Open(flag.Arg(0)) 75 if err != nil { 76 log.Fatal(err) 77 } 78 79 dis, err := f.Disasm() 80 if err != nil { 81 log.Fatalf("disassemble %s: %v", flag.Arg(0), err) 82 } 83 84 switch flag.NArg() { 85 default: 86 usage() 87 case 1: 88 // disassembly of entire object 89 dis.Print(os.Stdout, symRE, 0, ^uint64(0), *printCode) 90 os.Exit(0) 91 92 case 3: 93 // disassembly of PC range 94 start, err := strconv.ParseUint(strings.TrimPrefix(flag.Arg(1), "0x"), 16, 64) 95 if err != nil { 96 log.Fatalf("invalid start PC: %v", err) 97 } 98 end, err := strconv.ParseUint(strings.TrimPrefix(flag.Arg(2), "0x"), 16, 64) 99 if err != nil { 100 log.Fatalf("invalid end PC: %v", err) 101 } 102 dis.Print(os.Stdout, symRE, start, end, *printCode) 103 os.Exit(0) 104 } 105 }