OS X

2014-08-27 12 views
5
üzerinde Multiarch OpenSSL oluşturma

32 ve 64 bit mimariler için OS X üzerinde OpenSSL oluşturmam gerekiyor. ./Configure'a vermem gereken seçenekler nelerdir, böylece her iki mimariye de aynı .a dosyasına gömülür mü?OS X

cevap

16

./Yapılandırmayı, her iki mimaride de aynı .a dosyasına yerleştirmemi sağlayın. Kütüphane çok kanallı olmadığından, OpenSSL ve çoklu arşiv kitaplıklarına dikkat etmeniz gerekir. Bunun nedeni, her yapılandırmanın kendi <openssl/opensslconf.h> dosyasına sahip olması ve her bir platformun BIGNUM farklı olmasıdır.

-arch x86_64 -arch i386 temini çünkü OpenSSL inşa sistem komutlarını oluşturan yol birikimi başarısızlıkla sonuçlanacaktır. Ayrıca bkz. Getting libcrypto ar error while compiling OpenSSL for Mac.

aşağıda ayrıntılı Aynı yöntem, iOS için geçerlidir. Değişen tek şey -arch. iOS için, muhtemelen armv7, armv7s, arm64 ve i386 (64-bit simülatör ayıklama için) ve x86_64 (32-bit simülatör ayıklama için) kullanacağız.

gerekli başka değil çok belirgin numara yok. OpenSSL sabit kodları, --prefix ve --openssldir tabanlı bazı varsayılan yolları, bu nedenle kurulum dizini için 32 bit oluşturmalı, kurmalı ve sonra taşımalısınız; daha sonra yükleme dizini için 64 bit kurun, yükleyin ve taşıyın; ve daha sonra yükleme dizinindeki yağ kitaplığını oluşturun. Ayrıca Nihayet How to determine the default location for openssl.cnf?

, OS X en OpenSSL'yi verilen yerini görüyorum. OpenSSL 1.0.x ve 1.1.x, Apple'ın 0.9.8 sürümü OpenSSL ile uyumlu olan numaralı değil. Uyumsuzluklardan dolayı, aşağıdaki prosedürler $HOME/ssl'u kullanır. /usr/local/ssl veya zevkinize uygun başka bir yer kullanabilirsiniz. Başlamadan önce


, OpenSSL wiki Compilation and Installation bir sayfası vardır. config ürününe tedarik edilecek birçok seçenek var. Zevke uygun olanları seçin. Her zaman no-ssl2 kullanın ve genellikle no-ssl3, no-comp kullanın. Mobil cihazlarda ben no-srp, no-psk, no-hw, no-dso ve no-engines kullanın.


Kitaplığı oluşturmak için yönergeler aşağıda verilmiştir. Çok aşamalı yapınızda desteklediğiniz her bir mimari için yapılandırma, oluşturma, yükleme ve taşıma yapacaksınız.

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 

Başlıkları Sen (hangisi olduğu önemli değil) başlıklarından bir set kopyalamanız gerekir

, kopya opensslconf-x86.h, opensslconf-x64.hbn-x86.h ve bn-x64.h, yeni bir <openssl/opensslconf.h> oluşturun, yeni bir <openssl/bn.h> oluşturun ve sonunda çoklu kitaplık kitaplıklarını oluşturun.

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 

Yeni <opensslconf.h>

bunu yapmadıysanız, $HOME/ssl/include/openssl/opensslconf.h oluşturun. <bn.h>

$HOME/ssl/include/openssl/bn.h oluştur

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

Yeni: Yeni bir başlık bekçi (OPENSSL_MULTIARCH_CONF_HEADER) kullandığından emin olun. Yeni bir başlık bekçi (OPENSSL_MULTIARCH_BN_HEADER) kullandığından emin olun: Bu noktada

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

Kütüphaneler

, sen $HOME/ssl-x86 bulunan kütüphanenin bir x86 yapı ve yer kütüphanenin bir x64 yapı var $HOME/ssl-x64. Bunları $HOME/ssl numaralı telefondan lipo ile birleştirirsiniz.

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 
: Eğer sembolik bağlantıları yeniden oluşturmanız gerekir,

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 

Ardından: Eğer shared ile yapılandırılan Eğer

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 

Hisse Kütüphaneler

, o zaman gerçekleştirmek için gereken


Son olarak, şeyleri test edin.

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 

Ve sonra bir test programı: doğrulama kütüphaneleri multiarch olan

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

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

Ve: Eğer OS X'te dinamik kütüphaneleri inşa durumda

$ 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 kullanılırİstenirse


, olmayan multiarch yüklemeleri silebilirsiniz:

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

sayesinde çok. Harikasın! –