Construir o OpenSSL Multiarch no OS X

Eu preciso construir o OpenSSL no OS X para arquiteturas de 32 e 64 bits. Quais são as opções que eu preciso dar a ./Configure para que eu construa as duas arquiteturas no mesmo arquivo .a?

./Configurar para que eu construa as duas arquiteturas no mesmo arquivo .a?

Você precisa ter cuidado com as bibliotecas OpenSSL e multiarch porque a biblioteca não é multiarch segura. Isso porque cada configuração tem seu próprio arquivo , e o cada plataforma é diferente.

O fornecimento de -arch x86_64 -arch i386 resultará em uma falha de compilation devido ao modo como o sistema de compilation do OpenSSL forma comandos. Veja também Obtendo erro libcrypto ar ao compilar o OpenSSL para Mac .

O mesmo procedimento detalhado abaixo se aplica ao iOS também. A única coisa que muda é o -arch . Para iOS, você provavelmente usará armv7 , armv7s , arm64 e i386 (para debugging de simulador de 32 bits) e x86_64 (para debugging de simulador de 64 bits).

Há outro truque não tão aparente necessário. Códigos de --openssldir OpenSSL, alguns caminhos padrão baseados em --prefix e --openssldir , então você tem que construir 32 bits para o diretório de instalação, instalar e depois movê-lo; em seguida, construa 64 bits para o diretório de instalação, instale e mova-o; e, em seguida, crie a biblioteca de gordura no diretório de instalação. Veja também Como determinar o local padrão para o openssl.cnf?

Por fim, não substitua o OpenSSL fornecido pelo OS X. O OpenSSL 1.0.xe 1.1.x não são binários compatíveis com a versão 0.9.8 do OpenSSL da Apple. Devido a incompatibilidades, os procedimentos abaixo usam $HOME/ssl . Você pode usar /usr/local/ssl ou qualquer outro local que seja adequado ao seu gosto.


Antes de começar, o wiki do OpenSSL tem uma página sobre Compilação e Instalação . Há muitas opções para fornecer a config . Escolha os que melhor se adequam ao seu gosto. Eu sempre uso no-ssl2 , e geralmente uso no-ssl3 , no-comp . Em dispositivos móveis eu uso no-srp , no-psk , no-hw , no-dso e no-engines .


Aqui estão as instruções para construir a biblioteca. Você irá configurar, construir, instalar e, em seguida, mover para cada arquitetura que você está suportando em sua construção 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 

Cabeçalhos

Você precisa copiar um conjunto de headers (não importa qual), copiar opensslconf-x86.h , opensslconf-x64.h bn-x86.h bn-x64.h , criar um novo , crie um novo e, finalmente, crie as 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 

Novo

Se você não fez isso, crie $HOME/ssl/include/openssl/opensslconf.h . Certifique-se de usar um novo protetor de header ( 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 */ 

Novo

Crie $HOME/ssl/include/openssl/bn.h Certifique-se de usar um novo protetor de header ( 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

Neste ponto, você tem uma compilation x86 da biblioteca localizada em $HOME/ssl-x86 e uma compilation x64 da biblioteca localizada em $HOME/ssl-x64 . Você os combina com o lipo em $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 

Compartilhar bibliotecas

Se você configurou com shared , então você precisa executar:

 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 

Então, você precisa recriar os 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, teste as coisas. Verifique se as bibliotecas são multiarch:

 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 então um programa de teste:

 #include  #include  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 é usado caso você construa as bibliotecas dinâmicas no OS X.


Se desejar, você pode excluir as instalações não multiponto:

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