wake-up-neo.com

Wie kompiliere ich 32-Bit-Apps auf 64-Bit-Ubuntu?

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?

38
BSalita

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.

  1. Stellen Sie sicher, dass alle 32-Bit-Entwicklungstools von gcc 4.8 vollständig installiert sind:

    Sudo apt-get install lib32gcc-4.8-dev

  2. Kompilieren Sie Programme mit dem Flag -m32

    gcc pgm.c -m32 -o pgm

15
BSalita

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-gnueabihfhttps://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.

9
Veger