在 Ubuntu 10.04 LTS 上:
/usr/bin/g++ -> g++-4.4
/usr/bin/gcc -> gcc-4.4
我正在 Ubuntu 中编写一个基于 openssl 库(libssl.a 和 libssl.so)的 libssl_ext 库当我输入
$nm -C -defined-only -g libssl_ext.so
我可以看到定义了以下符号
00005140 D SSLv3_enc_data_Ext
**00002800 T SSLv3_server_method_Ext**
00005174 A __bss_start
00005174 A _edata
0000517c A _end
00003aa8 T _fini
00001954 T _init
00002d70 T ssl3_accept_Ext
00002480 T ssl3_enc_Ext
00002850 T ssl3_get_client_key_exchange_Ext
000026f0 T ssl3_write_Ext
00002320 T ssl3_write_bytes_Ext
当我输入:
$nm -C -defined-only -g libssl.so
我可以看到定义了以下符号
....
00018930 T SSLv3_client_method
00050600 D SSLv3_enc_data
00013640 T SSLv3_method
**00013690 T SSLv3_server_method**
00026f40 T TLSv1_client_method
000506c0 D TLSv1_enc_data
00026ea0 T TLSv1_method
00026ef0 T TLSv1_server_method
.....
当我在 server.cpp 代码中调用 SSLv3_server_method_Ext 时,它有一个问题:
server.cpp:70: undefined reference to SSLv3_server_method_Ext()
当我输入:
$ nm -C --undefined-only -g server.o
它显示以下内容:
U CRYPTO_free
U ERR_print_errors_fp
U SSL_CIPHER_get_name
U SSL_CTX_ctrl
U SSL_CTX_free
U SSL_CTX_new
U SSL_CTX_set_cipher_list
U SSL_accept
U SSL_free
U SSL_get_current_cipher
U SSL_get_error
U SSL_get_peer_certificate
U SSL_get_version
U SSL_library_init
U SSL_new
U SSL_read
U SSL_set_fd
U SSL_shutdown
U SSL_write
**U SSLv3_server_method**
U X509_NAME_oneline
U X509_free
**U SSLv3_server_method_Ext()**
U __gxx_personality_v0
U accept
U bind
U close
U exit
U htons
U inet_ntoa
U listen
U memset
U perror
U printf
U puts
U socket
U stderr
当我将libssl.so 中的 SSLv3_server_method 与 server.o链接时存在差异,它显示为“U SSLv3_server_method”并且可以与 libssl.so 成功链接。但是,当我将libssl_ext.so 中的 SSLv3_server_method_Ext 与 server.o链接时,它显示为“U SSLv3_server_method_Ext()”,并且由于未定义对 SSLv3_server_method_Ext() 的引用而失败
如果有人向我解释为什么 server.o 正在寻找 SSLv3_server_method_Ext() 而不是 SSLv3_server_method_Ext以及如何解决这个问题?当我调用 libssl.so 并找到它时,链接器正在正确查找 SSLv3_server_method。