Gauche:gauche-statifier
Rui(2006/12/03 04:18:02 PST): Gaucheスクリプトを単一の実行ファイルに変換するスクリプト。http://gauche.cvs.sourceforge.net/gauche/Gauche-statifier/
gauche-statifier hello-world.scm
このようにすると、Gaucheのインストールされていない環境で実行可能なバイナリファイルhello-worldができます。
仕組み
Gaucheスクリプト本体、それが読み込んでいるSchemeライブラリ、そしてDSOを、一つの疑似的に静的リンクされた実行可能バイナリファイルに変換します。変換されたバイナリはGaucheのインストールされていない環境で動かせます。
変換にはstatifierコマンドを使います。動作のステップは次のとおり。
- 依存しているライブラリとDSOのリストを得るために、goshに"-fload-verbose"オプションを付けて、指定されたスクリプトをロードする
- 依存しているSchemeライブラリとスクリプト本体を埋め込んだCプログラムを作成し、コンパイルする
- (2)の実行ファイルと、それが依存するDSOを、statifierで1つのファイルにまとめる
2では、Gaucheが*.scmファイルを探しにいかないよう、ライブラリを依存関係にしたがってソートし、常に依存関係を満たすような順番にSchemeコードを埋め込んでいます。
libgaucheのDSOを検索する関数(Scm_FindFile)を置き換えています。GaucheのScm_FindFileはDSOが見つからないとエラーを返すのですが、statifierで変換されたバイナリにはDSOがプリロードされているため実際はdlopenする必要がなく、ファイルを見つける必要がありません。ここで定義しているScm_FindFileは、プリロードされたDSOの検索に対して、見つかったという結果を常に返します。
あまりないと思いますが、実行時にライブラリをロードするスクリプトは、実行に失敗します。普通にライブラリをuseをしている限りは心配ありませんが、実際の環境に移す前に動作確認したほうがよいと思います。私は次の方法で確認しています。
- straceで余計なファイルを読み込んでいないか確認
- ファイルの存在しないディレクトリにchrootして動作確認(ただし/procはBoehm GCが必要とするので用意してください)
動作はLinux (Ubuntu 6.06とRHEL4)で、gauche-statifier自身をgauche-statifierで変換することで確認しました。
ライセンスについての注意: statifierが生成した擬似的にスタティックリンクされたファイルは、依存しているDSOのライセンスに従う必要があるかもしれません。依存しているDSOは、動的リンクするすべてのもの、つまりlibcまで含みますし、Gaucheの拡張モジュールがロードするDSOも含みます。個人的に使うぶんには問題ないかと思いますが、一般に配布するときは注意してください。
参考
- statifier
- statifierで動的リンクの実行ファイルを擬似的に静的リンクにする
- Exerb - Rubyスクリプトの単体exe化。Windowsのみ対応。
- Gauche:scm2exe - Shiroさんが10分くらいで作ったという、Gaucheスクリプトの実行ファイル化スクリプト。実行する環境にGaucheがインストールされている必要あり。
- PerlCC - Perlスクリプトを実行ファイルにするもの。
コメント
- Rui(2006/12/03 04:18:02 PST): Binary HacksのHack #21「statifierで動的リンクの実行ファイルを擬似的に静的リンクにする」を読んで思いついたスクリプトです。いろんな事情でGaucheをインストールせずに済ませたい場合もあるはず。そのような場合にぜひお試しください。
- び(2006/12/03 05:02:33 PST): 面白そうだったのですが、実行ファイル形式がMach-OなMac OS Xではstatifierは動きそうもないので、早々に諦めました(ょゎ)。NetBSD/i386はELFなのでがんばれば何とかなるかな?
- Rui(2006/12/03 05:11:12 PST): Statifierが動く環境なら動くし、逆ならかなり難しいと思います。がんばれば何とかなるはなるんでしょうけど難易度の上昇曲線が急すぎ。