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

jaql4c8m  于 2023-05-06  发布在  其他
关注(0)|答案(3)|浏览(109)

我正在使用自定义构建系统(在Visual Studio之外)构建DLL,并且无法在.bss节中显示未初始化的数据;编译器会将其合并为.data。这会使最终的二进制文件变大,因为它充满了巨大的零数组。
例如(示例中的小1 KB阵列,但实际缓冲区要大得多):

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++ Optimizing Compiler Version 15.00.30729.01 for 80 x86)。

lh80um4z

lh80um4z1#

请注意,“原始数据的大小”仅为0x 1000或4kB -仅与初始化数组的大小完全相同。.data部分的VirtualSize将大于二进制映像中存储的实际数据的大小,并且未初始化的数组将占用空闲空间。使用bss_seg杂注将强制链接器将未初始化的数据放置到它自己的单独节中。

ssm49v7z

ssm49v7z2#

你想使用__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

rqmkfv5c

rqmkfv5c3#

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

相关问题