Queremos compartirte la mejor información que hemos encontrado por todo internet. Nuestro deseo es que te sirva de ayuda y si quieres aportar cualquier detalle que nos pueda ayudar a crecer hazlo con total libertad.
Solución:
Ubuntu 16.04
sudo apt-get install gcc-multilib
Por alguna razón, en Ubuntu 17.04, también necesitaba instalar la versión específica:
sudo apt-get install gcc-6-multilib
Luego un hola mundo mínimo:
C Principal
#include
int main(void)
puts("hello world");
return 0;
compila sin previo aviso con:
gcc -m32 -ggdb3 -O0 -pedantic-errors -std=c89
-Wall -Wextra -pedantic -o main.out main.c
Y
./main.out
salidas:
hello world
Y:
file main.out
dice:
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
y:
qemu-i386 main.out
también da:
hello world
pero falla en un x86_64
ejecutable con:
./main.out: Invalid ELF image for this architecture
Además tengo:
- ejecutar el archivo compilado en una máquina virtual de 32 bits
- compilado y ejecutado un controlador IA-32 C + código complejo IA-32
Así que creo que funciona 🙂
Ver también: No se puede encontrar crtn.o, vinculando código de 32 bits en un sistema de 64 bits
Es una pena que este paquete entre en conflicto con los compiladores cruzados como gcc-arm-linux-gnueabihf
https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211
Versiones en ejecución de la pregunta:
- 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
Podemos ejecutar programas de 32 bits directamente en Ubuntu de 64 bits porque el kernel de Ubuntu está configurado con:
CONFIG_IA32_EMULATION=y
de acuerdo a:
grep CONFIG_IA32_EMULATION "/boot/config-$(uname -r)"
cuya ayuda en el árbol de fuentes del kernel dice:
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.
Esto, a su vez, es posible porque las CPU x86 de 64 bits tienen un modo para ejecutar programas de 32 bits que utiliza el kernel de Linux.
TODO: qué opciones hace gcc-multilib
compilarse de manera diferente a gcc
?
Para obtener Ubuntu Server 12.04 LTS de 64 bits para compilar programas gcc 4.8 de 32 bits, deberá hacer dos cosas.
-
Asegúrese de que todas las herramientas de desarrollo gcc 4.8 de 32 bits estén completamente instaladas:
sudo apt-get install lib32gcc-4.8-dev
-
Compile programas usando el indicador -m32
gcc pgm.c -m32 -o pgm
La instalación multiarquitectura se admite agregando la información de la arquitectura a los nombres de los paquetes que desea instalar (en lugar de instalar estos paquetes con nombres alternativos, que pueden o no estar disponibles).
Consulte esta respuesta para obtener más información sobre instalaciones (modernas) de varias arquitecturas.
En su caso, sería mejor que instalara gcc y libc de 32 bits:
sudo apt-get install libc6-dev:i386 gcc:i386
Instalará los paquetes de desarrollo libc y gcc de 32 bits, y todos los paquetes dependientes (todas las versiones de 32 bits), junto a su instalación de 64 bits sin romperla.
Sección de Reseñas y Valoraciones
Recuerda que tienes concesión de añadir una puntuación si te fue preciso.