Jak skompilować 32-bitowe aplikacje na 64-bitowym Ubuntu?

Próbuję skompilować 32-bitową aplikację C na Ubuntu Server 12.04 LTS 64-bit przy użyciu gcc 4.8. Dostaję komunikaty o błędach linkera o niekompatybilnych bibliotekach i skipping -lgcc. Co muszę zrobić, aby skompilować i połączyć aplikacje 32-bitowe?

Author: BSalita, 2014-03-12

3 answers

Ubuntu 16.04

sudo apt-get install gcc-multilib
Z jakiegoś powodu, na Ubuntu 17.04, musiałem również zainstalować konkretną wersję:]}
sudo apt-get install gcc-6-multilib

Potem minimal hello world:

Main.c

#include <stdio.h>

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

Kompiluje bez ostrzeżenia z:

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

I

./main.out

Wyjścia:

hello world

I:

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

I:

qemu-i386 main.out

Daje również:

hello world

Ale nie działa na pliku wykonywalnym x86_64 z:

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

Ponadto mam:

Więc myślę, że to działa: -)

Zobacz także: Nie można znaleźć crtn.o, łączenie 32-bitowego kodu w 64-bitowym systemie

Szkoda, że ten pakiet koliduje z kompilatorami krzyżowymi, takimi jak gcc-arm-linux-gnueabihf https://bugs.launchpad.net/ubuntu / + source / GCC-defaults/ + bug/1300211

Uruchomione wersje pytania:

Jesteśmy w stanie uruchamiać 32-bitowe programy bezpośrednio na 64-bitowym Ubuntu, ponieważ jądro Ubuntu jest skonfigurowane z:

CONFIG_IA32_EMULATION=y

Według:

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

Którego pomoc na drzewie źródłowym jądrabrzmi:

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.

Jest to z kolei możliwe, ponieważ 64-bitowe procesory x86 mają tryb uruchamiania 32-bitowych programów używanych przez jądro Linuksa.

Do zrobienia: jakie opcje gcc-multilib są kompilowane inaczej niż gcc?

 81
Author: Ciro Santilli TRUMP BAN IS BAD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-20 16:29:22

Aby uzyskać Ubuntu Server 12.04 LTS 64-bit do kompilacji 32-bitowych programów gcc 4.8, musisz zrobić dwie rzeczy.

  1. Upewnij się, że wszystkie 32-bitowe narzędzia programistyczne gcc 4.8 są całkowicie zainstalowane:

    sudo apt-get install lib32gcc-4.8-dev

  2. Kompilowanie programów przy użyciu flagi-m32

    gcc pgm.c -m32 -o pgm

 21
Author: BSalita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 14:58:37

Instalacja wielowarstwowa jest obsługiwana przez dodanie informacji o architekturze do nazw pakietów, które chcesz zainstalować (zamiast instalować te pakiety używając alternatywnych nazw, które mogą lub nie mogą być dostępne).

Zobacz Ta odpowiedź aby uzyskać więcej informacji na temat (nowoczesnych) instalacji wieloarchitektorowych.

W Twoim przypadku lepiej byłoby zainstalować 32bit gcc i libc:

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

Zainstaluje 32-bitowe Pakiety deweloperskie libc i GCC, a wszystko w zależności Pakiety (wszystkie 32-bitowe wersje), obok 64-bitowej instalacji bez jej łamania.

 10
Author: Veger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:22:42