Saltar al contenido

¿Cómo compilar aplicaciones de 32 bits en Ubuntu de 64 bits?

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.

  1. 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

  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *