コンパイル時のエラー その1

 某ソースコードコンパイルに手間取ったのでメモ。
以下が1つめのエラー

root@pide-virtual-machine:/tmp# ls
openssl-too-open.tar.gz
root@pide-virtual-machine:/tmp# tar zxvf openssl-too-open.tar.gz
openssl-too-open/
openssl-too-open/Makefile
openssl-too-open/main.h
openssl-too-open/ssl2.c
openssl-too-open/ssl2.h
openssl-too-open/main.c
openssl-too-open/linux-x86.c
openssl-too-open/README
openssl-too-open/scanner.c
root@pide-virtual-machine:/tmp# cd openssl-too-open
root@pide-virtual-machine:/tmp/openssl-too-open# make
gcc -g -O0 -Wall -c main.c
In file included from main.c:26:0:
ssl2.h:38:2: エラー: 不明な型名 ‘RC4_KEY’ です
ssl2.h:39:2: エラー: 不明な型名 ‘RC4_KEY’ です
make: *** [main.o] エラー 1

ssl2.hのヘッダーファイルに以下を追加すると解決する。

#include <openssl/rc4.h>

以下が2つめのエラー

root@pide-virtual-machine:/tmp/openssl-too-open# make
gcc -g -O0 -Wall -c ssl2.c
ssl2.c: 関数 ‘read_ssl_packet’ 内:
ssl2.c:192:7: エラー: ‘MD5_DIGEST_LENGTH’ が宣言されていません (この関数内での最初の使用)
ssl2.c:192:7: 備考: 未宣言の識別子は出現した各関数内で一回のみ報告されます
ssl2.c: 関数 ‘send_ssl_packet’ 内:
ssl2.c:234:2: エラー: 不明な型名 ‘MD5_CTX’ です
ssl2.c:239:23: エラー: ‘MD5_DIGEST_LENGTH’ が宣言されていません (この関数内での最初の使用)
ssl2.c:257:3: 警告: 関数 ‘MD5_Init’ の暗黙的な宣言です [-Wimplicit-function-declaration]
ssl2.c:258:3: 警告: 関数 ‘MD5_Update’ の暗黙的な宣言です [-Wimplicit-function-declaration]
ssl2.c:261:3: 警告: 関数 ‘MD5_Final’ の暗黙的な宣言です [-Wimplicit-function-declaration]
ssl2.c: 関数 ‘get_server_hello’ 内:
ssl2.c:379:2: 警告: 互換性のないポインタ型から 2 番目の ‘d2i_X509’ の引数に渡しています [デフォルトで有効]
In file included from /usr/include/openssl/ssl.h:156:0,
                 from ssl2.c:25:
/usr/include/openssl/x509.h:839:1: 備考: expected ‘const unsigned char **’ but argument is of type ‘unsigned char **’
ssl2.c: 関数 ‘generate_key_material’ 内:
ssl2.c:498:2: エラー: 不明な型名 ‘MD5_CTX’ です
ssl2.c:503:42: エラー: ‘MD5_DIGEST_LENGTH’ が宣言されていません (この関数内での最初の使用)
make: *** [ssl2.o] エラー 1

まずMakefileを以下のように修正する。

 15 openssl-too-open: $(OBJS_EX)
 16         $(CC) -o openssl-too-open $(OBJS_EX) -lcrypto
 17
 18 openssl-scanner: $(OBJS_SC)
 19         $(CC)  -o openssl-scanner $(OBJS_SC) -lcrypto

さらに、ssl2.hのヘッダーファイルに以下を追加すると解決する。

#include <openssl/md5.h>

ポイント

 型名が不明→この場合は該当する型を宣言しているヘッダーファイルを探してインクルードすればよい。

 未定義な関数の宣言→nmコマンドで関数・変数を定義してある(-T)のファイルやライブラリを探し、それらを実行ファイル作成の際に組み込めばよい。生まれて初めてnmコマンドのありがたみが分かった。

 なお、その際に参考ページの2つ目にあるように、ライブラリの組み込みを最後に行う必要がある。デフォルトのMakefileではこの順序が逆になっていた。