2016年10月1日土曜日

D言語でOpenSSLをstatic linkする方法

訳あってOpenSSLのDLLがない環境でも動くものが必要になった。
そこで、D言語でOpenSSLを使った暗号化ラッパーライブラリを作って静的リンクさせたかったので書く。

dubビルドスクリプト(json)
これが今回一番大事で、これちゃんと作れないとx64版ビルドしかできない。
x86版が作れない。
ほんとうに大事。

dubに何も引数指定しない場合:x86版がビルドされる
dubに--arch=x86_64を指定した場合:x64版がビルドされる
  • sourceFiles-x86_64ディレクティブ
    • x64版のstatic linkライブラリを指定する
    • dub --arch=x86_64 を指定した場合のみここが走る
  • sourceFiles-x86ディレクティブ
    • x86版のstatic linkライブラリを指定する
  • sourceFilesディレクティブ
    • どのような場合でもOpenSSLが使うインポートライブラリをリンクする
  • dflags-x86ディレクティブ
    • x86版をビルドする場合に、 -m32mscoff オプションを付ける
    • これを付けることで、MSCOFF形式のライブラリ/オブジェクトファイルに対応してくれる
    • ていうかMS謹製のlink.exeが今のところ立ち上がる。(検証済み)
    • デフォルトだとOMF形式しかリンカが認識しないためその処置
    • なんでMSCOFFとOMFで2つも規格あるんだよどっちかに統一してくれ


MSCOFFとOMFには割りと因縁があり、7年前C言語の勉強始めた頃に、VisualStudioでビルドされたライブラリをBorland C Compilerについてるリンカでリンクしようとしたら怒られまくって心折れた記憶が復活したよね。
今回はなんとか倒した。(他の人に色々聞いた、優しい世界)

原因は、x64ビルドだとVisualStudio付属のlink.exeが立ち上がってビルドされるから問題ないけど、x86だとDigital Mars製のOptlinkが立ち上がってビルドする。このOptlinkはデフォルトだと読まれるライブラリをOMFと仮定して処理しようとする。
つまりデフォルトでは、MSCOFF形式のライブラリだとエラーを吐く。クソかよ。


メイン関数
特に説明はない。
ハッシュ値の生成とランダム値の生成をやってるだけ

標準ライブラリのハッシュクラスを更に使いやすく(Pythonっぽく)ラッピングしたクラステンプレート
これ一つで文字列・ファイル・バイト列からSHA1でもSHA224でもSHA256でもMD5などD言語が対応しているハッシュなら生成できる (MD5の使いみちとしたら衝突攻撃の検証とかかな?)

OpenSSLリンクチェック用のランダム値生成関数


というわけで、なんとか静的リンクさせることができた。
あと、D言語のテンプレートクラスと標準ライブラリの豊富さに無限の可能性を感じた。
終わり。