aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-11-26 18:47:14 -0500
committerRob Landley <rob@landley.net>2006-11-26 18:47:14 -0500
commitcd2edfd6a13848e387f836252464de4662a22205 (patch)
treef79cef475f032832d51033291e2c95a0197e5402
parent28a0dec5dd19458200a18609ba0cc8c2f3b4d22f (diff)
downloadtoybox-cd2edfd6a13848e387f836252464de4662a22205.tar.gz
Add bloat-o-meter, make bloatcheck, and scripts/showasm.
-rw-r--r--Makefile20
-rw-r--r--kconfig/Makefile2
-rwxr-xr-xscripts/bloat-o-meter65
-rwxr-xr-xscripts/showasm20
4 files changed, 103 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index fcec4fda..9e74187d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,9 @@
# Makefile for toybox.
# Copyright 2006 Rob Landley <rob@landley.net>
-CFLAGS = -Wall -Wundef -Os -s
+CFLAGS = -Wall -Wundef -Os
CC = $(CROSS_COMPILE)gcc $(CFLAGS) -funsigned-char
+STRIP = $(CROSS_COMPILE)strip
HOST_CC = gcc $(CFLAGS) -funsigned-char
all: toybox
@@ -25,15 +26,28 @@ gen_config.h: .config
-e 'h' -e 's/.*/#define CFG_& 1/p' \
-e 'g' -e 's/.*/#define USE_&(...) __VA_ARGS__/p' $< > $@
+# Development targets
+baseline: toybox_unstripped
+ @cp toybox_unstripped toybox_old
+
+bloatcheck: toybox_old toybox_unstripped
+ @scripts/bloat-o-meter toybox_old toybox_unstripped
+
# Actual build
toyfiles = main.c toys/*.c lib/*.c
-toybox: gen_config.h $(toyfiles) toys/toylist.h lib/lib.h toys.h
- $(CC) $(CFLAGS) -I . $(toyfiles) -o toybox \
+toybox_unstripped: gen_config.h $(toyfiles) toys/toylist.h lib/lib.h toys.h
+ $(CC) $(CFLAGS) -I . $(toyfiles) -o toybox_unstripped \
-ffunction-sections -fdata-sections -Wl,--gc-sections
+toybox: toybox_unstripped
+ $(STRIP) toybox_unstripped -o toybox
clean::
rm -f toybox gen_config.h
distclean: clean
rm -f .config
+
+help::
+ @echo ' baseline - Create busybox_old for use by bloatcheck.'
+ @echo ' bloatcheck - Report size differences between old and current versions'
diff --git a/kconfig/Makefile b/kconfig/Makefile
index 4446e2c2..46a8f6e4 100644
--- a/kconfig/Makefile
+++ b/kconfig/Makefile
@@ -32,7 +32,7 @@ defconfig: $(obj)/conf
$< -d $(KCONFIG_TOP)
# Help text used by make help
-help:
+help::
@echo ' config - Update current config utilising a line-oriented program'
@echo ' menuconfig - Update current config utilising a menu based program'
@echo ' oldconfig - Update current config utilising a provided .config as base'
diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter
new file mode 100755
index 00000000..31364fe1
--- /dev/null
+++ b/scripts/bloat-o-meter
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+#
+# Copyright 2004 Matt Mackall <mpm@selenic.com>
+#
+# inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+
+import sys, os, re
+
+if len(sys.argv) != 3:
+ sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0])
+ sys.exit(-1)
+
+def getsizes(file):
+ sym = {}
+ for l in os.popen("nm --size-sort " + file).readlines():
+ size, type, name = l[:-1].split()
+ if type in "tTdDbB":
+ if "." in name: name = "static." + name.split(".")[0]
+ sym[name] = sym.get(name, 0) + int(size, 16)
+ for l in os.popen("readelf -S " + file).readlines():
+ x = l.split()
+ if len(x)<6 or x[1] != ".rodata": continue
+ sym[".rodata"] = int(x[5], 16)
+ return sym
+
+old = getsizes(sys.argv[1])
+new = getsizes(sys.argv[2])
+grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0
+delta, common = [], {}
+
+for a in old:
+ if a in new:
+ common[a] = 1
+
+for name in old:
+ if name not in common:
+ remove += 1
+ down += old[name]
+ delta.append((-old[name], name))
+
+for name in new:
+ if name not in common:
+ add += 1
+ up += new[name]
+ delta.append((new[name], name))
+
+for name in common:
+ d = new.get(name, 0) - old.get(name, 0)
+ if d>0: grow, up = grow+1, up+d
+ if d<0: shrink, down = shrink+1, down-d
+ delta.append((d, name))
+
+delta.sort()
+delta.reverse()
+
+print "%-48s %7s %7s %+7s" % ("function", "old", "new", "delta")
+for d, n in delta:
+ if d: print "%-48s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)
+print "-"*78
+total="(add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s)%%sTotal: %s bytes"\
+ % (add, remove, grow, shrink, up, -down, up-down)
+print total % (" "*(80-len(total)))
diff --git a/scripts/showasm b/scripts/showasm
new file mode 100755
index 00000000..75a6efd7
--- /dev/null
+++ b/scripts/showasm
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Copyright 2006 Rob Landley <rob@landley.net>
+
+# Dumb little utility function to print out the assembly dump of a single
+# function, or list the functions so dumpable in an executable. You'd think
+# there would be a way to get objdump to do this, but I can't find it.
+
+[ $# -lt 1 ] || [ $# -gt 2 ] && { echo "usage: showasm file function"; exit 1; }
+
+[ ! -f $1 ] && { echo "File $1 not found"; exit 1; }
+
+if [ $# -eq 1 ]
+then
+ objdump -d $1 | sed -n -e 's/^[0-9a-fA-F]* <\(.*\)>:$/\1/p'
+ exit 0
+fi
+
+objdump -d $1 | sed -n -e '/./{H;$!d}' -e "x;/^.[0-9a-fA-F]* <$2>:/p"
+