summaryrefslogtreecommitdiffstats
path: root/scripts/kprobes_test/readelf.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kprobes_test/readelf.py')
-rwxr-xr-xscripts/kprobes_test/readelf.py76
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()