Normally if you want to cross compile something to produce a 32bit executable with gcc, you have to pass in the -m32 argument.

$ gcc -m32 -o test32 test.c
  

After a new install of Ubuntu 11.10 I was left scratching my head for a little bit with the following error:

> In file included from /usr/include/stdio.h:28:0,
  >             from test.c:1:
  > /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
  > compilation terminated.
  

In order to build 32bit executables you need to install the i386 libc dev package.

$ sudo apt-get install libc6-dev-i386
  

For a little bit of 'fun' if you pass the -S -masm=intel arguments to gcc, you can compile once with -m32, and once with -m64 to see how your program changes based on target architecture. It can (perhaps it's just me :)) be Interesting to see the subtle changes in programs based on how they are assembled for x86_64 vs x86.

$ gcc -m32 -S -masm=intel test.c