Ich versuche, eine 32-Bit-C-Anwendung auf Ubuntu Server 12.04 LTS 64-Bit mit gcc 4.8 zu kompilieren. Ich erhalte Linker-Fehlermeldungen zu inkompatiblen Bibliotheken und skipping -lgcc
. Was muss ich tun, um 32-Bit-Apps zu kompilieren und zu verknüpfen?
Um Ubuntu Server 12.04 LTS 64-Bit zum Kompilieren von gcc 4.8 32-Bit-Programmen zu erhalten, müssen Sie zwei Dinge tun.
Stellen Sie sicher, dass alle 32-Bit-Entwicklungstools von gcc 4.8 vollständig installiert sind:
Sudo apt-get install lib32gcc-4.8-dev
Kompilieren Sie Programme mit dem Flag -m32
gcc pgm.c -m32 -o pgm
Ubuntu 16.04
Sudo apt-get install gcc-multilib
Aus irgendeinem Grund musste ich unter Ubuntu 17.04 auch die versionsspezifische Version installieren:
Sudo apt-get install gcc-6-multilib
Dann eine minimale Hallo Welt:
haupt c
#include <stdio.h>
int main(void) {
puts("hello world");
return 0;
}
kompiliert ohne Vorwarnung mit:
gcc -m32 -ggdb3 -O0 -pedantic-errors -std=c89 \
-Wall -Wextra -pedantic -o main.out main.c
Und
./main.out
ausgänge:
hello world
Und:
file main.out
sagt:
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
und:
qemu-i386 main.out
gibt auch:
hello world
aber scheitert an einem x86_64
ausführbar mit:
./main.out: Invalid ELF image for this architecture
Außerdem habe ich:
Also ich denke es funktioniert :-)
Siehe auch: crtn.o nicht gefunden, 32-Bit-Code auf 64-Bit-System verknüpft
Es ist eine Schande, dass dieses Paket mit den Cross-Compilern wie gcc-arm-linux-gnueabihf
https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211
Laufende Versionen der Frage:
Wir können 32-Bit-Programme direkt auf 64-Bit-Ubuntu ausführen, da der Ubuntu-Kernel konfiguriert ist mit:
CONFIG_IA32_EMULATION=y
gemäß:
grep CONFIG_IA32_EMULATION "/boot/config-$(uname -r)"
deren Hilfe im Kernel Source Tree lautet:
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.
Dies ist wiederum möglich, weil x86-64-Bit-CPUs einen Modus zum Ausführen von 32-Bit-Programmen haben, die der Linux-Kernel verwendet.
TODO: Welche Optionen hat gcc-multilib
anders kompiliert werden als gcc
?
Die Multiarch-Installation wird unterstützt, indem die Architekturinformationen zu den zu installierenden Paketnamen hinzugefügt werden (anstatt diese Pakete mit alternativen Namen zu installieren, die möglicherweise verfügbar sind oder nicht).
Weitere Informationen zu (modernen) Multiarch-Installationen finden Sie unter diese Antwort .
In Ihrem Fall ist es besser, wenn Sie den 32-Bit-GCC und die Libc installieren:
Sudo apt-get install libc6-dev:i386 gcc:i386
Es installiert die 32-Bit-Pakete libc development und gcc sowie alle abhängigen Pakete (alle 32-Bit-Versionen) neben Ihrer 64-Bit-Installation, ohne sie zu beschädigen.