summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-03-08 19:30:57 +0000
committerDenys Vlasenko <vda.linux@googlemail.com>2021-03-09 17:25:07 +0100
commit0b25e810ed73334d30f99ba7073f21369b33ab18 (patch)
tree8dc62de8a1038cc5e52471198aae621bcce59ba5 /scripts
parent307cd26e9893ed0cf6ee88e7fca2d61d3da0e139 (diff)
downloadbusybox-0b25e810ed73334d30f99ba7073f21369b33ab18.tar.gz
bloat-o-meter: avoid double counting
Disable 'echo' in the default config, run 'make baseline', then re-enable 'echo' and run 'make bloatcheck': function old new delta .rodata 182521 182622 +101 packed_usage 33714 33792 +78 applet_main 3168 3176 +8 applet_names 2730 2735 +5 applet_suid 99 100 +1 applet_install_loc 198 199 +1 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 6/0 up/down: 194/0) Total: 194 bytes text data bss dec hex filename 955052 4195 1808 961055 eaa1f busybox_old 955153 4195 1808 961156 eaa84 busybox_unstripped The Total bytes value doesn't equal the change in the size of the binary. The packed_usage and applet_* items are in .rodata and are counted twice. With this modified bloat-o-meter the size of named items is deducted from .rodata: function old new delta packed_usage 33714 33792 +78 applet_main 3168 3176 +8 .rodata 105105 105113 +8 applet_names 2730 2735 +5 applet_suid 99 100 +1 applet_install_loc 198 199 +1 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 6/0 up/down: 101/0) Total: 101 bytes text data bss dec hex filename 955052 4195 1808 961055 eaa1f busybox_old 955153 4195 1808 961156 eaa84 busybox_unstripped v2: Sections numbered less than 10 were always being omitted from consideration because splitting "[ 1] .interp" leaves "1]" in x[1] where the section name is expected. This wasn't a problem for .rodata (numbered 15 in my testing) but let's fix it anyway. Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'scripts')
-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:
sym_args = " ".join(sys.argv[3 + flag_timing + dashes:])
def getsizes(file):
- sym, alias, lut = {}, {}, {}
+ sym, alias, lut, section = {}, {}, {}, {}
+ for l in os.popen("readelf -W -S " + file).readlines():
+ x = l.replace("[ ", "[", 1).split()
+ if len(x)<6: continue
+ # Should take these into account too!
+ #if x[1] not in [".text", ".rodata", ".symtab", ".strtab"]: continue
+ if x[1] not in [".rodata"]: continue
+ sym[x[1]] = {"addr" : int(x[3], 16), "size" : int(x[5], 16)}
+ section[x[0][1:-1]] = {"name" : x[1]}
for l in os.popen("readelf -W -s %s %s" % (sym_args, file)).readlines():
l = l.strip()
if not (len(l) and l[0].isdigit() and len(l.split()) == 8):
@@ -59,6 +67,10 @@ def getsizes(file):
else:
sym[name] = {"addr" : value, "size": size}
lut[(value, size)] = 0
+ # If this item is in a known section deduct its size from
+ # the size of the section
+ if ndx in section:
+ sym[section[ndx]["name"]]["size"] -= size
for addr, sz in iter(alias.keys()):
# If the non-GLOBAL sym has an implementation elsewhere then
# it's an alias, disregard it.
@@ -66,13 +78,6 @@ def getsizes(file):
# If this non-GLOBAL sym does not have an implementation at
# another address, then treat it as a normal symbol.
sym[alias[(addr, sz)]["name"]] = {"addr" : addr, "size": sz}
- for l in os.popen("readelf -W -S " + file).readlines():
- x = l.split()
- if len(x)<6: continue
- # Should take these into account too!
- #if x[1] not in [".text", ".rodata", ".symtab", ".strtab"]: continue
- if x[1] not in [".rodata"]: continue
- sym[x[1]] = {"addr" : int(x[3], 16), "size" : int(x[5], 16)}
return sym
if flag_timing: