コンパイル時のエラー その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ではこの順序が逆になっていた。