2016-10-20 18 views
0

私はバイナリファイルBをリンク時に実行可能ファイルAに埋め込みようとしています(Linux(64ビット))。外部のグローバル変数を参照するのが悲惨に失敗する

Bld -r -bbinary -oB.o Bと再配置可能なオブジェクトに変換され

Hi, I'm a text file in plain ASCII.

... ...単純なテキストファイルです。

...これは A.cある

  1. _binary_B_start
  2. _binary_B_end
  3. _binary_B_size

:そのsymtabは、3つのグローバル変数、一目瞭然であるの名前を報告します

#include <stdio.h> extern const size_t _binary_B_size; int main(int argc, char * * argv) { printf("size: %zu\n", _binary_B_size); return 0; } 

... B.ogcc -oA A.c B.oでコンパイルおよびリンクされています。 残念ながら、実行可能ファイルA_binary_B_sizeにアクセスしようとするとすぐに、SIGSEGVで突然終了します。

私は間違っていますか?

答えて

2

明らかに、_binary_B_sizeのセマンティクスを誤解しています。あなたが信じているように、それはsize_tの左辺値ではありません。これはゼロサイズという絶対的な位置のセクション(ラベル)で、そのアドレスはバイナリBLOBデータのサイズと同じです。あなたのファイルにobjdump -tを試してみると、対応する列に*ABS*が表示されます。

ので、適切な使用法はあなたがまたend - startメソッドを使用して

extern unsigned char _binary_B_start[]; 
extern unsigned char _binary_B_end[]; 

int main() 
{ 
    printf("size: %zu\n", (size_t) (_binary_B_end - _binary_B_start)); 
} 

同じ結果を得ることができます

extern unsigned char _binary_B_size[]; 

int main() 
{ 
    printf("size: %zu\n", (size_t) _binary_B_size); 
} 

だろう基本的には、ここでの主な考慮事項は_binary_B_sizeを可能にするには理由がありませんということですa size_t左端。これは事実上、コンパイル時にあらかじめ決められた値を持つ定数です。ストレージを占有する理由はありません。上に示したのは、オブジェクトファイルにこのような定数値をエンコードする方法の1つです。

関連する問題