diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2008-09-11 22:35:15 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2008-09-11 22:35:15 -0400 |
commit | 50bc37446af59db2a4238551c3fa34fe4f0012a7 (patch) | |
tree | 7c0cdab740139b4dfe0b04dabf025fb0533db7fc | |
parent | 85696715849de7ab98e669664251e7f22cf7983f (diff) |
show_asm: add doc & license
-rwxr-xr-x | show_asm | 60 |
1 files changed, 54 insertions, 6 deletions
@@ -1,8 +1,53 @@ | |||
1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python |
2 | # | ||
3 | # Copyright (c) 2008, Bjoern B. Brandenburg <bbb [at] cs.unc.edu> | ||
4 | # | ||
5 | # All rights reserved. | ||
6 | # | ||
7 | # Redistribution and use in source and binary forms, with or without | ||
8 | # modification, are permitted provided that the following conditions are met: | ||
9 | # * Redistributions of source code must retain the above copyright | ||
10 | # notice, this list of conditions and the following disclaimer. | ||
11 | # * Redistributions in binary form must reproduce the above copyright | ||
12 | # notice, this list of conditions and the following disclaimer in the | ||
13 | # documentation and/or other materials provided with the distribution. | ||
14 | # * Neither the name of the copyright holder nor the | ||
15 | # names of its contributors may be used to endorse or promote products | ||
16 | # derived from this software without specific prior written permission. | ||
17 | # | ||
18 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
19 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
20 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
21 | # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||
22 | # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
23 | # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
24 | # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
25 | # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
26 | # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
27 | # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
28 | # POSSIBILITY OF SUCH DAMAGE. | ||
29 | # | ||
30 | |||
31 | """ | ||
32 | Purpose: This tool displays the assembly code of all symbols matching a given | ||
33 | pattern in a given set of files. It is a quick&dirty wrapper around | ||
34 | the nm(1) and objdump(1) tools. Its main advantage is that it does not | ||
35 | require you to find out the addresses of a given set of symbols | ||
36 | manually. Also, it's considerably faster than just disassembling the | ||
37 | whole Linux kernel on slow systems. | ||
38 | |||
39 | Example: show_asm printk vmlinux | ||
40 | Disassemble printk-related functions in the Linux kernel. | ||
41 | |||
42 | show_asm 'main|foo|bar' *.o | ||
43 | Disassemble all main, foo, and bar | ||
44 | functions in all object files in the current directory. | ||
45 | """ | ||
2 | 46 | ||
3 | from subprocess import Popen, PIPE, call | 47 | from subprocess import Popen, PIPE, call |
4 | import re | 48 | import re |
5 | import sys | 49 | import sys |
50 | import os | ||
6 | 51 | ||
7 | NM_FORMAT = "([0-9a-f]+) *([0-9a-f]*) *([AaBbCcDdGgIiNnRrSsTtUuVvWw])" + \ | 52 | NM_FORMAT = "([0-9a-f]+) *([0-9a-f]*) *([AaBbCcDdGgIiNnRrSsTtUuVvWw])" + \ |
8 | " ([_a-zA-Z.0-9]+)" | 53 | " ([_a-zA-Z.0-9]+)" |
@@ -31,7 +76,7 @@ def nm(file): | |||
31 | return p.stdout | 76 | return p.stdout |
32 | 77 | ||
33 | def nm_filtered(file, symbol): | 78 | def nm_filtered(file, symbol): |
34 | cmd = "nm -S %s | egrep %s " % (file, symbol) | 79 | cmd = "nm -S %s | egrep '%s' " % (file, symbol) |
35 | p = Popen(cmd, shell=True, stdout=PIPE) | 80 | p = Popen(cmd, shell=True, stdout=PIPE) |
36 | return p.stdout | 81 | return p.stdout |
37 | 82 | ||
@@ -40,8 +85,8 @@ def objdump_symbol(file, addr): | |||
40 | % (addr[0], addr[0] + addr[1], file) | 85 | % (addr[0], addr[0] + addr[1], file) |
41 | filter_cmd = "egrep -v 'Disassembly of|file format|^$'" | 86 | filter_cmd = "egrep -v 'Disassembly of|file format|^$'" |
42 | pipe_cmd = "%s | %s" % (objdump_cmd, filter_cmd) | 87 | pipe_cmd = "%s | %s" % (objdump_cmd, filter_cmd) |
43 | print "=====[ %s (0x%x - 0x%x, type: %s) ]=====" % \ | 88 | print "=====[ %s:%s (0x%x - 0x%x, type: %s) ]=====" % \ |
44 | (addr[3], addr[0], addr[0] + addr[1], addr[2]) | 89 | (file, addr[3], addr[0], addr[0] + addr[1], addr[2]) |
45 | sys.stdout.flush() | 90 | sys.stdout.flush() |
46 | call(pipe_cmd, shell=True) | 91 | call(pipe_cmd, shell=True) |
47 | 92 | ||
@@ -53,7 +98,10 @@ def get_address_ranges(file, symbol): | |||
53 | objdump_symbol(file, addr) | 98 | objdump_symbol(file, addr) |
54 | 99 | ||
55 | if __name__ == "__main__": | 100 | if __name__ == "__main__": |
56 | if len(sys.argv) != 2: | 101 | if len(sys.argv) < 3: |
57 | print "Usage: %s <symbol pattern>" % sys.argv[0] | 102 | name = os.path.basename(sys.argv[0]) |
103 | print "Usage..: %s <symbol pattern> <object file>+" % name | ||
104 | print __doc__ | ||
58 | else: | 105 | else: |
59 | get_address_ranges("vmlinux", sys.argv[1]) | 106 | for file in sys.argv[2:]: |
107 | get_address_ranges(file, sys.argv[1]) | ||