Cómo compilar un binario de 32 bits en una máquina Linux de 64 bits con gcc / cmake

129

¿Es posible compilar un proyecto en 32 bits con cmakey gccen un sistema de 64 bits ? Probablemente lo sea, pero ¿cómo lo hago?

Cuando lo intenté de la manera "ignorante", sin establecer ningún parámetro / flags / etc, solo configurar LD_LIBRARY_PATHpara encontrar las bibliotecas vinculadas ~/tools/libparece ignorarlo y solo buscar en subdirectorios llamados lib64 .

dala
fuente
1
¿Sería suficiente pasar la bandera -m32 a gcc? ¿Cómo haría eso en cmake?
dala

Respuestas:

124
export CFLAGS=-m32
coste y flete
fuente
2
Debería hacer. También podría modificar el script cmake para crear un objetivo de 32 bits; simplemente se agregaría -m32al CFLAGS, probablemente mediante la configuración CMAKE_REQUIRED_FLAGS.
caf
55
Bueno, el problema es que, por supuesto, esto no es necesariamente suficiente. ¡Es posible que también necesites modificar el enlazador!
lpapp
66
Que exportsignifica ¿A dónde pertenece? Te archivos de cabecera? El makefile? No, no es una respuesta para mí como principiante.
Tomáš Zato - Restablece a Mónica el
1
@ TomášZato: en el indicador de comandos de shell, antes de invocar cmake(sin embargo, en su caso, si tiene un Makefile, entonces lo estaría usando make).
caf
44
@caf, ¿podría dar más detalles sobre su respuesta? Su respuesta es muy breve y no explica nada.
Bulat M.
76
$ gcc test.c -o testc
$ file testc
testc: ELF ejecutable LSB de 64 bits, x86-64, versión 1 (SYSV), vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.6.9, no despojado
$ ldd testc 
    linux-vdso.so.1 => (0x00007fff227ff000)
    libc.so.6 => /lib64/libc.so.6 (0x000000391f000000)
    /lib64/ld-linux-x86-64.so.2 (0x000000391ec00000)
$ gcc -m32 test.c -o testc
$ file testc
testc: ELF ejecutable LSB de 32 bits, Intel 80386, versión 1 (SYSV), vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.6.9, no despojado
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

En resumen: use la -m32bandera para compilar un binario de 32 bits.

Además, asegúrese de tener instaladas las versiones de 32 bits de todas las bibliotecas necesarias (en mi caso, todo lo que necesitaba en Fedora era glibc-devel.i386)

andri
fuente
1
¡Muchas gracias! Sí, tengo versiones de 32 bits de las dependencias.
dala
66
¿Cómo puedo instalar versiones de 32 bits de las bibliotecas?
Tomáš Zato - Restablece a Monica el
2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch
16

En versiones posteriores de CMake, una forma de hacerlo en cada objetivo es:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

No sé cómo hacerlo globalmente.

Nathan Monteleone
fuente
+1. Estoy tratando de construir taglib de 32 bits ( developer.kde.org/~wheeler/taglib.html ) en un leopardo de las nieves de 64 bits. Esto funciona para mi.
edwardw
3
… Para hacerlo globalmente:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas
7

Para C ++, podría hacer:

export CXXFLAGS=-m32

Esto funciona con cmake.

Euccas
fuente
6

Una forma es configurar un entorno chroot. Debian tiene varias herramientas para eso, por ejemplo debootstrap

Dirk Eddelbuettel
fuente
2
Se siente un poco extremo para configurar un entorno chroot solo para crear aplicaciones de 32 bits, ¿no? ¿Alguna razón en particular por la que lo recomiendas?
Fredrik
3
Le brinda un entorno completo en el que también puede ejecutar código. Lo usamos para compilar (y ejecutar) binarios completos de 32 bits en hosts de 64 bits, a veces solo obtienes compilaciones de 32 bits de bibliotecas de terceros. Para el trabajo de Debian, lo usamos para construir paquetes de 32 bits en hosts de 64 bits.
Dirk Eddelbuettel
Nunca he tenido ningún problema, ya sea creando y ejecutando binarios completos de 32 bits en Linux, Solaris ni en ninguna otra plataforma de 64 bits. Pero no estoy usando mucho Debian.
Fredrik
Frederik, ¿también los implementas en 32 bits en el host de compilación de 64 bits?
Dirk Eddelbuettel
@Dirk: los binarios de 32 bits funcionan en máquinas de 32 y 64 bits (por supuesto), los binarios de 64 bits solo funcionan en máquinas de 64 bits. No importa si es una máquina del cliente o un host de compilación. Honestamente, no veo dónde estaría el problema a menos que estén construyendo módulos de kernel.
Fredrik
6

Para cualquier aplicación compleja, sugiero usar un contenedor lxc . Los contenedores lxc son "algo en el medio entre un chroot con esteroides y una máquina virtual completa".

Por ejemplo, aquí hay una manera de construir wine de 32 bits usando lxc en un sistema Ubuntu Trusty:

sudo apt-get install lxc lxc-templates
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
sudo lxc-start -n my32bitbox
# login as yourself
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
sudo apt-get install devscripts
sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

Aquí está la página wiki sobre cómo construir vino de 32 bits en un host de 64 bits usando lxc .

Sam Watkins
fuente
interesante. ¿Puedo usarlo para compilar atomeditor de texto para máquina de 32 bits en 64 bits?
Anwar
1
@Anwar, supongo que sí. Debería funcionar para construir cualquier cosa.
Sam Watkins,