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?
Pour qu'Ubuntu Server 12.04 LTS 64 bits compile les programmes gcc 4.8 32 bits, vous devez effectuer deux opérations.
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
Compiler des programmes à l'aide de l'indicateur -m32
gcc pgm.c -m32 -o pgm
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-gnueabihf
https://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.