Я пытаюсь скомпилировать 32-битное приложение C на Ubuntu Server 12.04 LTS 64-bit, используя gcc 4.8. Я получаю сообщения об ошибках компоновщика о несовместимых библиотеках и skipping -lgcc
. Что мне нужно сделать, чтобы скомпилировать и связать 32-битные приложения?
Как скомпилировать 32-битные приложения на 64-битном Ubuntu?
Ответ 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
исполняемого
Кроме того, у меня есть:
- запустить скомпилированный файл в 32-битной VM
- скомпилирован и запущен IA-32 C драйвер + комплексный код IA-32
Итак, я думаю, что это работает: -)
Смотрите также: Не удается найти crtn.o, связывая 32-битный код с 64-битной системой
Ответ 3
Поддержка Multiarch поддерживается добавлением информации о архитектуре к именам пакетов, которые вы хотите установить (вместо установки этих пакетов с использованием альтернативных имен, которые могут быть или могут быть недоступны).
См. этот ответ для получения дополнительной информации о (современной) многоархивой установке.
В вашем случае вам будет лучше установить 32-бит gcc и libc:
sudo apt-get install libc6-dev:i386 gcc:i386
Он установит 32-разрядные разработки libc и gcc и все зависящие пакеты (все 32-разрядные версии), рядом с вашей 64-битной установкой, не нарушая ее.