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
Thanks a lot. Sei forte! –