diff options
Diffstat (limited to 'scripts/kprobes_test/readelf.py')
-rwxr-xr-x | scripts/kprobes_test/readelf.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/scripts/kprobes_test/readelf.py b/scripts/kprobes_test/readelf.py new file mode 100755 index 00000000..d031625b --- /dev/null +++ b/scripts/kprobes_test/readelf.py @@ -0,0 +1,76 @@ +#!/usr/bin/python + +# Copyright (C) 2008 Red Hat Inc. +# +# This file is part of systemtap, and is free software. You can +# redistribute it and/or modify it under the terms of the GNU General +# Public License (GPL); either version 2, or (at your option) any +# later version. + +import re +import sys +import os +#import pickle +import subprocess +from config_opts import config_opts + +# Read the output of eu-readelf on vmlinux +(sysname, nodename, release, version, machine) = os.uname() +cmd = "eu-readelf --symbols /usr/lib/debug/lib/modules/%s/vmlinux" % release +print "Running", cmd +p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) +lines = p.stdout.readlines() +p.wait() +if p.returncode != 0: + print >>sys.stderr, "Error: eu-readelf failed." + sys.exit(p.returncode) + +# Parse the output +kprobes_text_start = 0 +kprobes_text_end = 0 +syms = dict() +func_re = re.compile("^\s*\d+:\s+([0-9a-f]+)\s+\d+\s+FUNC\s+\S+\s+\S+\s+\d+\s+(\S+)$") +notype_re = re.compile("^\s*\d+:\s+([0-9a-f]+)\s+\d+\s+NOTYPE\s+\S+\s+\S+\s+\d+\s+(\S+)$") +for line in lines: + match = notype_re.match(line) + if match: + addr = match.group(1) + name = match.group(2) + if name == "__kprobes_text_start": + kprobes_text_start = long(addr, 16) + elif name == "__kprobes_text_end": + kprobes_text_end = long(addr, 16) + continue + + match = func_re.match(line) + if match: + addr = match.group(1) + name = match.group(2) + syms[name] = long(addr, 16) + +# Now we've parsed everything. Now we need to go back and remove all +# symbols between '__kprobes_text_start' and '__kprobes_text_end', +# since they are already protected from kprobes. We couldn't do this +# in the loop above, since we might encounter symbols that need to be +# removed before we found the start/end of the kprobes section. +if kprobes_text_start == 0 or kprobes_text_end == 0: + print "Error - didn't find kprobes_test_start(%d) or kprobes_text_end(%d)" \ + % (kprobes_text_start, kprobes_text_end) + sys.exit(1) + +for name in syms.keys(): + if syms[name] >= kprobes_text_start and syms[name] < kprobes_text_end: + print "deleting", name + del syms[name] + +## Save data +#f = open('%s.syms' % (release), 'w') +#p = pickle.Pickler(f) +#p.dump(syms) +#f.close() + +# Write the data out in text format +f = open(config_opts['probes_all'], 'w') +for name in syms.keys(): + print >>f, name +f.close() |