Компиляция 32х битного приложения на 64х битной системе

 
gcc_0.png

GNU C Compiller (gcc) позволяет провести сборку 32х битного приложения на системе с 64х битной архитектурой.
Ничего особо необычного в этом нет, но могут возникнуть ошибки и сложности даже если вы и не разработчик, а просто собираете какое-то приложение из исходных текстов.

Скомпилируем простейший хеллоуворлд.

#include <stdio.h>

int main(void)
{
  printf("Hello World!\n");

  return 0;
}

cc -ansi -pedantic -Wall -O2 -o hello64 hello.c

Посмотрим, что же получилось в результате

file hello64
[email protected]:~$ file hello64
bin/hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x780cae34c5d8a36184f72eef66684468f09caabb, not stripped

Исполнимый файл для 64х битной машины.

Попробуем собрать 32х битную версию.
На этот случай у gcc предусмотрен флаг -m32.

cc -ansi -pedantic -Wall -O2 -m32 -o hello32 hello.c

Здесь вы можете встретить ошибку подобного вида:

[email protected]:~$ cc -ansi -pedantic -Wall -O2 -m32 -o hello32 hello.c
In file included from /usr/include/stdio.h:28:0,
                 from hello.c:1:
/usr/include/features.h:324:26: фатальная ошибка: bits/predefs.h: Нет такого файла или каталога
компиляция прервана.

Это говорит о том, что у вас не установлены библиотеки для 32x бинтной архитектуры. На Ubuntu вам потребуется установить пакет gcc-multilib. В своих зависимостях он имеет всё потребное.

sudo apt-get install gcc-multilib

Повторите попытку сборки с флагом -m32. На этот раз она увенчается успехом.
Проверим результат.

[email protected]:~$ file hello32
bin/hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa6f72aad224b1f3aa971af04b9b9a798df8fbdf2, not stripped

Всё прошло успешно!

[email protected]:~$ ./hello32
Hello World!

Напоследок стоит заметить, что на Unix системах 64-ой архитектуры 32-е приложения запускаются без проблем если все зависимости удовлетворены. Чего не скажешь об обратной ситуации.