如何让MSVC将未初始化的数据放入.bss?

时间:2011-10-10 22:45:01

标签: c++ c visual-c++

我正在使用自定义构建系统(在Visual Studio外部)构建DLL,并且我无法在.bss部分显示未初始化的数据;编译器将其归为.data。这膨胀了最终的二进制大小,因为它充满了巨大的零数组。

例如(示例中的小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 for 80x86)。

3 个答案:

答案 0 :(得分:2)

您想使用__declspec(allocate()),您可以在此处阅读:http://msdn.microsoft.com/en-us/library/5bkb2w6t(v=vs.80).aspx

答案 1 :(得分:2)

请注意,“原始数据的大小”仅为0x1000或4kB - 仅与初始化数组的大小完全相同。 .data部分的VirtualSize将大于二进制映像中存储的实际数据的大小,未初始化的数组将占用松弛空间。使用bss_seg pragma将强制链接器将未初始化的数据放入其自己的单独部分。

答案 2 :(得分:1)

如果您不担心可移植性,可以尝试使用bss_seg pragma