2011-07-30 3 views
1

私はと等価であるツールが必要:Linux上で大きなバイナリchar []配列を使用してオブジェクトファイルを作成するにはどうすればよいですか?

$ echo 'char bar[] = {65, 66, 67};' >foo.c 
$ gcc -c foo.c 

私はbar配列に入れるべきマルチメガバイトのバイナリファイルを持っている、と私は.cファイルを作成せずにそれを必要とする:私は.oファイルが欲しいですバイナリファイルから直接作成することができます。別のオプションは、.sまたは.Sファイルを作成することができますが、私もそれを避けたいと思います。仕事をすることができるbinutilsなどのツールはありますか?

アップデート:gcc 9 MBバイナリファイルのsegfaults。 asが動作しますが、速度が遅く、一時的な.sファイルが大きすぎます。

+1

segfaultを報告する必要があります。 –

答えて

0

最も簡単な解決策は、.sまたは.Sファイルを作成することでした。

binutilsには何も役立ちません。

高速で、少ないメモリを使用する2段階のトリックがあります:

ステップ1.作成し、正しいサイズのシンボルが含まれている.Cファイルをコンパイルしますが、代わりに短い署名を持っています実際の長いデータの実際のバイナリデータファイルからのデータと、コンパイラによって生成された.oファイル内のバイトSIGNATUREを探す

const char hi[1234567] = "SIGNATURE"; 
const char *hi_end = hi + sizeof(hi)/sizeof(char); 

ステップ2、およびそれを交換(および以下の'\0'秒):それは次のようになります。

Perlスクリプトcobjgenは、両方のステップを自動化します。詳細な分析と使用方法については、blog postを参照してください。

1

objcopy --add-sectionを使用すると、ファイル内のコンテンツを含むセクションを作成できます。私はあなたが新しいセクションの開始点を指し示すシンボルを追加するためにリンカースクリプトを使用する必要があると思います。

+0

いくつかのコード例がありますか? – pts

+0

申し訳ありません。 objcopyは、マニュアルだけを使用して正しく取得するのは簡単です。リンカスクリプトはやや難しいです。 –

+0

これまでリンカスクリプトを使用していませんでした。どのように、私も忘れる... – alternative

関連する問題