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?
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:
- Po uruchomieniu pliku skompilowanego w 32-bitowej maszynie wirtualnej]}
- skompilowane i uruchomione sterownik IA-32 C + złożony kod IA-32
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:
- https://unix.stackexchange.com/questions/12956/how-do-i-run-32-bit-programs-on-a-64-bit-debian-ubuntu
- https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit
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
?
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.
-
Upewnij się, że wszystkie 32-bitowe narzędzia programistyczne gcc 4.8 są całkowicie zainstalowane:
sudo apt-get install lib32gcc-4.8-dev
-
Kompilowanie programów przy użyciu flagi-m32
gcc pgm.c -m32 -o pgm
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.
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