Tips to obtain a very small static elinks binary

Tips to obtain a very small static elinks binary suitable for mini distributions

Remove config.cache (previous CC may be cached):

$ rm config.cache

Use dietlibc ( or similar stuff (uClibc, …):

$ export CC='diet -Os gcc'

Use compilers flags to optimize for size:

$ export CFLAGS='-s -fno-inline -nostdinc -fomit-frame-pointer'

Note that if you don't use dietlibc, you definitively want to add -Os or -O2 to CFLAGS; GCC 2.95 does not know -Os, and some say -O2 gives smaller executables even for GCC 3.x.


If you use these CFLAGS on Cygwin and you get unresolved symbols (htons and suite in particular), try removing -fno-inline parameter.

Disable some compile-time options:

$ ./configure --disable-ipv6 --disable-backtrace --disable-nls \
  --enable-fastmem --without-zlib --without-bzlib --disable-xbel \
  --without-lua --without-gnutls --without-openssl --without-x \
  --enable-small --without-spidermonkey --without-gpm

You can disable bookmarks, globhist and more, too, if you want to.

Other configure options that can reduce the size

  • --disable-backtrace disables internal backtrace code.
  • --disable-nls disables i18n support.
  • --enable-fastmem disables internal malloc() debugging and use alloca() wherever possible.
  • --enable-small forces to remove some text descriptions in options and keybind stuff (regain 30Kb).

Dependencies over external libs must be removed using the related configure options:

Option Description
--without-zlib removes libz dependency (compression)
--without-bzlib removes libbz2 dependency (compression)
--disable-xbel removes expat dependency (XBEL bookmarks support)
--without-lua removes liblua dependency (Lua scripting)
--without-gnutls removes libtls dependency (SSL support)
--without-openssl removes libssl dependency (SSL support)
--without-x removes libx11 dependency (restoring terminal title)
--without-spidermonkey removes libjs dependency (JavaScript)
--without-gpm removes libgpm dependency (mouse/console)

It seems GCC 2.95.x do not generate as small binaries as GCC 3.2.x with same flags.

You can use an executable compressor like UPX

Here are some results using gcc 2.95.3, dietlibc-0.23, and previous flags:

me$ ls -l src/elinks
-rwxr-xr-x   1 zas      users      495100 Oct 20 15:53 src/elinks
me$ upx --best src/elinks
me$ ls -l src/elinks
-rwxr-xr-x   1 zas      users      217946 Oct 20 15:53 src/elinks

Whow ! Around 200kb :)

Details about the --enable-small configure option effects:

  • it disables long descriptions of options;
  • it disables textual descriptions of keybinding options;
  • it reduces size of some HTTP errors messages;
  • it disables fastfind feature, reducing performance, but also reducing a lot memory usage, and a bit the executable size.