aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/bloat-o-meter21
1 files changed, 13 insertions, 8 deletions
diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter
index cb861b8e9..b4a1d2811 100755
--- a/scripts/bloat-o-meter
+++ b/scripts/bloat-o-meter
@@ -43,7 +43,15 @@ if f1 is None or f2 is None:
43 43
44sym_args = " ".join(sys.argv[3 + flag_timing + dashes:]) 44sym_args = " ".join(sys.argv[3 + flag_timing + dashes:])
45def getsizes(file): 45def getsizes(file):
46 sym, alias, lut = {}, {}, {} 46 sym, alias, lut, section = {}, {}, {}, {}
47 for l in os.popen("readelf -W -S " + file).readlines():
48 x = l.replace("[ ", "[", 1).split()
49 if len(x)<6: continue
50 # Should take these into account too!
51 #if x[1] not in [".text", ".rodata", ".symtab", ".strtab"]: continue
52 if x[1] not in [".rodata"]: continue
53 sym[x[1]] = {"addr" : int(x[3], 16), "size" : int(x[5], 16)}
54 section[x[0][1:-1]] = {"name" : x[1]}
47 for l in os.popen("readelf -W -s %s %s" % (sym_args, file)).readlines(): 55 for l in os.popen("readelf -W -s %s %s" % (sym_args, file)).readlines():
48 l = l.strip() 56 l = l.strip()
49 if not (len(l) and l[0].isdigit() and len(l.split()) == 8): 57 if not (len(l) and l[0].isdigit() and len(l.split()) == 8):
@@ -59,6 +67,10 @@ def getsizes(file):
59 else: 67 else:
60 sym[name] = {"addr" : value, "size": size} 68 sym[name] = {"addr" : value, "size": size}
61 lut[(value, size)] = 0 69 lut[(value, size)] = 0
70 # If this item is in a known section deduct its size from
71 # the size of the section
72 if ndx in section:
73 sym[section[ndx]["name"]]["size"] -= size
62 for addr, sz in iter(alias.keys()): 74 for addr, sz in iter(alias.keys()):
63 # If the non-GLOBAL sym has an implementation elsewhere then 75 # If the non-GLOBAL sym has an implementation elsewhere then
64 # it's an alias, disregard it. 76 # it's an alias, disregard it.
@@ -66,13 +78,6 @@ def getsizes(file):
66 # If this non-GLOBAL sym does not have an implementation at 78 # If this non-GLOBAL sym does not have an implementation at
67 # another address, then treat it as a normal symbol. 79 # another address, then treat it as a normal symbol.
68 sym[alias[(addr, sz)]["name"]] = {"addr" : addr, "size": sz} 80 sym[alias[(addr, sz)]["name"]] = {"addr" : addr, "size": sz}
69 for l in os.popen("readelf -W -S " + file).readlines():
70 x = l.split()
71 if len(x)<6: continue
72 # Should take these into account too!
73 #if x[1] not in [".text", ".rodata", ".symtab", ".strtab"]: continue
74 if x[1] not in [".rodata"]: continue
75 sym[x[1]] = {"addr" : int(x[3], 16), "size" : int(x[5], 16)}
76 return sym 81 return sym
77 82
78if flag_timing: 83if flag_timing: