Я собираю DLL с использованием собственной системы сборки (за пределами Visual Studio), и я не могу получить неинициализированные данные для отображения в разделе .bss
;компилятор объединяет его в .data
.Это увеличивает размер окончательного двоичного файла, так как он полон гигантских массивов нулей.
Например (небольшие массивы 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 с пакетом обновления 1 (SP2) (32-разрядная версия оптимизирующего компилятора C / C ++ для Microsoft (R) 15.00.30729.01 для 80x86).