web-dev-qa-db-fra.com

Comment compiler des applications 32 bits sur Ubuntu 64 bits?

J'essaie de compiler une application C 32 bits sur Ubuntu Server 12.04 LTS 64 bits à l'aide de gcc 4.8. Je reçois des messages d'erreur sur l'éditeur de liens concernant les bibliothèques incompatibles et skipping -lgcc. Que dois-je faire pour que les applications 32 bits soient compilées et liées?

38
BSalita

Pour qu'Ubuntu Server 12.04 LTS 64 bits compile les programmes gcc 4.8 32 bits, vous devez effectuer deux opérations.

  1. Assurez-vous que tous les outils de développement 32 bits gcc 4.8 sont complètement installés:

    Sudo apt-get install lib32gcc-4.8-dev

  2. Compiler des programmes à l'aide de l'indicateur -m32

    gcc pgm.c -m32 -o pgm

15
BSalita

Ubuntu 16.04

Sudo apt-get install gcc-multilib

Pour une raison quelconque, sur Ubuntu 17.04, je devais également installer la version spécifique:

Sudo apt-get install gcc-6-multilib

Puis un monde de salut minimal:

principal c

#include <stdio.h>

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

compile sans avertissement avec:

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

Et

./main.out

les sorties:

hello world

Et:

file main.out

dit:

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

et:

qemu-i386 main.out

donne également:

hello world

mais échoue sur un x86_64 exécutable avec:

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

De plus, j'ai:

Donc je pense que ça marche :-)

Voir aussi: crtn.o introuvable, lien code 32 bits sur un système 64 bits

Il est dommage que ce paquetage entre en conflit avec les compilateurs croisés comme gcc-arm-linux-gnueabihfhttps://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211

Versions courantes de la question:

Nous pouvons exécuter des programmes 32 bits directement sur Ubuntu 64 bits, car le noyau Ubuntu est configuré avec:

CONFIG_IA32_EMULATION=y

selon:

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

dont l’aide sur le arbre source du noya se lit comme suit:

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.

Ceci est à son tour possible car les processeurs x86 64 bits disposent d'un mode permettant d'exécuter des programmes 32 bits utilisés par le noyau Linux.

TODO: quelles options fait gcc-multilib _ _ _ _ _ _ _ _ gcc

L'installation multiarch est prise en charge en ajoutant les informations d'architecture aux noms de package que vous souhaitez installer (au lieu d'installer ces packages sous d'autres noms, qui peuvent être disponibles ou non).

Voir cette réponse pour plus d'informations sur les installations multiarch (modernes).

Dans votre cas, il vaudrait mieux installer les fichiers gcc et libc 32 bits:

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

Il installera les packages de développement libc 32 bits et gcc, ainsi que tous les packages dépendants (toutes les versions 32 bits), à côté de votre installation 64 bits sans la casser.

9
Veger