55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
|
#!/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"
|