我如何让MSVC把未初始化的数据在.bss

How do I get MSVC to put uninitialized data in .bss?

本文关键字:初始化 数据 bss MSVC      更新时间:2023-10-16

我正在使用自定义构建系统(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 -Foobjsfile.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)。

注意,"原始数据的大小"仅为0x1000或4kB—正好是初始化数组的大小。data部分的VirtualSize将大于二进制图像中存储的实际数据的大小,并且未初始化的数组将占用空闲空间。使用bss_seg pragma将强制链接器将未初始化的数据放在它自己单独的节中。

您想使用__declspec(allocate()),您可以在这里阅读:https://learn.microsoft.com/en-us/cpp/cpp/allocate?view=msvc-170

关于__declspec(allocate())的更多信息,Raymond Chen在这里有一篇博客文章:https://devblogs.microsoft.com/oldnewthing/20181107-00/?p=100155

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