| #!/usr/bin/python |
| import sys |
| from subprocess import Popen, PIPE |
| |
| if len(sys.argv) != 3: |
| print """%s usage: |
| %s obj1 obj2 |
| Calculate per-symbol and total size differences between obj1 and obj2, |
| which may be any files that nm can read""" % ((sys.argv[0],)*2) |
| sys.exit(2) |
| |
| obj1 = sys.argv[1] |
| obj2 = sys.argv[2] |
| |
| def getsyms(obj): |
| proc = Popen(args=['nm', '-S', '-t', 'd', obj], stdout=PIPE, stderr=PIPE) |
| out, err = proc.communicate() |
| if err: |
| print "nm reported an error:\n" |
| print err |
| sys.exit(1) |
| d = {} |
| for l in out.splitlines(): |
| l = l.strip().split() |
| if len(l) == 4: |
| d[l[3]] = int(l[1]) |
| return d |
| |
| diff = 0 |
| |
| d1 = getsyms(obj1) |
| d2 = getsyms(obj2) |
| l = [(k,v) for k,v in sorted(d1.items()) if k not in d2] |
| if l: |
| print "only in %s" % obj1 |
| print ''.join(" %6d %s\n" % (v,k) for k,v in l) |
| diff -= sum(v for k,v in l) |
| |
| l = [(k,v) for k,v in sorted(d2.items()) if k not in d1] |
| if l: |
| print "only in %s" % obj2 |
| print ''.join("%6d %s\n" % (v,k) for k,v in l) |
| diff += sum(v for k,v in l) |
| |
| l = [(k,v,d2[k]) for k,v in sorted(d1.items()) if k in d2 and d2[k] != v] |
| if l: |
| print "different sizes in %s and %s:" %(obj1, obj2) |
| print ''.join(" %6d %6d %s\n" % (v1,v2,k) for k,v1,v2 in l) |
| diff += sum(v2-v1 for k,v1,v2 in l) |
| |
| if diff: |
| print "total size difference: %+d" % diff |
| else: |
| print "total size difference: 0" |