2011-10-10 3 views
7

私はカスタムビルドシステム(Visual Studio外)を使用してDLLを構築しており、初期化されていないデータを.bssセクションに表示することはできません。コンパイラはそれを.dataにまとめます。これは巨大な0の配列でいっぱいであるため、最終的なバイナリサイズを拡張します。例えばMSVCで.bssに初期化されていないデータを格納するにはどうすればよいですか?

(この例では、小さな1キロバイトアレイ、実際のバッファがはるかに大きい):

int uninitialized[1024]; 
int initialized[1024] = { 123 }; 

コンパイラは、このようなアセンブリを発する:

オブジェクトで終わる
PUBLIC _initialized 
_DATA SEGMENT 
COMM _uninitialized:DWORD:0400H 
_initialized DD 07bH 
    ORG $+4092 
_DATA ENDS 

このようなファイル:

SECTION HEADER #3 
    .data name 
     0 physical address 
     0 virtual address 
    1000 size of raw data 
    147 file pointer to raw data (00000147 to 00001146) 
     0 file pointer to relocation table 
     0 file pointer to line numbers 
     0 number of relocations 
     0 number of line numbers 
C0400040 flags 
     Initialized Data 
     8 byte align 
     Read Write 

(無.bssセクションはありません。)

現在のコンパイルフラグ:

cl -nologo -c -FAsc -Faobjs\ -W4 -WX -X -J -EHs-c- -GR- -Gy -GS- -O1 -Os -Foobjs\file.o file.cpp 

私はhttp://msdn.microsoft.com/en-us/library/fwkeyyhe(v=vs.71).aspxでオプションのリストを見ているが、私は明らかに何かを発見していません。

私はVisual Studio 2008 SP1のコンパイラ(Microsoft(R)32ビットC/C++最適化コンパイラバージョン15.00.30729.01(80x86用))を使用しています。

答えて

1

あなたは移植性を懸念していない場合ヨはbss_seg pragmaを使用して試すことができます。

2

"生データのサイズ"は、0x1000または4kBにすぎないことに注意してください。これは、初期化された配列のサイズとまったく同じです。 .dataセクションのVirtualSizeは、バイナリイメージに格納されている実際のデータのサイズよりも大きく、初期化されていない配列は余裕空間を占有します。 bss_segプラグマを使用すると、リンカは初期化されていないデータを別のセクションに配置します。

関連する問題