2014-08-27 11 views
5

32 비트 및 64 비트 아키텍처 용 OS X에서 OpenSSL을 빌드해야합니다. ./Configure에 제공해야하는 옵션은 무엇입니까? 두 아키텍처에서 동일한 .a 파일로 빌드되도록하려면 어떻게해야합니까?OS X에서 Multiarch OpenSSL 빌드

답변

16

./ 구성 두 아키텍처에서 동일한 .a 파일로 빌드되도록 구성하십시오.

OpenSSL 및 다중 검색 라이브러리는 다중 보관 용이므로 안전하지 않으므로주의해야합니다. 각 구성에 자체 <openssl/opensslconf.h> 파일이 있고 각 플랫폼의 BIGNUM이 다르기 때문입니다.

-arch x86_64 -arch i386을 제공하면 OpenSSL의 빌드 시스템이 명령을 작성하는 방식 때문에 빌드가 실패합니다. 또한 Getting libcrypto ar error while compiling OpenSSL for Mac을 참조하십시오.

아래에 설명 된 것과 동일한 절차가 iOS에도 적용됩니다. 변경되는 유일한 것은 -arch입니다. iOS의 경우에는 armv7, armv7s, arm64i386 (32 비트 시뮬레이터 디버그) 및 x86_64 (64 비트 시뮬레이터 디버그)을 사용하게됩니다.

또 다른 트릭이 필요합니다. OpenSSL은 --prefix--openssldir을 기반으로 일부 기본 경로를 하드 코드하므로 설치 디렉토리 용으로 32 비트를 빌드하고 설치 한 다음 이동해야합니다. 설치 디렉토리 용으로 64 비트를 빌드하고 설치 한 다음 이동하십시오. 설치 디렉토리에 fat 라이브러리를 작성하십시오. 또한 마지막으로 How to determine the default location for openssl.cnf?

, 는 OS X 용의 OpenSSL을 공급 대체하지 않습니다를 참조하십시오. OpenSSL 1.0.x 및 1.1.x는 이 아니며 Apple의 0.9.8 버전 OpenSSL과 호환되는 이진 호환입니다. 비 호환성으로 인해 아래 절차에서는 $HOME/ssl을 사용합니다. /usr/local/ssl 또는 귀하의 취향에 맞는 다른 위치를 사용할 수 있습니다. 시작하기 전에


는 OpenSSL이 위키는 Compilation and Installation에 페이지가 있습니다. config에 제공 할 수있는 옵션이 많이 있습니다. 자신의 취향에 맞는 것을 선택하십시오. 나는 항상 no-ssl2을 사용하며 보통 no-ssl3, no-comp을 사용합니다. 휴대 기기에서 나는 no-srp, no-psk, no-hw, no-dsono-engines을 사용합니다.


다음은 라이브러리를 작성하기위한 지침입니다. 다중 구성에서 지원하는 각 아키텍처를 구성, 빌드 및 설치 한 다음 이동할 것입니다.

32 비트

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 비트

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 

헤더 당신은 (는 상관 없습니다) 헤더의 한 세트를 복사해야

, 사본 opensslconf-x86.h, opensslconf-x64.hbn-x86.hbn-x64.h을 새로 만들려면 <openssl/opensslconf.h>을 새로 만들고 <openssl/bn.h>을 새로 만든 다음 마지막으로 다중 문서 라이브러리를 만듭니다.

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 

새로운 <opensslconf.h>

당신이하지 않은 경우, $HOME/ssl/include/openssl/opensslconf.h을 만들 수 있습니다. <bn.h>

$HOME/ssl/include/openssl/bn.h 만들기

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 */ 

새로운 기능 : 새로운 헤더 가드 (OPENSSL_MULTIARCH_CONF_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 */ 

라이브러리

을, 당신은 $HOME/ssl-x86에있는 라이브러리의 86 빌드 및에있는 라이브러리의 64 빌드가 $HOME/ssl-x64. lipo ($HOME/ssl)과 결합합니다.

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 
: 당신이 소프트 링크를 다시 만들어야,

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 

을 다음 : 당신이 shared로 구성 경우

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 

공유 라이브러리는

, 당신은 수행해야


마지막으로 테스트합니다.

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 

그리고 테스트 프로그램 : 확인 라이브러리는 multiarch 있습니다

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

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

: 그리고 당신은 OS X에서 동적 라이브러리를 구축하는 경우에

$ 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 사용원하는 경우


, 당신은 비 multiarch 설치를 삭제할 수 있습니다

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

덕분에 많이. 너 락! –