2014-09-25 9 views
2

Я пытаюсь вызвать метод SSL_export_keying_material() из программы клиента SSL. Однако вызов этого метода завершает компиляцию программы. Я получаю следующую ошибку. Как я могу пройти эту ошибку компиляции?Проблема с компиляцией OpenSSL с SSL_export_keying_material()

clang -cc1 version 5.1 based upon LLVM 3.4svn default target x86_64-apple-darwin13.2.0 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/include 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include 
/usr/include 
/System/Library/Frameworks (framework directory) 
/Library/Frameworks (framework directory) 
End of search list. 
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.9.0 -o withssl -lssl -lcrypto /var/folders/1b/smlgh1256t95yw11pqs2hz380000gn/T/withssl-08785c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.osx.a 
Undefined symbols for architecture x86_64: 
    "_SSL_export_keying_material", referenced from: 
     _main in withssl-08785c.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 

Спасибо

ответ

4

Как я могу прийти через эту ошибку компиляции?

Вам необходимо установить последнюю версию OpenSSL. По умолчанию, Apple предоставляет версии 0.9.8 и не поставляет SSL_export_keying_material:

$ nm /usr/lib/libssl.dylib | grep SSL_export_keying_material 
$ 

И вот из моей копии 1.0.1i:

$ nm /usr/local/ssl/macosx-x64/lib/libssl.a | grep SSL_export_keying_material 
... 
0000000000002810 T _SSL_export_keying_material 
00000000000068c8 S _SSL_export_keying_material.eh 

Вот как для загрузки и установки OpenSSL 1.0.1i в /usr/local/ssl. Возможны и другие варианты: config. См. Compilation and Installation в вики Wiki для OpenSSL.

wget https://www.openssl.org/source/openssl-1.0.1i.tar.gz 
tar xzf openssl-1.0.1i.tar.gz 
cd openssl-1.0.1i 
export KERNEL_BITS=64 
./config enable-ec_nistp_64_gcc_128 --openssldir=/usr/local/ssl 
make 
sudo make install 

После этого, убедитесь, что вы собираете и ссылку на шестерню OpenSSL в /usr/local/ssl.


Кроме того, Apple, линкеры игнорировать LD_PRELOAD, -Bstatic и -Wl,--rpath. Be обязательно использовать DYLD_LIBRARY_PATH (OS X эквивалент LD_PRELOAD). В противном случае вы будете скомпилировать против 1.0.1 (от /usr/local/ssl), но свяжетесь против 0.9.8 (от /usr/lib) во время выполнения. См. dyld(1) для получения дополнительной информации о редакторе ссылок среды выполнения Apple.

Если вы скомпилируете против 1.0.1, но время исполнения - 0.9.8, вы столкнетесь с необъяснимыми авариями. Причина не совсем очевидна, но из-за того, что 0.9.8 и 1.0.1 являются не бинарный совместимый.

я обычно бросить это в мой код, чтобы защититься от него:

long version = SSLeay(); 
ASSERT(version == OPENSSL_VERSION_NUMBER); 
if (version != OPENSSL_VERSION_NUMBER) 
{ 
    /* Handle incorrect version at runtime */ 
} 

Код выше проверяет, что время компиляции версия совпадает с версией среды выполнения.

+0

Ассерт дает сообщение об ошибке: Неопределенные символы для архитектуры x86_64: «_ASSERT», на которые ссылаются: _main in withssl-b70c9a.o ld: символы (символы) не найдены для архитектуры x86_64 – user340

+3

@kani - 'ASSERT' мой custom assert. Если у вас его нет, используйте '#define ASSERT (x) assert (x)'. Затем включите '' или' '. Вы можете прочитать об ASSERT, который я использую в OWASP [C-Based Toolchain Hardening] (http://www.owasp.org/index.php/C-Based_Toolchain_Hardening#ASSERT). Фактически, в отладочных сборках мой 'ASSERT' вызывает' SIGTRAP' (чтобы привязать отладчик), а не 'SIGABRT' (чтобы убить программу). – jww

+0

Thannx исправлено сейчас! – user340