2012-01-03 8 views
1

私はスクリプトをコンパイルして実行するプログラムを持っています。実行可能ファイルへのデータの追加(Windows、Unix)

スクリプトのスタンドアロン版を作成するには、コンパイル済みのスクリプトを保持するための大きな静的バッファを予約します。コンパイルされたスクリプトはプログラムのコピーにコピーされ、そのコピーから実行できます。

これは問題なく動作します。しかし、いくつかの欠点があります。

  • バッファは静的であり、それにはコンパイル プログラムはありません場合はスペースを占めます。
  • 含まれるスクリプトがバッファのサイズを超えている場合は、より大きなバッファで新しいバージョンをビルドする必要があります。

コンパイルしたスクリプトをプログラムの最後に追加したいのですが、新しいファイルサイズでexeローダのチョークとして機能しません。

exeを操作する方法がありますので、ローダーにとっては受け入れられるでしょう(これはクロスプラットフォームのプログラムです)。

+1

7-zipのようなプログラムが自己解凍形式のアーカイブを作成する方法を確認できます。おそらく同様の方法でスクリプトを埋め込むことができますか? –

+0

私は、インタプリタを再コンパイルせずにコンパイルされたスクリプトを組み込みたいと思いますか?それ以外の場合は、ビルドシステムを変更することでこれに対処することができます。 – thkala

+0

上記のコメント者はどちらもポイントです。しかし、私はプログラムを圧縮する方法の例を見つけることができないようです。私は実践的なソースコードを見つけて、実行可能なイメージを分ける手間を省くことを望んでいました。 – Tink

答えて

0

はローダーにとって許容されます(これはクロスプラットフォームプログラムです)。

これはプラットフォーム固有ではないとは考えられません。異なる実装との共通インタフェースの時間です(スクリプトを保存/ロードするコードは一般的ですが、実行可能な操作は固有です)。

Windowsでは、実行中の実行可能ファイルが変更に対してロックされているという問題が発生します。コピーを処理することで、これを回避できます(ただし、ブート時に完全に確定的な方法で名前を変更する唯一の方法ですが、ジョブのスケジューリングは受け入れられるかもしれません)。

Windowsでは、イメージ(実行可能ファイルまたはDLL)にデータを追加する最も簡単な方法は、リソースを使用しています。カスタムリソースタイプを定義してイメージに追加し(UpdateResource関数)、後でLoadResourceで取得します。

+0

unix/linuxでは、objcopyを使用してファイルにセクションを追加し、libelf(ELF環境を想定)を使用してセクションを読み取ることができます。 Macは別の​​ファイル形式を使用します(あなたが.appエンティティを構築していると仮定して、それらをバイナリのresourcesセクションに追加し、それらの方法で使用することができます)。 – Petesh

0

あなたは "script"と言ったので、スクリプトを含む別のファイルがあると思います(テキストファイル?)。スクリプトファイルを読み込み、コンパイル可能な形式(バイトの配列の初期化を含むCソースなど)で変換する簡単なプログラムを書くことができます。任意のファイルをリンク可能なオブジェクト(.oまたは.obj)に変換するためのツールもあります。過去に私はGNU bimutilsから "objcopy"コマンドを使用しました。具体的には、Linux上:

_binary_mydata_start _binary_mydata_end _binary_mydata_size

objcopy -I binary -O elf32-i386 mydata mydata.o 

このコマンドは、オブジェクトとあなたがスタートを見つけるために使用できる3つのパブリックシンボル、終了し、データブロックのサイズを作成します

Windows版のGNU binutils(例:cygwin)をインストールすれば、同様のことがWindowsでも可能です。

関連する問題