[ruby-list:39067] [ANN] Exerb 3.1.0

From: Yuya Kato <yuya-ml@4th.to>
Date: 2004-01-22 20:55:41 UTC
List: ruby-list #39067
Yuyaです。

 Exerb 3.1.0をリリースしました。
<http://prdownloads.sourceforge.jp/exerb/7791/exerb-3.1.0.tar.gz>

変更点は下記の通りです。

* 関数アドレスの置換処理を抑制するオプションを追加

# Exerbは、Rubyスクリプト/拡張ライブラリを単独で動作可能なWindows用
# 実行ファイルに変換するソフトウェアです。
# 詳しくは<http://exerb.sourceforge.jp/>をご参照ください。

 /clrを使用し、Microsoft VisualC++.NETで生成された拡張ライブラリに
対応しました。前バージョンでは、上記環境で生成した拡張ライブラリを
requireすると、LoadLibraryEx関数でエラーが発生していましたが、その
問題に対応するコードを追加しました。
これで、rubydotnet-2などの拡張ライブラリを使用した場合でも、正常に
実行ファイル化できると思います。(まだ試していませんが)

 具体的には、上記環境で生成した拡張ライブラリの.rdataセクションに
書き込み可能属性を付加すると、なぜかLoadLibraryEx関数が失敗する
(GetLastError関数が1114を返す)ので、上記の処理を抑制するオプション
を追加しました。
下記の様に、レシピファイルのadd_extension_libraryにno_replace_function
オプションを追加することで、抑止することが出来ます。
(実際にはタブ区切りです)

  add_extension_library  etklib.so  etklib.so  no_replace_function

 no_replace_functionオプションを指定した場合、拡張ライブラリの
関数アドレス置換処理が行われなくなり、その結果、kernel32.dllの
LoadLibrary関数などがフックされなくなるため、それらの関数を使用
している拡張ライブラリが正常に動作しなくなる可能性があります。
そのため、本当に必要な場合のみno_replace_functionオプションを
使用してください。

 .rdataセクションに書き込み可能属性を付加するのは、セクション
内のインポートアドレステーブルを書き換えるためなのですが、なぜ
書き込み可能属性を付加すると、拡張ライブラリの初期化関数が失敗
するのか、その理由はわかっていません。JIT関連のような気はしますが。

何か情報をお持ちの方は、お知らせ頂ければ光栄です。

====== Yuya Kato ======
E-Mail yuya@katoden.co.jp
   Web http://nuance.cc/
i-mode http://nuance.cc/i/


In This Thread

Prev Next