2014-08-27 13 views
5

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

16

./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.hbn-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 
+0

Thanks a lot. Sei forte! –