hush/applets
Ron Yorston 610c4c385b applet_tables: save space by removing applet name offsets
The array applet_nameofs consumes two bytes per applet.  It encodes

   nofork/noexec flags
   suid flags
   the offset of the applet name in the applet_name string

Change the applet_table build tool to store the flags in two separate
arrays (applet_flags and applet_suid).  Replace applet_nameofs[] with a
smaller version that only stores a limited number of offsets.

This requires changes to the macros APPLET_IS_NOFORK, APPLET_IS_NOEXEC
and APPLET_SUID.

   According to Valgrind the original find_applet_by_name required
   353 cycles per call, averaged over all names.  Adjusting the number
   of known offsets allows space to be traded off against execution time:

      KNOWN_OFFSETS     cycles     bytes (wrt KNOWN_OFFSETS = 0)

           0             9057        -
           2             4604       32
           4             2407       75
           8             1342       98
          16              908      130
          32              884      194

   This patch uses KNOWN_OFFSETS = 8.

v2:
   Remove some dead code from the applet_table tool;
   Treat the applet in the middle of the table as a special case.

v3:
   Use the middle applet to adjust the start of the linear search as
   well as the last applet found.

v4:
   Use an augmented linear search in find_applet_by_name.
   Drop the special treatment of the middle name from get_applet_name:
   most of the advantage now derives from the last stored value.

v5:
   Don't store index in applet_nameofs, it can be calculated.

v6:
   Tweaks by Denys

function                                             old     new   delta
find_applet_by_name                                   25     125    +100
applet_suid                                            -      92     +92
run_applet_no_and_exit                               452     460      +8
run_applet_and_exit                                  695     697      +2
applet_name_compare                                   31       -     -31
applet_nameofs                                       734      14    -720
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 3/1 up/down: 202/-751)         Total: -549 bytes
   text       data        bss        dec        hex    filename
 925464        906      17160     943530      e65aa    busybox_old
 924915        906      17160     942981      e6385    busybox_unstripped

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2016-03-30 00:44:11 +02:00
..
.gitignore .gitignore: add missing ignores 2011-03-06 19:54:15 +01:00
applet_tables.c applet_tables: save space by removing applet name offsets 2016-03-30 00:44:11 +02:00
applets.c *: make GNU licensing statement forms more regular 2010-08-16 20:14:46 +02:00
busybox.mkll fix "make install" 2011-02-20 05:50:04 +01:00
busybox.mksuid buildsys: Add helper to list suid applets 2013-07-26 13:39:46 +02:00
individual.c style fixes, no code changes 2012-09-02 14:29:14 +02:00
install.sh applets: Add installation of individual binaries 2015-07-01 19:10:03 +02:00
Kbuild.src fix bit rot in scripts/Makefile.IMA #2 2011-03-06 23:48:24 +01:00
usage_compressed Aboriginal linux/musl build fixes 2015-10-05 11:15:43 +02:00
usage_pod.c whitespace fixes 2011-02-03 00:05:48 +01:00
usage.c *: make GNU licensing statement forms more regular 2010-08-16 20:14:46 +02:00