2014-08-27 5 views
5

Мне нужно построить OpenSSL в OS X для 32-разрядных и 64-разрядных архитектур. Каковы параметры, которые мне нужно предоставить для ./Configure, так что я получаю его для обеих архитектур в один и тот же файл .a?Build Multiarch OpenSSL на OS X

ответ

16

./Конфигурируйте, чтобы я построил его для обеих архитектур в один и тот же файл .a?

Вы должны быть осторожны с библиотеками OpenSSL и multiarch, потому что библиотека не является многоархивой. Это связано с тем, что каждая конфигурация имеет свой собственный файл <openssl/opensslconf.h>, и каждая из платформ BIGNUM отличается.

Поставка -arch x86_64 -arch i386 приведет к сбою сборки из-за того, что команды сборки OpenSSL формируют команды. Также см. Getting libcrypto ar error while compiling OpenSSL for Mac.

Та же самая процедура, описанная ниже, относится также к iOS. Единственное, что меняется, это -arch. Для iOS вы, вероятно, используете armv7, armv7s, arm64 и i386 (для отладки 32-разрядных симуляторов) и x86_64 (для отладки 64-битного симулятора).

Существует еще один не столь очевидный трюк. OpenSSL жестко кодирует некоторые пути по умолчанию на основе --prefix и --openssldir, поэтому вам необходимо создать 32-разрядный каталог установки, установить, а затем переместить его; затем создайте 64-битный каталог установки, установите, а затем переместите его; а затем создайте жирную библиотеку в каталоге установки. Также см How to determine the default location for openssl.cnf?

Наконец, не заменить OS X поставляемого OpenSSL. OpenSSL 1.0.x и 1.1.x - это , а не, бинарный, совместимый с версией OpenSSL от Apple 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 

Headers

Вам нужно скопировать один набор заголовков (это не имеет значения, какой) , копия 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. Убедитесь, что вы используете новый охранник заголовка (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 */ 

Новый <bn.h>

Создать $HOME/ssl/include/openssl/bn.h. Убедитесь, что вы используете новый охранник заголовка (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 */ 

Библиотеки

На данный момент, у вас есть x86 сборка библиотеки, расположенной на $HOME/ssl-x86 и x64 сборки библиотеки, расположенной в $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 

Share Библиотеки

Если вы настроены 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 

Наконец, проверьте вещи. Убедитесь, что библиотеки мультиархитектурная:

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 используется в случае, если вы построили динамические библиотеки на OS X.


При желании, можно удалить без мультиархитектурная установки:

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

спасибо большое. Ты жжешь! –