2014-08-27 18 views
5

Ich muss OpenSSL auf OS X für 32 und 64-Bit-Architekturen erstellen. Was sind die Optionen, die ich ./Configure geben muss, damit ich es für beide Architekturen in derselben .a-Datei erstellen kann?Build Multiarch OpenSSL unter OS X

Antwort

16

./Konfigurieren, damit ich es für beide Architekturen in derselben .a-Datei erstellen kann?

Sie müssen mit OpenSSL- und Multiarch-Bibliotheken vorsichtig sein, da die Bibliothek nicht multiarchsicher ist. Das liegt daran, dass jede Konfiguration ihre eigene <openssl/opensslconf.h>-Datei hat und dass jede Plattform BIGNUM anders ist.

Die Bereitstellung von -arch x86_64 -arch i386 führt aufgrund der Art und Weise, wie das OpenSSL-Buildsystem Befehle formt, zu einem Buildfehler. Siehe auch Getting libcrypto ar error while compiling OpenSSL for Mac.

Das unten beschriebene Verfahren gilt auch für iOS. Die einzige Sache, die sich ändert, ist die -arch. Für iOS werden Sie wahrscheinlich armv7, armv7s, arm64 und i386 (für 32-Bit-Simulator-Debug) und x86_64 (für 64-Bit-Simulator-Debug) verwenden.

Es ist ein weiterer nicht so scheinbarer Trick erforderlich. OpenSSL hard-code einige Standardpfade basierend auf --prefix und --openssldir, so müssen Sie 32-Bit für das Installationsverzeichnis erstellen, installieren und dann verschieben; Erstellen Sie dann 64-Bit für das Installationsverzeichnis, installieren Sie es und verschieben Sie es dann; und erstellen Sie dann die Fettbibliothek im Installationsverzeichnis. Siehe auch How to determine the default location for openssl.cnf?

Schließlich nicht ersetzen OS X geliefert OpenSSL. OpenSSL 1.0.x und 1.1.x sind nicht binär kompatibel mit der Version 0.9.8 von Apple OpenSSL. Aufgrund von Inkompatibilitäten verwendet das folgende Verfahren $HOME/ssl. Sie können /usr/local/ssl oder einen anderen Ort verwenden, der Ihrem Geschmack entspricht.


Bevor Sie beginnen, hat OpenSSL Wiki eine Seite auf Compilation and Installation. Es gibt viele Möglichkeiten, config zu liefern. Wählen Sie die aus, die Ihrem Geschmack entsprechen. Ich verwende immer no-ssl2 und verwende normalerweise no-ssl3, no-comp. Auf Mobilgeräten verwende ich no-srp, no-psk, no-hw, no-dso und no-engines.


Hier sind die Anweisungen zum Erstellen der Bibliothek. Sie konfigurieren, erstellen, installieren und verschieben dann für jede Architektur, die Sie in Ihrem Multiarch-Build unterstützen.

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 

Headers

Sie benötigen einen Satz von Headern zu kopieren (es ist egal, welche) , Kopie , opensslconf-x64.hbn-x86.h und bn-x64.h, erstellen Sie eine neue <openssl/opensslconf.h>, erstellen Sie eine neue <openssl/bn.h>, und erstellen Sie schließlich die Multiarch-Bibliotheken.

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>

Wenn Sie dies noch nicht getan haben, erstellen Sie $HOME/ssl/include/openssl/opensslconf.h. Seien Sie sicher, dass Sie einen neuen Header Wache verwenden (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 */ 

New <bn.h>

$HOME/ssl/include/openssl/bn.h erstellen. Seien Sie sicher, dass Sie einen neuen Header Wache verwenden (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 */ 

Bibliotheken

An diesem Punkt haben Sie eine x86-Version von der Bibliothek an $HOME/ssl-x86 befindet und eine x64-Erstellung der Bibliothek befindet sich auf $HOME/ssl-x64. Sie kombinieren sie mit lipo um $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 

Teilen Bibliotheken

Wenn Sie mit shared konfiguriert, dann müssen Sie ausführen:

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 

Dann müssen Sie die Softlinks neu:

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 

Schließlich testen Sie die Dinge. Stellen Sie sicher, die Bibliotheken sind 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 

Und dann ein Testprogramm:

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

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

Und:

$ 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 verwendet wird, falls Sie die dynamischen Bibliotheken auf OS X eingebaut


Falls gewünscht, können Sie die nicht-multiarch Installationen löschen:

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

Dank viel. Du schaukelst! –