Si può compilare a 32 bit di Apache DSO (Oracle HTTP Server) su una macchina a 64 bit?
-
22-08-2019 - |
Domanda
Ho migrato un database Oracle e server HTTP Oracle installano da una macchina a 32 bit ad una macchina a 64-bit - entrambe le macchine con Linux. Oracle Database è a 64 bit, ma il (Apache) server HTTP è a 32 bit.
Faccio uso di alcune non-Oracle DSO (mod_ntlm per uno), ma ogni volta che ho eseguito lo standard "make install" tipo cosa che finisce con un modulo a 64 bit.
C'è un modo standard per compilare moduli di Apache a 32 bit su un computer a 64 bit?
Soluzione
In alternativa alla risposta di Andrew Medico, utilizzare '-m32
' per le compilation a 32 bit e '-m64
' per le compilation a 64 bit su PPC o macchine SPARC o Intel - dal momento che in realtà non accennate quale architettura dei chip si sta utilizzando e che la notazione funziona su tutti questi.
Io uso spesso:
CC="gcc -m32" ./configure
al fine di garantire una compilazione a 32 bit (o, più frequentemente, CC="gcc -m64"
per garantire a 64 bit di compilazione).
Domanda: "CC è una variabile di ambiente utilizzato da make"
Risposta: Sì, anche se in questo caso, è anche riconosciuto da configure
, che è uno script di shell generato da autoconf
. La notazione che ho usato - che è quello che uso a riga di comando - imposta CC nell'ambiente, mentre il comando configure
viene eseguito. L'altra risposta suggerisce di utilizzare:
./configure CC="gcc -m32"
Presumo che funziona e raggiunge più o meno lo stesso effetto; Io non ho provato quindi non so che funziona.
Se si esegue ./configure --help | less
, vedrete le informazioni (spesso solo informazioni standard) su come utilizzare lo script. E alla fine, elencherà (alcune) variabili d'ambiente rilevanti, di cui è uno CC.
Il vantaggio di impostare il compilatore C per "gcc -m32" è che la bandiera a 32 bit viene impostato ogni volta che il compilatore è utilizzato - c'è ben poco spazio per farlo andare male. Se si imposta un flag variabile (CFLAGS, ecc), c'è la possibilità che qualche comando non usarlo, e poi le cose possono andare a monte.
Inoltre, tornando alla domanda, make
utilizza certamente una variabile (macro) chiamato CC. Ed è possibile impostare che sulla riga di comando make:
make CC="gcc -m32"
che si sostituiscono ad impostazione nel makefile. Al contrario, utilizzando una variabile di ambiente, l'impostazione nel makefile sostituisce il valore nell'ambiente, così modificando CC come una variabile ambiente è meno utile. Anche se make -e
dà all'ambiente la precedenza sul makefile, di solito è una scelta pericolosa da usare -. Può avere inaspettati effetti collaterali
Altri suggerimenti
./configure CFLAGS="-march=i686"
dovrebbe farlo
Insieme con la bandiera -m32 nel GCC, potrebbe essere necessario includere il flag -melf_i386 per ld a collegare correttamente i file oggetto a 32 bit per le librerie a 32bit se si dispone di entrambe le librerie a 32bit e 64bit. La ld standard su scatole a 64 bit di Linux imposterà le librerie a 64 bit e si ottiene un errore di compatibilità quando si verifica il collegamento.