でバイナリブロブをリンク:私はこれらの外部変数を持っているデータを操作するに奇妙な行動私はこのように、GCCとARMのCortex-Mのための私のCプログラムでバイナリデータをリンクしていますGCC
arm-none-eabi-ld.exe -r -b binary -o html.o index.html
:
extern const unsigned char _binary_index_html_start;
extern const unsigned char _binary_index_html_end;
extern const uint32_t _binary_index_html_size;
static const char* html = &_binary_index_html_start;
static const size_t html_len = &_binary_index_html_size;
私は理解していない何を、なぜ私はサイズの値を持つように_binary_index_html_size
変数のアドレスを取得する必要がありますか?
これは、変数_binary_index_html_size
のメモリアドレス(ポインタ)が、blobのサイズ値をバイト単位で表していることを意味します。私はこれをデバッグするときは正しいと思われますが、私にはこれを解決するための非常に奇妙な解決策のように思えます。
編集:
私はこの理由は、かもしれ推測:ブロブのサイズは、(私の場合2^32で)ネイティブデータサイズよりも大きくなることはありませんので、代わりにスペースを無駄にして保存するのサイズGCCは、ブロブのサイズを表すメモリアドレスを指す変数を作成するだけです。したがって、値は完全にランダムで、他のコードに依存します(私はこれをテストしました)。これは、サイズがスペースを占有せず、ポインタがコンパイル時に解決されるので、賢明なようです。したがって、サイズが必要ない場合は、スペースを無駄にすることはありません。
代わりに(&_binary_index_html_end) - (&_binary_index_html_start)
を使用すると思います。これはすべてのコンパイラでサポートされているようです。
'static const size_t html_len =&_binary_index_html_size;'は私のバグのようです。あなたはそれが必要だと誰が言っているのですか –
変数 '_binary_index_html_size'にはランダムなデータが含まれており、再コンパイル時に変更することができます。しかし、この変数のアドレスはBLOBのサイズとまったく同じです。 –
これはスペースを節約するための巧妙な方法ですが、標準Cと互換性がありません。おそらく、ブロブがアセンブリで部分的に記述されている場合は、このメソッドを使用できます。 –