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


129

È possibile compilare un progetto a 32 bit con cmakee gccsu un sistema a 64 bit ? Probabilmente lo è, ma come posso farlo?

Quando l'ho provato in modo "ignorante", senza impostare alcun parametro / flag / etc, solo l'impostazione LD_LIBRARY_PATHper trovare le librerie collegate ~/tools/libsembra ignorarla e cercare solo nelle sottodirectory denominate lib64 .


1
Sarebbe sufficiente passare il flag -m32 a gcc? Come lo farei quindi in cmake?
dala,

Risposte:


124
export CFLAGS=-m32

2
Dovrebbe farlo. Si potrebbe anche modificare lo script CMake per creare un target a 32 bit - sarebbe sufficiente aggiungere -m32alla CFLAGS, probabilmente da impostazione CMAKE_REQUIRED_FLAGS.
Caf

5
Bene, il problema è che questo ovviamente non è necessariamente sufficiente. Potrebbe essere necessario modificare anche il linker!
lpapp,

6
Cosa exportsignifica? Dove appartiene? I file di intestazione? Il makefile? No, assolutamente non una risposta per me come un principiante.
Tomáš Zato - Ripristina Monica il

1
@ TomášZato: al prompt della shell, prima di invocare cmake(comunque nel tuo caso, se hai un Makefile, dovresti makeinvece utilizzare ).
Caf

4
@caf, potresti per favore approfondire la tua risposta? La tua risposta è molto concisa e non spiega nulla.
Bulat M.,

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

In breve: utilizzare il -m32flag per compilare un file 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)


1
Grazie mille! Sì, ho versioni a 32 bit delle dipendenze.
dala,

6
Come posso installare le versioni a 32 bit delle librerie?
Tomáš Zato - Ripristina Monica il

2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch,

16

Nelle versioni successive di CMake, un modo per farlo su ogni destinazione è:

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

Non conosco un modo per farlo a livello globale.


+1. Sto cercando di creare taglib a 32 bit ( developer.kde.org/~wheeler/taglib.html ) su un leopardo delle nevi a 64 bit. Questo funziona per me.
Edward

3
... per farlo a livello globale:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas,

7

Per C ++, puoi fare:

export CXXFLAGS=-m32

Funziona con cmake.


6

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


2
È un po 'estremo configurare un ambiente chroot solo per creare app a 32 bit, non è vero? Qualche motivo particolare per cui lo consigli?
Fredrik,

3
Ti dà un ambiente completo in cui eseguire anche il codice. Lo usiamo per creare (ed eseguire) binari a 32 bit completi su host a 64 bit - a volte ottieni solo build a 32 bit di librerie di terze parti. Per il lavoro Debian, lo usiamo per creare pacchetti a 32 bit su host a 64 bit.
Dirk Eddelbuettel,

Non ho mai avuto problemi di costruzione e funzionamento di binari a 32 bit su Linux, Solaris e altre piattaforme a 64 bit. Ma non sto usando molto Debian.
Fredrik,

Frederik, li distribuisci anche a 32 bit sull'host di build a 64 bit?
Dirk Eddelbuettel,

@Dirk: i binari a 32 bit funzionano su macchine a 32 e 64 bit (ovviamente), i binari a 64 bit funzionano solo su macchine a 64 bit. Non importa se si tratta di una macchina cliente o di un host di build. Onestamente non vedo dove sarebbe il problema a meno che non si tratti di moduli del kernel che stai costruendo.
Fredrik,

6

Per qualsiasi applicazione complessa, suggerisco di usare un contenitore lxc . I contenitori lxc sono "qualcosa nel mezzo tra un chroot di steroidi e una macchina virtuale a tutti gli effetti".

Ad esempio, ecco un modo per costruire wine 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 costruire wine a 32 bit su un host a 64 bit usando lxc .


interessante. Posso usarlo per compilare un atomeditor di testo per 32 bit in una macchina a 64 bit?
Anwar,

1
@Anwar, credo di si. Dovrebbe funzionare per costruire qualsiasi cosa.
Sam Watkins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.