Как скомпилировать 32-битные приложения на 64-битном Ubuntu?

Я пытаюсь скомпилировать 32-битное приложение C на Ubuntu Server 12.04 LTS 64-bit, используя gcc 4.8. Я получаю сообщения об ошибках компоновщика о несовместимых библиотеках и skipping -lgcc. Что мне нужно сделать, чтобы скомпилировать и связать 32-битные приложения?

Ответ 1

Чтобы получить Ubuntu Server 12.04 LTS 64-бит для компиляции 32-битных программ gcc 4.8, вам нужно сделать две вещи.

  • Убедитесь, что все 32-разрядные средства разработки gcc 4.8 полностью установлены:

    sudo apt-get install lib32gcc-4.8-dev

  • Скомпилируйте программы, используя флаг -m32

    gcc pgm.c -m32 -o pgm

Ответ 2

Ubuntu 14.04

sudo apt-get install gcc-multilib

По какой-то причине, на Ubuntu 17.04, мне также нужно было установить версию, относящуюся к версии:

sudo apt-get install gcc-6-multilib

Тогда минимальный мир привет:

#include <stdio.h>

int main() {
    puts("Hello world!");
    return 0;
}

компилируется без предупреждения:

gcc -m32 -pedantic-errors -std=c89 -Wall hello_world.c

и

./a.out

дает: Hello world! как ожидалось, и:

file a.out

говорит:

a.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

и

qemu-i386 a.out

также дает: Hello world!, но сбой для x86_64 исполняемого

Кроме того, у меня есть:

Итак, я думаю, что это работает: -)

Смотрите также: Не удается найти crtn.o, связывая 32-битный код с 64-битной системой

Ответ 3

Поддержка Multiarch поддерживается добавлением информации о архитектуре к именам пакетов, которые вы хотите установить (вместо установки этих пакетов с использованием альтернативных имен, которые могут быть или могут быть недоступны).

См. этот ответ для получения дополнительной информации о (современной) многоархивой установке.

В вашем случае вам будет лучше установить 32-бит gcc и libc:

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

Он установит 32-разрядные разработки libc и gcc и все зависящие пакеты (все 32-разрядные версии), рядом с вашей 64-битной установкой, не нарушая ее.