2011-10-10 58 views
7

我正在構建使用自定義構建系統(Visual Studio之外)的DLL,並且我無法獲取未初始化的數據以顯示在.bss部分;編譯器把它存入.data。這擴大了最終的二進制大小,因爲它充滿了巨大的零數組。如何讓MSVC將未初始化的數據放入.bss中?

例如(在示例小1KB陣列,但實際的緩衝器大得多):

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編譯指示將強制鏈接器將未初始化的數據放入其自己的單獨部分。