Не могу запустить 32-битный двоичный файл на 64-битном Debian

Я компилирую C++ в Debian Linux (64-разрядная версия), и мне нужно иметь возможность компилировать в 32-разрядную версию для другой системы. Двоичные файлы не будут работать в моей 64-битной системе, и их запуск там будет гораздо удобнее для тестирования.

Мой C++ для тестирования это int main () { std::cout << "This is Main.cpp" << std::endl; } с включенным iostream, так что ничего особенного.

Моя строка компиляции g++ -m32 Main.cpp

Когда я делаю ./a.out, я получаю -bash: ./a.out: cannot execute binary file: Exec format error

Я провел немало поисков, пытаясь решить эту проблему, и установил apt: libc6:i386, libncurses5:i386 и libstdc++6:i386.

Любые другие идеи, чтобы исправить это, будут высоко оценены.


person G3yost    schedule 07.04.2018    source источник
comment
Что вам говорит file ./a.out? Вы можете запускать 64-битные двоичные файлы (компилировать без -m32)?   -  person Hadi Brais    schedule 08.04.2018
comment
@HadiBrais Я могу запускать 64-битные двоичные файлы без -m32, и когда я компилирую с -m32, чтобы получить 32-битный a.out, и я делаю file a.out, я получаю a.out: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e1483a60a1b26d9b3738bb963e90e713b515031b, not stripped   -  person G3yost    schedule 08.04.2018
comment
Следует сказать ELF 32-bit LSB executable..., а не ELF 32-bit LSB shared object... Почему компилятор выдает общий объект? Он должен выдать исполняемый файл. Общий объект нельзя запустить с помощью ./a.out.   -  person Hadi Brais    schedule 08.04.2018
comment
@HadiBrais, да ... я посмотрю на это. Не знаю, почему мне не пришло в голову сравнить file с -m32 и -m64, которые раньше считались исполняемыми файлами. Мне не терпится нырнуть в эту кроличью нору. Спасибо!   -  person G3yost    schedule 08.04.2018
comment
Рад, что смог помочь. Пожалуйста, держите меня в курсе проблемы.   -  person Hadi Brais    schedule 08.04.2018


Ответы (1)


Вам необходимо установить 32-битные библиотеки, например.

dpkg --add-architecture i386
apt-get update
apt-get install libc6-i386

Узнать, какие библиотеки нужны, можно с помощью команды ldd. Вы можете использовать apt-file, чтобы найти пакеты для библиотек.

person Xypron    schedule 07.04.2018
comment
Если вы устанавливаете libc6-i386, вам не нужно добавлять архитектуру. Если вы добавляете архитектуру i386, вы также можете установить libc6:i386. Нет? - person Marc Glisse; 07.04.2018
comment
Делаю все как у вас выше, а когда делаю apt install libc6-i386 apt говорит что уже самая новая версия. Любые предложения отсюда? Спасибо за вашу помощь. - person G3yost; 07.04.2018
comment
@MarcGlisse FWIW, я пришел сюда с той же проблемой. Я уже пытался установить libc6-i386, и это не помогло: я не мог запускать 32-битные двоичные файлы; Мне все еще не хватало /lib/ld-linux.so. Этап добавления архитектуры заставил меня работать, и я очень благодарен Xypron за это предложение. - person Steve Summit; 10.03.2021