Ho bisogno di creare OpenSSL su OS X per architetture a 32 e 64 bit. Quali sono le opzioni che devo dare a ./Configure
in modo che venga generato per entrambe le architetture nello stesso file .a?Build Multiarch OpenSSL su OS X
risposta
./Configurare in modo che venga generato per entrambe le architetture nello stesso file .a?
È necessario fare attenzione con le librerie OpenSSL e multiarch perché la libreria non è sicura per multiarch. Questo perché ogni configurazione ha il proprio file <openssl/opensslconf.h>
e ogni piattaforma BIGNUM
è diversa.
La fornitura di -arch x86_64 -arch i386
comporterà un errore di compilazione a causa del modo in cui il sistema di generazione di OpenSSL formatta i comandi. Vedi anche Getting libcrypto ar error while compiling OpenSSL for Mac.
La stessa procedura descritta di seguito si applica anche a iOS. L'unica cosa che cambia è lo -arch
. Per iOS, probabilmente utilizzerai armv7
, armv7s
, arm64
e i386
(per il debug del simulatore a 32 bit) e x86_64
(per il debug del simulatore a 64 bit).
C'è un altro trucco non così evidente richiesto. OpenSSL codifica alcuni percorsi predefiniti basati su --prefix
e --openssldir
, quindi è necessario creare 32 bit per la directory di installazione, installare e quindi spostarlo; quindi creare 64-bit per la directory di installazione, installare e quindi spostarlo; e quindi creare la libreria di grassi nella directory di installazione. Vedere anche How to determine the default location for openssl.cnf?
Infine, non sostituire OS X in dotazione OpenSSL. OpenSSL 1.0.xe 1.1.x sono non binario compatibile con la versione 0.9.8 di OpenSSL di Apple. A causa di incompatibilità, le procedure seguenti utilizzano $HOME/ssl
. Puoi utilizzare /usr/local/ssl
o qualsiasi altra posizione che si adatta ai tuoi gusti.
Prima di iniziare, OpenSSL wiki ha una pagina su Compilation and Installation. Ci sono molte opzioni da fornire a config
. Scegli quelli che si adattano al tuo gusto. Io uso sempre no-ssl2
e di solito uso no-ssl3
, no-comp
. Sui dispositivi mobili io uso no-srp
, no-psk
, no-hw
, no-dso
e no-engines
.
Ecco le istruzioni per la creazione della libreria. Potrai configurare, costruire, installare e quindi spostare per ogni architettura che stai supportando nella tua build multiarch.
32-bit
make clean && make dclean
KERNEL_BITS=32 ./config no-ssl2 no-ssl3 --prefix=$HOME/ssl
make depend
make
make install_sw
mv $HOME/ssl/include/openssl/opensslconf.h $HOME/ssl/include/openssl/opensslconf-x86.h
mv $HOME/ssl/include/openssl/bn.h $HOME/ssl/include/openssl/bn-x86.h
mv $HOME/ssl/ $HOME/ssl-x86
64-bit
make clean && make dclean
KERNEL_BITS=64 ./config no-ssl2 no-ssl3 --prefix=$HOME/ssl
make depend
make
make install_sw
mv $HOME/ssl/include/openssl/opensslconf.h $HOME/ssl/include/openssl/opensslconf-x64.h
mv $HOME/ssl/include/openssl/bn.h $HOME/ssl/include/openssl/bn-x64.h
mv $HOME/ssl/ $HOME/ssl-x64
intestazioni
È necessario copiare una serie di intestazioni (non importa quale) , copia opensslconf-x86.h
, opensslconf-x64.h
bn-x86.h
e bn-x64.h
, creare un nuovo <openssl/opensslconf.h>
, creare un nuovo <openssl/bn.h>
e infine creare le librerie multiarch.
rm -rf $HOME/ssl
mkdir -p $HOME/ssl/bin
mkdir -p $HOME/ssl/include/openssl
mkdir -p $HOME/ssl/lib
cp $HOME/ssl-x86/openssl.cnf $HOME/ssl/openssl.cnf
cp $HOME/ssl-x86/include/openssl/* $HOME/ssl/include/openssl
cp $HOME/ssl-x86/include/openssl/opensslconf-x86.h $HOME/ssl/include/openssl/opensslconf-x86.h
cp $HOME/ssl-x64/include/openssl/opensslconf-x64.h $HOME/ssl/include/openssl/opensslconf-x64.h
cp $HOME/ssl-x86/include/openssl/bn-x86.h $HOME/ssl/include/openssl/bn-x86.h
cp $HOME/ssl-x64/include/openssl/bn-x64.h $HOME/ssl/include/openssl/bn-x64.h
Nuova <opensslconf.h>
Se non è stato fatto, creare $HOME/ssl/include/openssl/opensslconf.h
. Essere sicuri di utilizzare un nuovo header guardia (OPENSSL_MULTIARCH_CONF_HEADER
):
cat $HOME/ssl/include/openssl/opensslconf.h
#ifndef OPENSSL_MULTIARCH_CONF_HEADER
#define OPENSSL_MULTIARCH_CONF_HEADER
#if __i386 || __i386__
# include "opensslconf-x86.h"
#elif __x86_64 || __x86_64__ || __amd64 || __amd64__
# include "opensslconf-x64.h"
#else
# error Unknown architecture
#endif
#endif /* OPENSSL_MULTIARCH_CONF_HEADER */
Nuova <bn.h>
Crea $HOME/ssl/include/openssl/bn.h
. Essere sicuri di utilizzare un nuovo header guardia (OPENSSL_MULTIARCH_BN_HEADER
):
cat $HOME/ssl/include/openssl/bn.h
#ifndef OPENSSL_MULTIARCH_BN_HEADER
#define OPENSSL_MULTIARCH_BN_HEADER
#if __i386 || __i386__
# include "bn-x86.h"
#elif __x86_64 || __x86_64__ || __amd64 || __amd64__
# include "bn-x64.h"
#else
# error Unknown architecture
#endif
#endif /* OPENSSL_MULTIARCH_BN_HEADER */
Biblioteche
A questo punto, si dispone di una configurazione x86 della biblioteca situata a $HOME/ssl-x86
e una build x64 della biblioteca situata a $HOME/ssl-x64
. Li combini con lipo
allo $HOME/ssl
.
lipo -create $HOME/ssl-x86/lib/libcrypto.a \
$HOME/ssl-x64/lib/libcrypto.a \
-output $HOME/ssl/lib/libcrypto.a
lipo -create $HOME/ssl-x86/lib/libssl.a \
$HOME/ssl-x64/lib/libssl.a \
-output $HOME/ssl/lib/libssl.a
lipo -create $HOME/ssl-x86/bin/openssl \
$HOME/ssl-x64/bin/openssl \
-output $HOME/ssl/bin/openssl
Condividi Biblioteche
Se si è configurato con shared
, allora è necessario eseguire:
lipo -create $HOME/ssl-x86/lib/libcrypto.1.0.0.dylib \
$HOME/ssl-x64/lib/libcrypto.1.0.0.dylib \
-output $HOME/ssl/lib/libcrypto.1.0.0.dylib
lipo -create $HOME/ssl-x86/lib/libssl.1.0.0.dylib \
$HOME/ssl-x64/lib/libssl.1.0.0.dylib \
-output $HOME/ssl/lib/libssl.1.0.0.dylib
Quindi, è necessario ricreare le softlink:
ln -s $HOME/ssl/lib/libcrypto.dylib $HOME/ssl/lib/libcrypto.1.0.0.dylib
ln -s $HOME/ssl/lib/libssl.dylib $HOME/ssl/lib/libssl.1.0.0.dylib
Infine, prova le cose. Verificare le librerie sono multiarchitettura:
ls $HOME/ssl/lib/
libcrypto.a libssl.a
lipo -info $HOME/ssl/lib/libcrypto.a
Architectures in the fat file: $HOME/ssl/lib/libcrypto.a are: i386 x86_64
lipo -info $HOME/ssl/lib/libssl.a
Architectures in the fat file: $HOME/ssl/lib/libssl.a are: i386 x86_64
E poi un programma di test:
#include <openssl/opensslconf.h>
#include <openssl/ssl.h>
int main(int argc, char* argv[])
{
SSL_library_init();
return 0;
}
E:
$ clang -arch i386 -arch x86_64 -I $HOME/ssl/include test.c -o test.exe -L $HOME/ssl/lib -lssl -lcrypto
$ DYLD_LIBRARY_PATH=$HOME/ssl/lib; ./test.exe
$
DYLD_LIBRARY_PATH
viene utilizzato nel caso in cui hai costruito le librerie dinamiche su OS X.
Se lo si desidera, è possibile eliminare gli impianti non multiarchitettura:
rm -rf $HOME/ssl-x86
rm -rf $HOME/ssl-x64
- 1. installazione di openssl su OS X
- 2. OpenSSL cassa fallisce la compilazione su Mac OS X 10.11
- 3. Come compilare PHP 5.5.19 con OpenSSL 1.0.1 su OS X
- 4. Come compilare PHP con OpenSSL su OS X 10.9?
- 5. HsOpenSSL segfaults su OS X
- 6. sem_init su OS X
- 7. Mono su OS X: System.Data.SQLite non funziona
- 8. JNotify su Mac OS X?
- 9. xlocale rotto su OS X?
- 10. emacs su OS X 10.6
- 11. Installa pip su OS X
- 12. Mouse multipli su OS X
- 13. PyCharm - $ PATH su OS X
- 14. Oggi Widget su OS X non funziona
- 15. Problemi di installazione M2Crypto con pip su OS X/MacOS
- 16. Come posso creare OpenSSL come 32-bit (i386) su Mac OS X?
- 17. Installare libpq-dev su Mac OS X
- 18. Come installo wxPython su Mac OS X?
- 19. Impossibile installare matplotlib su Mac OS X
- 20. Correre ddd su Mac OS X 10.7.5
- 21. RVM, FSEvents e CarbonCore su OS X
- 22. nvcc + c2hs su OS X 10.9.5
- 23. Errore durante il downgrade di Ruby su OS X Mavericks
- 24. Equivalente di user32.dll su OS X
- 25. Installazione di Git su OS X
- 26. GUI Java Swing su Mac OS X
- 27. Stampa da mono su OS X
- 28. GCC senza Xcode su OS X
- 29. Installazione di readline 6.0 su OS X
- 30. Enumerazione dei browser installati su OS X
Thanks a lot. Sei forte! –