2016-07-11 6 views
2

でバイナリブロブをリンク:私はこれらの外部変数を持っているデータを操作するに奇妙な行動私はこのように、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)を使用すると思います。これはすべてのコンパイラでサポートされているようです。

+0

'static const size_t html_len =&_binary_index_html_size;'は私のバグのようです。あなたはそれが必要だと誰が言っているのですか –

+0

変数 '_binary_index_html_size'にはランダムなデータが含まれており、再コンパイル時に変更することができます。しかし、この変数のアドレスはBLOBのサイズとまったく同じです。 –

+0

これはスペースを節約するための巧妙な方法ですが、標準Cと互換性がありません。おそらく、ブロブがアセンブリで部分的に記述されている場合は、このメソッドを使用できます。 –

答えて

1

あなたが扱っているシンボルはすべて、リンカースクリプトで定義された変数であり、これはユーザーのやり方とまったく同じです。これに関する説明は、ld documentationで非常に明確に与えられています。

シンボルがCなどの高水準言語で宣言された場合、2つの が発生します。最初に、コンパイラは、シンボルの値を保持するためにプログラムのメモリに十分な領域を予約しておくことです( )。 2番目は であり、コンパイラはプログラムのシンボルテーブルにシンボルのアドレスを保持するエントリを作成します( )。すなわち、シンボルテーブルは、シンボルの値を保持するメモリブロックのアドレス を含む。

そして、少し後で、私たちは以下を見つけることができます。

リンカースクリプトのシンボル宣言は、対照的にシンボルテーブル にエントリを作成しますが、それらにはメモリを割り当てません。したがって、値なしのアドレスは です。

これは、リンカ定義された変数のアドレスが実際にその実際の値であり、あなたがリンカシンボルに関連付けられた値を読み取るために、このようなアドレスを取らなければならない理由があることを意味しています。

関連する問題