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

¿Es posible comstackr un proyecto en 32 bits con cmake y gcc en un sistema de 64 bits ? Probablemente lo sea, pero ¿cómo lo hago?

Cuando lo probé de la manera “ignorante”, sin establecer parámetros / indicadores / etc, simplemente estableciendo LD_LIBRARY_PATH para encontrar las bibliotecas vinculadas en ~/tools/lib , parece ignorarlo y solo buscar en los subdirectorios llamados lib64 .

 export CFLAGS=-m32 
 $ gcc test.c -o testc
 $ file testc
 testc: ELF 64 bits LSB ejecutable, x86-64, versión 1 (SYSV), enlazado dinámicamente (utiliza bibliotecas compartidas), para GNU / Linux 2.6.9, sin depurar
 $ 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 de 32 bits ejecutable LSB, Intel 80386, versión 1 (SYSV), vinculado dinámicamente (utiliza bibliotecas compartidas), para GNU / Linux 2.6.9, no eliminado
 $ 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 bandera -m32 para comstackr un binario de 32 bits.

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

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

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

No sé de una manera de hacerlo globalmente.

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

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 crear vino de 32 bits utilizando 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 crear vino de 32 bits en un host de 64 bits usando lxc .

Para C ++, podrías hacer:

 export CXXFLAGS=-m32 

Esto funciona con cmake.