2013-01-04 36 views
2

我試圖設置OpenSSL的patched version來使用DTLS,並且遇到了很多麻煩。我假設這是由於我對gcc和鏈接c庫缺乏瞭解。特別是,我不斷看到人們說要鏈接到lib /子文件夾,但我找不到一個用於OpenSSL的。我也是一個question on building 32 bit OpenSSL,但我正在嘗試做64位。在OSX和Ubuntu上構建修補64位OpenSSL

OSX

獲取源和補丁:

wget ftp://ftp.openssl.org/source/openssl-1.0.1c.tar.gz # get latest stable OpenSSL 
mv ~/Downloads/openssl-1.0.1c.tar.gz /usr/local/openssl-1.0.1c.tar.gz 
cd /usr/local/openssl-1.0.1c.tar.gz 
wget http://sctp.fh-muenster.de/dtls/dtls-bugs-1.0.1.patch # get the patch file 

建築物(64位,OpenSSL的默認爲32位):

export CFLAGS="-arch x86_64" 
export LDFLAGS="-arch x86_64" 
./Configure darwin64-x86_64-cC# 64 bit config command 
make # .a files should be built, great 

非常好,我有一些庫中OpenSSL根目錄:

/usr/local/openssl-1.0.1c$ ll lib* 
-rw-r--r-- 1 nflacco staff 3286136 Jan 4 12:43 libcrypto.a 
-rw-r--r-- 1 nflacco staff  260 Jan 4 12:43 libcrypto.pc 
-rw-r--r-- 1 nflacco staff 570200 Jan 4 12:43 libssl.a 
-rw-r--r-- 1 nflacco staff  275 Jan 4 12:43 libssl.pc 

現在,我將嘗試編譯a simple piece of code that uses the patched OpenSSL

~$ gcc -L /usr/local/openssl-1.0.1c -lssl -lcrypto -I /usr/local/opt/openssl/include -o server server.c 
ld: warning: _OPENSSL_ia32cap_P has different visibility (hidden) in /usr/local/openssl-1.0.1c/libcrypto.a(x86_64cpuid.o) and (default) in /usr/local/openssl-1.0.1c/libcrypto.a(cryptlib.o) 
Undefined symbols for architecture x86_64: 
    "_BIO_dgram_get_peer", referenced from: 
     _generate_cookie_callback in ccfldIrE.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [server] Error 1 

Ubuntu的

大廈:

./config 
make 

檢查庫(無視日,Ubuntu的認爲它是聖誕節):

/usr/local/openssl-1.0.1c$ ll lib* 
-rw-r--r-- 1 root root 3170340 Dec 25 17:45 libcrypto.a 
-rw-r--r-- 1 root root  264 Dec 25 17:46 libcrypto.pc 
-rw-r--r-- 1 root root 534092 Dec 25 17:45 libssl.a 
-rw-r--r-- 1 root root  279 Dec 25 17:46 libssl.pc 

而且,試圖編譯:

gcc -L /usr/local/openssl-1.0.1c -lssl -lcrypto -I /usr/local/opt/openssl/include -o server server.c 
/tmp/cc0DgDl1.o: In function `generate_cookie_callback': 
server.c:(.text+0x8b): undefined reference to `RAND_bytes' 
server.c:(.text+0xba): undefined reference to `SSL_get_rbio' 
server.c:(.text+0xdc): undefined reference to `BIO_ctrl' 
server.c:(.text+0x112): undefined reference to `CRYPTO_malloc' 
/tmp/cc0DgDl1.o: In function `main': 
server.c:(.text+0x163): undefined reference to `SSL_library_init' 
server.c:(.text+0x168): undefined reference to `SSL_load_error_strings' 
server.c:(.text+0x16d): undefined reference to `SSL_library_init' 
/tmp/cc0DgDl1.o: In function `configure_server_ssl': 
server.c:(.text+0x2f5): undefined reference to `SSL_CTX_set_cipher_list' 
server.c:(.text+0x318): undefined reference to `SSL_CTX_ctrl' 
server.c:(.text+0x333): undefined reference to `SSL_CTX_use_certificate_file' 
server.c:(.text+0x35e): undefined reference to `SSL_CTX_use_PrivateKey_file' 
server.c:(.text+0x379): undefined reference to `SSL_CTX_check_private_key' 
server.c:(.text+0x3a4): undefined reference to `SSL_CTX_set_verify' 
server.c:(.text+0x3c7): undefined reference to `SSL_CTX_ctrl' 
server.c:(.text+0x3da): undefined reference to `SSL_CTX_set_cookie_generate_cb' 
server.c:(.text+0x3ed): undefined reference to `SSL_CTX_set_cookie_verify_cb' 
/tmp/cc0DgDl1.o: In function `start_server': 
server.c:(.text+0x40b): undefined reference to `DTLSv1_server_method' 
server.c:(.text+0x413): undefined reference to `SSL_CTX_new' 
collect2: ld returned 1 exit status 

UPDATE:

在Ubuntu上我得到了它通過移動庫編譯命令結束並添加標誌-ldl用匯編編譯沒有任何警告:

gcc -L /usr/local/openssl-1.0.1c -I /usr/local/opt/openssl/include -o server server.c -lssl -lcrypto -ldl 

在OSX,這個命令與前面沒有找到_BIO_dgram_get_peer給了我同樣的錯誤。

+0

嗨,nflacco。我的Mac 10.6也有同樣的問題。你是否知道「(隱藏)警告」是關於什麼的?或者它影響什麼? –

+0

不知道警告是關於什麼! – nflacco

回答

1

你必須把最後在命令行上的庫:

gcc -L /usr/local/openssl-1.0.1c -I /usr/local/opt/openssl/include -o server server.c -lssl -lcrypto 
#                      ^^^^^^^^^^^^^^ 

有此網站解釋原因和怎麼樣了任意數量的這裏這個問題的複製品。 ld的文檔很好地解釋了它,並且是最終的參考。

+0

在Ubuntu上,這讓我成爲了那裏的一部分 - 我還需要-ldl – nflacco