Potrzebuję zbudować OpenSSL na OS X dla architektur 32- i 64-bitowych. Jakie opcje muszę podać dla ./Configure
, aby utworzyć je dla obu architektur w tym samym pliku .a?Tworzenie Multiarch OpenSSL na OS X
Odpowiedz
./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.h
bn-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
dzięki. Rządzisz! –