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
./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.h
bn-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
Dank viel. Du schaukelst! –