OpenSSL 0.9.8 の Win32 環境用ライブラリを自力でビルドする方法

観測気球

収集物の記録書庫 a data archive of collection -- collectible toys

[要旨] OpenSSL を自作プログラムで利用しようとすると、ライブラリを自分でビルドする必要が出てきます。特に、Windows 環境、かつ Visual Studio を使う場合は、ちょっとした作業が必要になります。
[キーワード] ftol2,VC++,gcc

« プレイヤンミクロ(BlogPet) | トップページ | 最新WebサービスAPIエクスプローラ ~Amazon、はてな、Google、Yahoo! 4大Webサービス完全攻略 »

2005.09.12

OpenSSL 0.9.8 の Win32 環境用ライブラリを自力でビルドする方法

以前の版(0.9.7e)の OpenSSL を Visual C++ 6 でビルドしたときに手順をメモっておくのを忘れてました。今後のことを考えて、今回の作業内容をメモっておきます。たぶん、パッケージ構成が大きく変わらない限りは同様の手順でいけると思います。

手順

(1) まず、http://www.slproweb.com/products/Win32OpenSSL.html から、Windows 用のバイナリを取ってきてインストールします(万一、Windows 用のバイナリ配布サイトが変わっていた場合でも、OpenSSL の Binary Distributions のページの OpenSSL for Windows から辿れます)。

(2) 次に OpenSSL のソースの最新版を持ってきて、展開します。

(3) 展開後、 INSTALL.W32 に書かれている手順で dll を作成します。すなわち、以下を実行します(perl が必要です)。

  • perl Configure VC-WIN32
  • ms\do_ms
  • nmake -f ms\ntdll.mak

(4) できあがった dll を念のためにテストします。

  • cd out32dll
  • ..\ms\test

(5) スタティックライブラリバージョンを作成します。リリースビルド版はバイナリパッケージインストール時に展開される C:\OpenSSL\lib\VC\static 以下にあるファイルを使えば OK(C:\OpenSSLにインストールした場合)。問題は、デバッグビルド版。これは自分でビルドする必要があります。

  • まず、ms\nt.mak を元に ms\nt_debug.mk を作ります。

ms\nt.mak に対する unified diff を示しておきます。これを参考に ms\nt_debug.mk を作ってください。

--- nt.mak	Mon Sep 12 20:20:18 2005
+++ nt_debug.mak	Mon Sep 12 20:57:02 2005
@@ -16,7 +16,7 @@
 # Set your compiler options
 PLATFORM=VC-WIN32
 CC=cl
-CFLAG= /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 /Fdout32 -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_KRB5
+CFLAG= /MDd /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 /Fdout32 -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_KRB5
 APP_CFLAG=
 LIB_CFLAG=
 SHLIB_CFLAG=
@@ -28,6 +28,7 @@

 # The OpenSSL directory
 SRC_D=.
+SRC_WIN32_D=.\ms

 LINK=link
 LFLAGS=/nologo /subsystem:console /machine:I386 /opt:ref
@@ -55,9 +56,9 @@
 RMD160_ASM_SRC=

 # The output directory for everything intersting
-OUT_D=out32
+OUT_D=out32_debug
 # The output directory for all the temporary muck
-TMP_D=tmp32
+TMP_D=tmp32_debug
 # The output directory for the header files
 INC_D=inc32
 INCO_D=inc32\openssl
@@ -75,8 +76,8 @@
 ######################################################

 E_EXE=openssl
-SSL=ssleay32
-CRYPTO=libeay32
+SSL=ssleay32d
+CRYPTO=libeay32d

 # BIN_D  - Binary output directory
 # TEST_D - Binary test file output directory
@@ -367,7 +368,8 @@
 	$(OBJ_D)\str_mem.obj $(OBJ_D)\pqueue.obj $(OBJ_D)\e_4758cca.obj \
 	$(OBJ_D)\e_aep.obj $(OBJ_D)\e_atalla.obj $(OBJ_D)\e_cswift.obj \
 	$(OBJ_D)\e_gmp.obj $(OBJ_D)\e_chil.obj $(OBJ_D)\e_nuron.obj \
-	$(OBJ_D)\e_sureware.obj $(OBJ_D)\e_ubsec.obj
+	$(OBJ_D)\e_sureware.obj $(OBJ_D)\e_ubsec.obj \
+	$(OBJ_D)\ftol2.obj

 T_EXE=$(TEST_D)\md2test.exe \
 	$(TEST_D)\md4test.exe $(TEST_D)\md5test.exe $(TEST_D)\shatest.exe \
@@ -815,6 +817,9 @@

 $(INCO_D)\kssl.h: $(SRC_D)\ssl\kssl.h
 	$(CP) $(SRC_D)\ssl\kssl.h $(INCO_D)\kssl.h
+
+$(OBJ_D)\ftol2.obj: $(SRC_WIN32_D)\ftol2.c
+	$(CC) /Fo$(OBJ_D)\ftol2.obj  $(LIB_CFLAGS) -c $(SRC_WIN32_D)\ftol2.c

 $(OBJ_D)\md2test.obj: $(SRC_D)\crypto\md2\md2test.c
 	$(CC) /Fo$(OBJ_D)\md2test.obj $(APP_CFLAGS) -c $(SRC_D)\crypto\md2\md2test.c
  • 次に ms\ftol2.c というファイルを用意します。例えば、以下のような内容で OK。
// only for MSDEV 6.0
//#if (_MSC_VER == 1200) && (WINVER < 0x0500)
# ifdef __cplusplus
extern "C" {
# endif
    long _ftol( double ); // defined by VC6 C libs
# ifdef cplusplus
}
# endif

# ifdef __cplusplus
extern "C" {
# endif
    long _ftol2( double dblSource )
    {
        return _ftol( dblSource );
    }
# ifdef cplusplus
}
# endif
//#endif

どうして ftol2.c を用意するのかというと、リンク時に _ftol2() が見つからないというエラーが出るから。Visual C++ 6 には _ftol2() がないので、_ftol() で代用します。Visual Studio.NET や Visual Studio 2005 (Express を含む)には、例えば

C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\intel\dll_lib

に、ftol2.obj があるので、それをリンクするようにしても構いません。 その場合は、それに合わせて ms\nt_debug.mk も書き換えておいてください。 この辺(自前の _ftol2() を用意する必要がある)は、オリジナルが gcc 前提で書かれているオープンソースなプログラム共通だと覚えておいてください(ただし、リンクエラーが出ないときは ftol2() を用意する必要はありません)。

(6) あとはビルドを実行するだけ。INSTALL.W32 の手順の

 > nmake -f ms\ntdll.mak

 > nmake -f ms\nt_debug.mak

に読み替えて実行します。

以上で、スタティックライブラリバージョンのデバッグビルド版が out32_debug ディレクトリの下にできているはずです。


書いてみると結構複雑なことをしているように見えますが、たいしたことはやっていません。自前の _ftol2() を用意することと、ms\nt_debug.mak を用意することが肝要。それ以外は流れ作業です。

なお、ms\nt.mak を使って、スタティックライブラリバージョンのリリースビルド版を作るときも、自前の _ftol2() を用意し、ms\nt.mak を書き換えてからビルドすることになります。

追記

以下、2006年8月20日に追記。

いつの間にか(0.98b から?)、「Windows 用のバイナリパッケージ」には、デバッグビルド版のスタティックライブラリも同梱されてますね。しかも、マルチスレッドDLLデバッグ版(MDd)と、マルチスレッドデバッグ版(MTd)の両方。もはや、自分でビルドする必要がなくなりました。

それでも、やっぱり、0.98b も一度は自分でビルドしてみたい、と思ってビルドを試みてみました。

VC++ 8 (Visual Studio 2005) の cl.exe だとコンパイルエラーが出ます。VC++ 8 でビルドできるようにしようとするのは、結構な作業量が必要かも。Visual Studio.NET 2003 な VC++ では試してないけど、たぶんコンパイルエラーが出ると思います。 ということで、自分でビルドするには、依然として VC++ 6 が必要なようです。

投稿者: tsupo 2005.09.12 午後 10:49 | 固定リンク | このエントリーをはてなブックマークに追加 | このエントリを del.icio.us に登録 このエントリの del.icio.us での登録状況 | このエントリを Buzzurl に追加このエントリの Buzzurl での登録状況 | このエントリをlivedoorクリップに登録 このエントリのlivedoorクリップでの登録状況 このエントリをlivedoorクリップに登録している人の数 | 酢鶏巡回中

楽天市場


品揃え豊富で安い!NTT-X Store


アマゾンわくわく探検隊

トラックバック

この記事のトラックバックURL:

この記事へのトラックバック一覧です: OpenSSL 0.9.8 の Win32 環境用ライブラリを自力でビルドする方法:

» OpenSSL 0.9.8 の Win32 環境用ライブラリを自力でビルドする方法 (続) from 観測気球
ここ最近の OpenSSL の Windows 向けバイナリパッケージは VC6 では使えなくなってしまったので、VC6 でも使えるライブラリを作ってみました。 続きを読む

受信: 2009.03.29 午前 12:22

コメント

ワード

ニッセン

fujisan.co.jp

楽天市場