...
Source file src/cmd/objdump/main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 defer f.Close()
79
80 dis, err := f.Disasm()
81 if err != nil {
82 log.Fatalf("disassemble %s: %v", flag.Arg(0), err)
83 }
84
85 switch flag.NArg() {
86 default:
87 usage()
88 case 1:
89
90 dis.Print(os.Stdout, symRE, 0, ^uint64(0), *printCode)
91
92 case 3:
93
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 }
104 }
105
View as plain text