Configure build with disabling unused features e.g.:
$ ./configure --without-png
Link dynamically instead statically (on your platform shared library may be already present).
Avoid debug build. Make release/final build instead debug.
Use packers. Packer compress binary so binary smaller. When program load decompress itself, so startup time increase.
Binary packers:
http://upx.sourceforge.net Home page.
Use -Os when produces *.o files.
Use -s when produces executable. And --remove-section=.comment and --remove-section=.note".
Use:
$ strip --strip-all <executable>
and:
$ gcc -ffunction-sections -fdata-sections -c -o my.o my.c $ gcc -Wl,--gc-sections -o my my.o
Use /Os when produces *.obj files.