Ubuntu 10.04 LTS の場合:
/usr/bin/g++ -> g++-4.4
/usr/bin/gcc -> gcc-4.4
openssl ライブラリ (libssl.a および libssl.so) に基づく Ubuntu で 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 を正しく探していましたが、それが見つかりました。