私が作成した小さなプログラムには、バイナリ自体に含めることを好む多くの小さなビットマップとサウンド クリップが含まれています (いずれにしてもメモリ マップが必要です)。MS PE/COFF 標準には、適切なファイル システムのような階層を持つリソース (.rsrc セクション) を含める方法に関する特定の説明があります。私は Linux ELF 仕様でそのようなものを見つけていません。したがって、これらのリソースを自由に含めることができると思います。
私が達成したいのは、すべてのリソースを 1 つの ELF セクションに含め、各リソースの先頭にシンボリック名を付けることができるようにすることです (C コードからそれらをアドレス指定できるようにするため)。私が今行っているのは、次のレイアウトを持つ小さな NASM ファイルを使用することです。
SECTION .rsrc
_resource_1:
incbin "../rsrc/file_name_1"
_resource_1_length:
dw $-resource_1
_resource_2:
incbin "../rsrc/file_name_2"
_resource_2_length:
dw $-resource_2
...
これを、C コードとリンクできる ELF オブジェクトに簡単にアセンブルできます。ただし、コードがプラットフォームに依存するようになるため、アセンブリの使用は嫌いです。
同じ結果を達成するためのより良い方法は何でしょうか?
この質問はすでにstackoverflowで尋ねられていますが、提案された解決策は私の場合には当てはまりません:
- ここで提案されている解決策: C/C++ with GCC: Statically add resource files to executable/library リソースを C コードに 16 進配列として含めることは、コードとデータが 1 つのセクションに混在するため、実際には役に立ちません。(さらに、リソースが配列に変換されるとリソースをプレビューできないため、実用的でもありません)
- すべてのリソースでの使用
objcopy --add-section
は機能しますが、すべてのリソースは独自のセクション (ヘッダーなどを含む) を取得します。約 120 個のファイル (それぞれ +/- 4K) を含める必要があるため、これは少し無駄に思えます。