2

実行可能ファイルに多数のグラフィック ファイルを必要とするプロジェクトがあります。ターゲットにはファイルシステムがないため、fopen関数を使用することはできません。1 つの方法は、ファイルの内容を次のような変数定義を含む C ソース コードに変換することです。

unsigned char file1_content[] = {
   0x01, 0x02, ...
};

変換ツールを使用しても、そのようなファイルを作成するのは面倒です。

各ファイルの変数名を指定しながらバイナリ ファイルを rdata セクションに追加する方法はありますか? これにリンカースクリプトを使用することを考えていますが、方法が見つかりませんでした。

4

2 に答える 2

2

ツールを使用することは特に面倒ではなく、それが古典的な解決策です。「bin2c」を検索して見つけてください。

これらの「アセット構築」ステップをビルド プロセスに含める必要があるだけです。つまり、Makefile からツールを呼び出します。これは、ソース データが変更された場合にのみツールが実行されることも意味します。これは便利です。

少なくとも GNU リンカ (L​​D) は、出力ファイルのセクションにファイルを配置できるようです (次のように、セクション配置のドキュメントを参照してください。

.data : { afile.o bfile.o cfile.o }

しかし、これは非常に面倒に思えます。また、実行可能ファイルのセクションについて考える必要があります。また、入力がオブジェクト ファイルである必要があるようです。一般的なバイナリ アセットはリンカーと互換性のあるオブジェクト ファイルではないため、問題が循環します。

bin2c アプローチを使用することをお勧めします。

于 2013-05-31T07:41:19.707 に答える
1

次のように、リンカー オプションを使用--format-Wl,てリンカーに渡すことができます。

gcc -Wl,--format=binary -Wl,myfile.bin -Wl,--format=default

最後にフォーマットをデフォルトに設定すると、リンカを標準入力フォーマットに戻すことができます。

ソースからバイナリ リソースにアクセスするには、次のような単純な_binary_myfile_bin_startアセンブラ シンボル ( for myfile.bin、 forxxx.yyyと) を使用します_binary_xxx_yyy_start_binary_xxx_yyy_end

extern uint8_t data[] asm("_binary_myfile_bin_start");

そして次の使用data。自分で objcopy を実行するか、リソース ハッキングを使用するよりもはるかに優れています。

UPD: ちょっとした例で展開 -- メインは、独自のオブジェクト ファイルの最初の 4 バイトを出力します。

#include "stdio.h"
#include "stdint.h"

extern uint8_t data[] asm("_binary_main_o_start");

int
main(void)
{
  fprintf(stdout, "0x%x, 0x%x, 0x%x, 0x%x\n", data[0], data[1], data[2], data[3]);
  return 0;
}

run をコンパイルします。

$ gcc -o main.o -c main.c 
$ gcc -o main main.o -Wl,--format=binary -Wl,main.o -Wl,--format=default
$ ./main 
0x7f, 0x45, 0x4c, 0x46
于 2013-05-31T09:01:25.613 に答える