Build Multiarch OpenSSL en OS X

Necesito construir OpenSSL en OS X para architectures de 32 y 64 bits. ¿Cuáles son las opciones que tengo que dar a ./Configure para que lo construya para ambas architectures en el mismo archivo .a?

./Configure para que lo construya para ambas architectures en el mismo archivo .a?

Debe tener cuidado con las bibliotecas OpenSSL y multiarch porque la biblioteca no es segura para varios idiomas. Esto se debe a que cada configuración tiene su propio archivo , y BIGNUM cada plataforma es diferente.

El suministro de -arch x86_64 -arch i386 dará como resultado un error de comstackción debido a la forma en que el sistema de comstackción de OpenSSL forma comandos. Consulte también Obtener un error de libcrypto ar al comstackr OpenSSL para Mac .

El mismo procedimiento detallado a continuación se aplica a iOS, también. Lo único que cambia es el -arch . Para iOS, probablemente use armv7 , armv7s , arm64 e i386 (para la depuración del simulador de 32 bits) y x86_64 (para la depuración del simulador de 64 bits).

Hay otro truco no tan aparente requerido. OpenSSL codifica algunas rutas predeterminadas basadas en --prefix y --openssldir , por lo que debe comstackr 32 bits para el directorio de instalación, instalarlo y luego moverlo; luego construya 64 bits para el directorio de instalación, instálelo y luego muévalo; y luego crea la biblioteca fat en el directorio de instalación. Consulte también Cómo determinar la ubicación predeterminada para openssl.cnf?

Finalmente, no reemplace OS OpenSSL provisto por OS X. OpenSSL 1.0.xy 1.1.x no son compatibles con binario con la versión 0.9.8 de OpenSSL de Apple. Debido a incompatibilidades, los procedimientos a continuación usan $HOME/ssl . Puede usar /usr/local/ssl o cualquier otra ubicación que se adapte a su gusto.


Antes de comenzar, el wiki de OpenSSL tiene una página sobre comstackción e instalación . Hay muchas opciones para suministrar a la config . Elija los que se adapten a su gusto. Siempre uso no-ssl2 , y generalmente uso no-ssl3 , no-comp . En los dispositivos móviles utilizo no-srp , no-psk , no-hw , no-dso y no-engines .


Aquí están las instrucciones para construir la biblioteca. Configurará, comstackrá, instalará y luego se moverá para cada architecture que soporte en su comstackción multiarch.

32 bits

 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 bits

 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 

Encabezados

Necesita copiar un conjunto de encabezados (no importa cuál), copiar opensslconf-x86.h , opensslconf-x64.h bn-x86.h bn-x64.h , crear un nuevo , cree un nuevo , y finalmente cree las bibliotecas 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 

Nuevo

Si no lo ha hecho, cree $HOME/ssl/include/openssl/opensslconf.h . Asegúrese de utilizar un nuevo protector de encabezado ( 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 */ 

Nuevo

Crea $HOME/ssl/include/openssl/bn.h Asegúrese de utilizar un nuevo protector de encabezado ( 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 */ 

Bibliotecas

En este punto, tiene una versión x86 de la biblioteca ubicada en $HOME/ssl-x86 y una versión x64 de la biblioteca ubicada en $HOME/ssl-x64 . Los combinas con lipo en $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 

Bibliotecas compartidas

Si configuró con shared , entonces necesita realizar:

 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 

Luego, necesitas recrear los softlinks:

 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 

Finalmente, prueba cosas. Verifique que las bibliotecas sean multiarquía:

 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 

Y luego un progtwig de prueba:

 #include  #include  int main(int argc, char* argv[]) { SSL_library_init(); return 0; } 

Y:

 $ 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 se usa en caso de que haya creado las bibliotecas dinámicas en OS X.


Si lo desea, puede eliminar las instalaciones que no sean multiarch:

 rm -rf $HOME/ssl-x86 rm -rf $HOME/ssl-x64