2014-09-25 104 views
2

我試圖從SSL客戶端程序調用方法SSL_export_keying_material()。但是,調用此方法會導致程序編譯失敗。我收到以下錯誤。我怎麼能過來這個編譯錯誤?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。默認情況下,蘋果提供的版本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選項可用。有關詳細信息,請參閱OpenSSL wiki上的Compilation and Installation

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 

之後,確保您編譯並鏈接到/usr/local/ssl中的OpenSSL設備。


此外,蘋果接頭忽略LD_PRELOAD-Bstatic-Wl,--rpath。是當然使用DYLD_LIBRARY_PATH(OS X相當於LD_PRELOAD)。否則,您將編譯1.0.1(從/usr/local/ssl),但在運行時與0.9.8(從/usr/lib)鏈接。有關Apple運行時鏈接編輯器的一些信息,請參閱dyld(1)

如果您針對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

Assert提供了一個錯誤,雖然:體系結構x86_64的未定義符號:「_ASSERT」,引用來自:_main在withssl-b70c9a.o ld:符號(s)未找到架構x86_64 – user340 2014-09-25 12:25:51

+3

@kani --'ASSERT'是我的自定義斷言。如果你沒有,使用'#define ASSERT(x)assert(x)'。然後包括''或''。您可以閱讀OWASP [基於C的工具鏈強化](http://www.owasp.org/index.php/C-Based_Toolchain_Hardening#ASSERT)使用的ASSERT。實際上,在調試版本中,我的'ASSERT'調用'SIGTRAP'(捕捉調試器)而不是'SIGABRT'(以殺死程序)。 – jww 2014-09-25 14:12:32

+0

Thannx現在修好了! – user340 2014-09-25 14:38:43