Come compilare un binario a 32 bit su una macchina Linux a 64 bit con gcc / cmake

È ansible compilare un progetto a 32 bit con cmake e gcc su un sistema a 64 bit ? Probabilmente lo è, ma come faccio?

Quando ho provato il modo “ignorante”, senza impostare alcun parametro / flag / ecc, impostando semplicemente LD_LIBRARY_PATH per trovare le librerie collegate in ~/tools/lib sembra ignorarlo e cercare solo nelle sottodirectory lib64 .

 export CFLAGS=-m32 
 $ gcc test.c -o testc
 $ file testc
 testc: eseguibile LSB ELF a 64 bit, x86-64, versione 1 (SYSV), collegato dynamicmente (utilizza librerie condivise), per GNU / Linux 2.6.9, non spogliato
 $ 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: eseguibile LSB ELF a 32 bit, Intel 80386, versione 1 (SYSV), collegato dynamicmente (utilizza librerie condivise), per GNU / Linux 2.6.9, non spogliato
 $ ldd testc
     linux-gate.so.1 => (0x009aa000)
     libc.so.6 => /lib/libc.so.6 (0x00780000)
     /lib/ld-linux.so.2 (0x0075b000)

In breve: usa il flag -m32 per compilare un binario a 32 bit.

Inoltre, assicurati di aver installato le versioni a 32 bit di tutte le librerie richieste (nel mio caso tutto ciò di cui avevo bisogno su Fedora era glibc-devel.i386)

Nelle versioni successive di CMake, un modo per farlo su ciascun target è:

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

Non conosco un modo per farlo globalmente.

Un modo è configurare un ambiente chroot. Debian ha un numero di strumenti per questo, ad esempio debootstrap

Per qualsiasi applicazione complessa, suggerisco di usare un contenitore lxc . I contenitori lxc sono “qualcosa nel mezzo tra un chroot sugli steroidi e una macchina virtuale completa”.

Ad esempio, ecco un modo per build vino a 32 bit usando lxc su 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 

Ecco la pagina wiki su come build il vino a 32 bit su un host a 64 bit usando lxc .

Per C ++, puoi fare:

 export CXXFLAGS=-m32 

Funziona con cmake.