I had to compile a 32-bit application using GNU gcc on the 64-bit version Linux.
Luckily gcc man page directed me to -m32 and -m64 option. These options generate code for a 32-bit or 64-bit environments.
=> The 32-bit environment sets int, long and pointer to 32 bits and generates code that runs on any i386 system.
=> The 64-bit environment sets int to 32 bits and long and pointer to 64 bits and generates code for AMD's x86-64 architecture.
You can pass -m64 or -m32 as follows
For 32 bit version:
$ gcc -m32 -o output32 hello.c
For 64 bit version :
$ gcc -m64 -o output64 hello.c
And output is :
$ ./output32
Output:
Long int size is 4 bytes long!
Now let us see 64 bit output:
$ ./output64
Long int size is 8 bytes long!
Sample code - hello.c:
#include <stdio.h>
int main(){
long z; printf("Long int size is %i bytes long!\n", sizeof(z)); return 0;
}Featured Articles:
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins

- My 10 UNIX Command Line Mistakes
- 25 PHP Security Best Practices For Sys Admins
- The Novice Guide To Buying A Linux Laptop
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- Top 20 OpenSSH Server Best Security Practices
- Top 10 Open Source Web-Based Project Management Software
Facebook it - Tweet it - Print it -
We're here to help you make the most of sysadmin work. So, subscribe!

{ 22 comments… read them below or add one }
I think
gcc -m32 -o output64 hello.c
should be
!
gcc -m32 -o output32 hello.c
and
$ gcc -m64 -o output64 hello.c
should be
$ gcc -m64 -o output64 hello.c
mojo
Thanks for heads up!
its working . thx
I got this error trying to compile with -m32 :S
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h
Whats wrong?
How can I build x64 target. using -m64 gives error. how can I download the libraries for 64 bit. remember I am using ubuntu and gcc 4.1.2.
looks like by default gcc compiles x86.
vlad – you need to install gcc multilib for your distribution – it should then compile O.K.
Any ideas how to convince the average ./configure to compile in 32 bit mode? I’m trying to compile pcsx2 (a PS2 emulator) in 32 bit mode because apparently it works better. I did
export CFLAGS=-m32
export CXXFLAGS=-m32
beforehand, and building stuff works. However the problem is that configure correctly realises I’m using a 64 bit processor and set lots of #defines and other things (such as choosing the x86-64 version of an assembly file). This messes up the build. God I hate autotools.
Try giving build info to autoconf.
for a one line solution,
$> env CFLAGS=”-m32″ LDFLAGS=”-m32″ ./configure –build=i686-unknown-linux-gnu …
I get a similar error as Vlad:
In file included from /usr/include/features.h:352,
from /usr/include/stdio.h:28,
from slu_util.h:4,
from slu_sdefs.h:28,
from sgssv.c:9:
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
Anyone?
I found this:
you might want to install glibc-devel.i386 (even if you’re on x64) to fix this problem
and this:
On ubuntu 64-bit version, solution is:
sudo apt-get install g++-multilib
hope that will solve it.
This works best!!!
I faced this error when using ” gcc -m32 -o de ‘/home/atieh/Desktop/debug.o” of course my program is not only in C languge , it ‘s embbeded with assembly.
here is the error:
skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.3.3/libgcc.a when searching for -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.3.3/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
collect2: ld returned 1 exit status
Make sure you have installed the following packages as well:-
1. libstdc++.i386
2. libgcc.i386
3. glibc.i386
4. glibc-devel.i386
Thanks this is what i am looking for
I’m trying to compile a 32-bit app on 64-bit debian. One of the libraries I need is libelf. The link is failing. Any ideas? I’ve installed ia32-libs, and am using the -m32 compiler switch. Thanks for any help you can give me.
you don’t need a variable. sizeof(long) works fine, too ;)
@bknysz: It’s been a while, but did you find a solution for libelf issue? I am running into the same problem here …
If I remember correctly, I just manually copied the 32-bit version into the directory
/emul/ia32-linux/usr/lib/libelf*
On openSUSE, I fixed the compilation problems by installing
gcc-c++-32bit
and all dependencies. now the problem is solved. It will automatically select gcc45, or, the latest gcc.
i have a oriented file(tmp.o) compiled on 32-bit ,and i want to compile it with “my.o” on 64-bit can i use that command???
Thanks ! Thanks! Thanks!
I searched the entire Baidu(in china), did not find the answer!,This is where the original!
No one can give me the answer,but the teacher is here:
Make sure you have installed the following packages as well:-
1. libstdc++.i386
2. libgcc.i386
3. glibc.i386
4. glibc-devel.i386
Hi should these be installed on the 32 bit or 64 bit?
1. libstdc++.i386
2. libgcc.i386
3. glibc.i386
4. glibc-devel.i386