I had to compile a 32-bit application using GNU gcc on the 64-bit version of Linux.

Luckily, gcc man page directed me to the ‘-m32’ and ‘-m64’ options. These options generate code for 32-bit or 64-bit environments, respectively.


  1. The 32-bit environment sets int, long and pointer to 32 bits and generates code that runs on any i386 system.
  2. 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 options as follows to Gnu gcc

For 32 bit version:
$ gcc -m32 -o output32 hello.c
For 64 bit version :
$ gcc -m64 -o output64 hello.c
Run it as follows:
$ ./output32

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;

A note about glibc-devel on 64 bit systems

You may see an error as follows on 64 bit system when you try to build 32 bit app:

/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h:

This error message shows up on the 64 bit systems where GCC multilib feature is enabled, and it indicates that 32 bit version of libc is not installed. To fix this problem, on a CentOS/RHEL 5.x type the following yum command:
# yum -y install glibc-devel.i386 libstdc++-devel.i386
To fix this problem, on a CentOS/RHEL 6.x type the following yum command:
# yum -y install glibc-devel.i686 glibc-devel ibstdc++-devel.i686
To fix this problem on a Debian or Ubuntu Linux type the following apt-get command:
$ sudo apt-get install g++-multilib libc6-dev-i386
To fix this problem on a Suse (SLES) / OpenSUSE Linux type the following zypper command:
# zypper in glibc-devel-32bit

See also

# Additional correction by Braden B and others; Editing by VG – log #

πŸ₯Ί Was this helpful? Please add a comment to show your appreciation or feedback.

nixCrat Tux Pixel Penguin
Hi! 🀠
I'm Vivek Gite, and I write about Linux, macOS, Unix, IT, programming, infosec, and open source. Subscribe to my RSS feed or email newsletter for updates.

30 comments… add one
  • mojo Dec 20, 2006 @ 12:15

    I think
    gcc -m32 -o output64 hello.c

    should be
    gcc -m32 -o output32 hello.c


    $ gcc -m64 -o output64 hello.c

    should be

    $ gcc -m64 -o output64 hello.c

  • πŸ›‘οΈ Vivek Gite (Author and Admin) nixCraft Dec 20, 2006 @ 12:18


    Thanks for heads up!

  • beparas Jun 1, 2007 @ 12:07

    its working . thx

  • vlad May 19, 2008 @ 17:27

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

    Whats wrong?

  • Amit Jul 17, 2008 @ 12:02

    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.

  • martin Aug 17, 2008 @ 11:19

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

  • Tim May 17, 2009 @ 17:50

    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.

  • Steven Jun 15, 2009 @ 16:15

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

  • Highwind Aug 21, 2009 @ 1:26

    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


    • Franco Nov 3, 2012 @ 20:50

      on suse SYSTEM:
      sudo zypper install glibc-devel.i686

      or, on other systems:
      sudo yum install glibc-devel.i686

      this is going to install the 32 bit version of some libraries

  • Highwind Aug 21, 2009 @ 1:32

    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.

    • Vamsi May 3, 2011 @ 14:37

      This works best!!!

    • Ramon Oct 6, 2012 @ 18:07


    • Ankit Mondal Jan 14, 2015 @ 12:01

      Thanks, this 1-line command worked.

  • Atie Sep 10, 2009 @ 17:29

    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

  • Sudarsun Santhiappan Oct 8, 2009 @ 13:10

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

  • jonywalker800 Mar 12, 2010 @ 5:23

    Thanks this is what i am looking for

  • bknysz Mar 31, 2010 @ 12:12

    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.

  • Anonymous May 4, 2010 @ 15:46

    you don’t need a variable. sizeof(long) works fine, too πŸ˜‰

  • Anonymous Jun 23, 2010 @ 12:06

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

    • bknysz Jun 23, 2010 @ 15:41

      If I remember correctly, I just manually copied the 32-bit version into the directory

  • felipe1982 Nov 15, 2010 @ 6:03

    On openSUSE, I fixed the compilation problems by installing
    and all dependencies. now the problem is solved. It will automatically select gcc45, or, the latest gcc.

  • Alex May 21, 2011 @ 5:08

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

  • Jiabao Wan Jun 27, 2011 @ 15:34

    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

  • Jumbo Nov 18, 2011 @ 21:38

    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

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre> for code samples. Your comment will appear only after approval by the site admin.