web-dev-qa-db-ja.com

Linux実行可能イメージにリソースを埋め込む標準的な方法はありますか?

Windows APIを介してバイナリリソースをPEイメージ(EXE、DLL)に埋め込むのは非常に簡単です( http://msdn.Microsoft.com/en-us/library/ms648008(v = VS.85)を参照) .aspx )。

Linuxに同様の標準APIはありますか?

それとも、リソースの埋め込みに対するある種の事実上のアプローチですか?

目標は、静的なバイナリデータやテキストデータを実行可能ファイルに埋め込むことです。写真、HTMLなど。プログラムのバイナリ配布は1つのファイルのコピーを作成するのと同じくらい簡単ですか? (すべてのライブラリの依存関係に問題がないと仮定

更新:

bdkの提案に従って、 gcc mingwを使用したバイナリブロブの埋め込み で説明されている解決策を試しましたが、うまくいきました。ただし、言及する価値のある問題がいくつかありました。私のプロジェクト(Code :: Blocks内)は多数のC++ファイルで構成されており、対応するオブジェクトファイルのいずれかにバイナリデータを追加すると、ビルドが壊れて役に立たなくなります-objdump -xは、ほとんどのシンボルが埋め込み後に消えたことを示します(そして私はそれを修正する方法を見つけられませんでした)。この問題を克服するために、私は空のダミーの.cppファイルをプロジェクトに追加しました。これは、操作するオブジェクトファイルを提供することのみを目的としており、そのファイルに対して次のカスタムビルドステップを記述しました。 )::

$compiler $options $includes -c $file -o $object
ld -Ur -b binary -o $object <binary payload path>
26
Andrey

自分でアセンブラファイルblob.Sを作成します。

    .global blob
    .global blob_size
    .section .rodata
blob:
    .incbin "blob.bin"
1:
blob_size:
    .int 1b - blob

Gcc -c blob.S -o blob.oを使用してコンパイルします。これで、Cプログラム内から次のコマンドを使用してblobにアクセスできます。

extern uint8_t blob[];
extern int blob_size;

Bin2cコンバーターの使用は通常は正常に機能しますが、blobが大きい場合、incbinソリューションははるかに高速で、使用するメモリ(コンパイル時間)もはるかに少なくなります。

29
Simon Edlund

objcopy --add-sectionを使用すると、ELF実行可能ファイルのセクションとして任意のファイルを追加できます。 (objcopyのマニュアルページ)。ただし、ELFライブラリを使用してELFバイナリをロードおよび解析する以外に、Cプログラム内からこのデータにアクセスする方法をまだ見つけていないため、これは解決策の半分にすぎません。

編集追加情報:

MyProgramというコンパイル済みプログラムとMyProgramに埋め込むリソースファイルMyResource.datがある場合は、次のようにobjcopyコマンドを使用できます。

objcopy MyProgram --add-section MyResource=MyResource.dat

ここで、コマンドobjdump -xMyProgramを使用してプログラムを見ると

MyResource.datの内容を含むMyResourceというセクションが表示されます。これで、ファイルが実行可能ファイル内に埋め込まれます。

ここでの秘訣は、プログラム内からどのようにデータにアクセスするかです。私の本能は、ローダーがファイルをメモリのどこかに配置し、それへのポインタを取得できるはずだと言っていますが、それを簡単に行う方法がわかりません。理想的には、実行可能ファイルをdlopenし、セクションをdlsymできるようにしたいのですが、それはセクションであり、シンボルではないため、機能しません。

プログラム内からセクションにアクセスするために私が知っている唯一の代替手段は、リベルフライブラリまたはそれに似たものを使用することです。これをアプリケーションで使用して、それ自体をELFリソースとしてロードし、セクションを取得できます。ドキュメントはまばらですが、ここに例があります

http://em386.blogspot.com/2007/03/quick-libelf-guide.html

--add-sectionからデータにアクセスする簡単な方法で誰かがチャイムを鳴らしてくれるといいのですが。

編集2私の研究では、この質問を見つけました: gcc mingwを使用したバイナリブロブの埋め込み

これはgccとmingwで機能するはずであり、objcopyの代わりにldを使用してデータを追加し、シンボルとしてアクセスできるようにする方法を示しています。有望に見えます

7
bdk

承知しました。 Bin2Hexコンバーター のようなものを試してください。バイナリデータをC++ char配列に変換してから、定数変数としてコードに埋め込みます。

4
littleadv

どうですか makeself

すべてのプログラム、リソースファイルが実行可能なシェルファイルにあるディレクトリからtarアーカイブを作成します。また、ユーザーが実行可能ファイルを実行すると、ファイルが抽出され、任意のコマンドが実行されます(プログラムのメイン実行可能ファイルの場合もあります)。ユーザーが実行可能ファイルを起動するたびに、実際のプログラムを起動する前に、最初にファイルをロード/抽出するのに時間がかかるという欠点があります。

1
technomage