Как мне заставить MSVC помещать неинициализированные данные в .bss?

Я создаю DLL с помощью специальной системы сборки (вне Visual Studio), и я не могу получить неинициализированные данные для отображения в .bss раздел; компилятор объединяет его в .data . Это увеличивает конечный двоичный размер, поскольку он полон гигантских массивов нулей.

Например, mple (в данном примере небольшие массивы размером 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 (32-разрядный оптимизирующий компилятор Microsoft (R) C / C ++ версии 15.00.30729.01 для 80x86).

7
задан Daniel Verkamp 10 October 2011 в 22:45
поделиться