How to Compile 32-bit Apps on 64-bit Ubuntu?

I'm trying to compile a 32-bit C application on Ubuntu Server 12.04 LTS 64-bit using gcc 4.8. I'm getting linker error messages about incompatible libraries and skipping -lgcc. What do I need to do to get 32 bit apps compiled and linked?

Answers


Ubuntu 16.04

sudo apt-get install gcc-multilib

For some reason, on Ubuntu 17.04, I also needed to install the version specific one:

sudo apt-get install gcc-6-multilib

Then a minimal hello world:

main.c

#include <stdio.h>

int main(void) {
    puts("hello world");
    return 0;
}

compiles without warning with:

gcc -m32 -ggdb3 -O0 -pedantic-errors -std=c89 \
  -Wall -Wextra -pedantic -o main.out main.c

And

./main.out

outputs:

hello world

And:

file main.out

says:

main.out: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=87c87a83878ce7e7d23b6236e4286bf1daf59033, not stripped

and:

qemu-i386 main.out

also gives:

hello world

but fails on an x86_64 executable with:

./main.out: Invalid ELF image for this architecture

Furthermore, I have:

So I think it works :-)

See also: Cannot find crtn.o, linking 32 bit code on 64 bit system

It is a shame that this package conflicts with the cross compilers like gcc-arm-linux-gnueabihf https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211

Running versions of the question:

We are able to run 32-bit programs directly on 64-bit Ubuntu because the Ubuntu kernel is configured with:

CONFIG_IA32_EMULATION=y

according to:

grep CONFIG_IA32_EMULATION "/boot/config-$(uname -r)"

whose help on the kernel source tree reads:

Include code to run legacy 32-bit programs under a
64-bit kernel. You should likely turn this on, unless you're
100% sure that you don't have any 32-bit programs left.

This is in turn possible because x86 64 bit CPUs have a mode to run 32-bit programs that the Linux kernel uses.

TODO: what options does gcc-multilib get compiled differently than gcc?


To get Ubuntu Server 12.04 LTS 64-bit to compile gcc 4.8 32-bit programs, you'll need to do two things.

  1. Make sure all the 32-bit gcc 4.8 development tools are completely installed:

    sudo apt-get install lib32gcc-4.8-dev

  2. Compile programs using the -m32 flag

    gcc pgm.c -m32 -o pgm


Multiarch installation is supported by adding the architecture information to the package names you want to install (instead of installing these packages using alternative names, which might or might not be available).

See this answer for more information on (modern) multiarch installations.

In your case you'd be better off installing the 32bit gcc and libc:

sudo apt-get install libc6-dev:i386 gcc:i386

It will install the 32-bit libc development and gcc packages, and all depending packages (all 32bit versions), next to your 64-bit installation without breaking it.


Need Your Help

Get a user's timezone in Python + Pylons

python timezone pylons

Is there a way to get the timezone of the connecting user using Pylons, and to adjust the content before rendering accordingly? Or can this only be done by JS?

Problems with Multiple Google Maps on One Page

php mysql google-maps maps smarty

Hi i have problems to display more than one Google maps on one page