How to compile a 32-bit application using gcc on the 64-bit Linux version

by Vivek Gite on December 13, 2006 · 22 comments

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:

Share this with other sys admins!
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 }

1 mojo December 20, 2006

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

Reply

2 nixcraft December 20, 2006

mojo

Thanks for heads up!

Reply

3 beparas June 1, 2007

its working . thx

Reply

4 vlad May 19, 2008

I got this error trying to compile with -m32 :S
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h

Whats wrong?

Reply

5 Amit July 17, 2008

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.

Reply

6 martin August 17, 2008

vlad – you need to install gcc multilib for your distribution – it should then compile O.K.

Reply

7 Tim May 17, 2009

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.

Reply

8 Steven June 15, 2009

Try giving build info to autoconf.
for a one line solution,
$> env CFLAGS=”-m32″ LDFLAGS=”-m32″ ./configure –build=i686-unknown-linux-gnu …

Reply

9 Highwind August 21, 2009

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?

Reply

10 Highwind August 21, 2009

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.

Reply

11 Vamsi May 3, 2011

This works best!!!

Reply

12 Atie September 10, 2009

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

Reply

13 Sudarsun Santhiappan October 8, 2009

Make sure you have installed the following packages as well:-
1. libstdc++.i386
2. libgcc.i386
3. glibc.i386
4. glibc-devel.i386

Reply

14 jonywalker800 March 12, 2010

Thanks this is what i am looking for

Reply

15 bknysz March 31, 2010

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.

Reply

16 Anonymous May 4, 2010

you don’t need a variable. sizeof(long) works fine, too ;)

Reply

17 Anonymous June 23, 2010

@bknysz: It’s been a while, but did you find a solution for libelf issue? I am running into the same problem here …

Reply

18 bknysz June 23, 2010

If I remember correctly, I just manually copied the 32-bit version into the directory
/emul/ia32-linux/usr/lib/libelf*

Reply

19 felipe1982 November 15, 2010

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.

Reply

20 Alex May 21, 2011

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???

Reply

21 Jiabao Wan June 27, 2011

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

Reply

22 Jumbo November 18, 2011

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

Reply

Leave a Comment

You can use these HTML tags and attributes for your code and commands: <strong> <em> <ol> <li> <u> <ul> <blockquote> <pre> <a href="" title="">
What is 5 + 10 ?
Please leave these two fields as-is:
Are you a human being? Solve the simple math so we know that you are a human and not a bot.



Previous post:

Next post: