2014-08-27 7 views
5

पर मल्टीआर्क ओपनएसएसएल बनाएं 32 मुझे 64 और 64 बिट आर्किटेक्चर के लिए ओएस एक्स पर ओपनएसएसएल बनाने की जरूरत है। मुझे ./Configure को देने के लिए क्या विकल्प हैं ताकि मैं इसे दोनों आर्किटेक्चर के लिए उसी .a फ़ाइल में बनाया हो?ओएस एक्स

उत्तर

16

./ कॉन्फ़िगर करें ताकि मैं इसे दोनों आर्किटेक्चर के लिए उसी .a फ़ाइल में बनाया हो?

आपको ओपनएसएसएल और बहुआयामी पुस्तकालयों से सावधान रहना होगा क्योंकि पुस्तकालय बहुआयामी सुरक्षित नहीं है। ऐसा इसलिए है क्योंकि प्रत्येक कॉन्फ़िगरेशन की अपनी <openssl/opensslconf.h> फ़ाइल होती है, और प्रत्येक प्लेटफ़ॉर्म का BIGNUM अलग होता है।

-arch x86_64 -arch i386 की आपूर्ति के परिणामस्वरूप ओपनएसएसएल के निर्माण प्रणाली के आदेशों के कारण बिल्ड विफलता होगी। Getting libcrypto ar error while compiling OpenSSL for Mac भी देखें।

नीचे दी गई एक ही प्रक्रिया आईओएस पर भी लागू होती है। परिवर्तन की एकमात्र चीज -arch है। आईओएस के लिए, आप शायद armv7, armv7s, arm64 और i386 (32-बिट सिम्युलेटर डीबग के लिए) और x86_64 (64-बिट सिम्युलेटर डीबग के लिए) का उपयोग करेंगे।

एक और स्पष्ट-स्पष्ट चाल की आवश्यकता नहीं है। OpenSSL हार्ड कोड --prefix और --openssldir पर आधारित कुछ डिफ़ॉल्ट पथ हैं, इसलिए आपको स्थापना निर्देशिका के लिए 32-बिट बनाना, इंस्टॉल करना और फिर इसे स्थानांतरित करना है; फिर स्थापना निर्देशिका के लिए 64-बिट बनाएं, स्थापित करें, और फिर इसे स्थानांतरित करें; और उसके बाद स्थापित निर्देशिका में वसा पुस्तकालय बनाएँ। इसके अलावा How to determine the default location for openssl.cnf?

अंत में, की जगह नहीं करते ओएस एक्स के OpenSSL आपूर्ति को देखते हैं। OpenSSL 1.0.x और 1.1.x ओपनएसएसएल के ऐप्पल के 0.9.8 संस्करण के साथ बाइनरी संगत नहीं हैं। असंगतताओं के कारण, नीचे दी गई प्रक्रिया $HOME/ssl का उपयोग करती है। आप /usr/local/ssl या अपने स्वाद के अनुरूप किसी भी अन्य स्थान का उपयोग कर सकते हैं।


आरंभ करने से पहले जो OpenSSL विकी Compilation and Installation पर एक पृष्ठ है। config पर आपूर्ति करने के लिए बहुत सारे विकल्प हैं। अपने स्वाद के अनुरूप जो चुनें। मैं हमेशा no-ssl2 का उपयोग करता हूं, और आमतौर पर no-ssl3, no-comp का उपयोग करता हूं। मोबाइल उपकरणों पर मैं no-srp, no-psk, no-hw, no-dso और no-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.h और bn-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 पैदा करते हैं।

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

न्यू <bn.h>

$HOME/ssl/include/openssl/bn.h बनाएँ: आप एक नया हैडर गार्ड (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 पर उन्हें गठबंधन करते हैं।

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 

शेयर पुस्तकालय

आप shared के साथ विन्यस्त हैं, तो आप करने की आवश्यकता:

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 

उसके बाद, आप 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 

अंत में, चीजों का परीक्षण करें। सत्यापित करें पुस्तकालयों 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 

और फिर एक परीक्षण कार्यक्रम:

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

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

और:

$ 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 मामले में आप ओएस एक्स पर गतिशील पुस्तकालयों का निर्माण किया जाता है

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

बहुत बहुत शुक्रिया:


अगर वांछित, आप गैर multiarch प्रतिष्ठानों हटा सकते हैं। आपने धमाल मचाया! –