2014-08-27 23 views

Odpowiedz

16

./Configure tak, aby go zbudować dla obu architektur w tym samym pliku .a?

Musisz być ostrożny z bibliotekami OpenSSL i multiarchitekturami, ponieważ biblioteka nie jest bezpieczna dla wielu użytkowników. Dzieje się tak dlatego, że każda konfiguracja ma swój własny plik <openssl/opensslconf.h>, a każda platforma to BIGNUM.

Dostarczenie -arch x86_64 -arch i386 spowoduje awarię kompilacji z powodu sposobu, w jaki system budujący OpenSSL tworzy polecenia. Zobacz także Getting libcrypto ar error while compiling OpenSSL for Mac.

Ta sama procedura opisana poniżej dotyczy również iOS. Jedyną zmianą jest -arch. W przypadku iOS prawdopodobnie użyjesz armv7, armv7s, arm64 i i386 (do 32-bitowego debugowania symulatora) i x86_64 (do 64-bitowego debugowania symulatora).

Potrzebna jest jeszcze jedna nie taka sztuczka. OpenSSL twarde kody niektóre domyślne ścieżki oparte na --prefix i --openssldir, więc musisz zbudować 32-bitowy dla katalogu instalacyjnego, zainstalować, a następnie przenieść go; następnie skompiluj 64-bitowy katalog instalacyjny, zainstaluj, a następnie przenieś go; a następnie utworzyć grubą bibliotekę w katalogu instalacyjnym. Zobacz także How to determine the default location for openssl.cnf?

Wreszcie nie zastępują OS X dostarczonej OpenSSL. OpenSSL 1.0.x i 1.1.x są nie binarne zgodne z wersją OpenSSL Apple 0.9.8. Z powodu niezgodności poniższe procedury używają $HOME/ssl. Możesz użyć /usr/local/ssl lub dowolnej innej lokalizacji, która pasuje do Twojego gustu.


Przed rozpoczęciem strona wiki OpenSSL zawiera stronę pod numerem Compilation and Installation. Istnieje wiele opcji dostarczania do config. Wybierz te, które pasują do Twojego gustu. Zawsze używam no-ssl2 i zazwyczaj używam no-ssl3, no-comp. Na urządzeniach mobilnych używam no-srp, no-psk,, no-dso i


Oto instrukcje dotyczące budowania biblioteki. Będziesz konfigurował, budował, instalował, a następnie poruszał się dla każdej architektury, którą wspierasz w swojej wielobranżowej kompilacji.

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 

Główki

Trzeba skopiować jeden zestaw nagłówków (nie ma znaczenia który) , skopiuj opensslconf-x86.h, opensslconf-x64.hbn-x86.h i bn-x64.h, utwórz nowe <openssl/opensslconf.h>, utwórz nowe <openssl/bn.h> i wreszcie utwórz biblioteki wieloarchitekturowe.

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 

New <opensslconf.h>

Jeśli tego nie uczyniły, tworzyć $HOME/ssl/include/openssl/opensslconf.h. Upewnij się używać nowego strażnika nagłówka (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 */ 

Nowy <bn.h>

Tworzenie $HOME/ssl/include/openssl/bn.h. Upewnij się używać nowego strażnika nagłówka (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 */ 

Biblioteki

W tym momencie masz kompilacji x86 biblioteki znajdującej się $HOME/ssl-x86 i kompilacji x64 biblioteki znajdującej się $HOME/ssl-x64. Łączymy je z lipo pod adresem $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 

Udział Biblioteki

Jeśli skonfigurowano z shared, to trzeba wykonać:

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 

Następnie trzeba odtworzyć 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 

Wreszcie, sprawdź rzeczy. Sprawdź, czy biblioteki są wieloarchitekturowości:

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 

A potem program testowy:

#include <openssl/opensslconf.h> 
#include <openssl/ssl.h> 

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

I:

$ 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 jest stosowany w przypadku, gdy wbudowane dynamicznych bibliotek na OS X.


W razie potrzeby można usunąć bez wieloarchitekturowości instalacje:

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

dzięki. Rządzisz! –