Как заставить MSVC помещать неинициализированные данные в .bss? - PullRequest
7 голосов
/ 11 октября 2011

Я собираю 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).

Ответы [ 3 ]

2 голосов
/ 18 мая 2012

Обратите внимание, что «размер необработанных данных» составляет всего 0x1000 или 4 КБ - в точности размер только вашего инициализированного массива.VirtualSize вашего раздела .data будет больше, чем размер фактических данных, хранящихся в двоичном образе, и ваш неинициализированный массив будет занимать свободное пространство.Использование прагмы bss_seg заставит компоновщик поместить ваши неинициализированные данные в отдельный раздел.

2 голосов
/ 11 октября 2011

Вы хотите использовать __declspec(allocate()), о котором вы можете прочитать здесь: http://msdn.microsoft.com/en-us/library/5bkb2w6t(v=vs.80).aspx

1 голос
/ 11 октября 2011

Йо может попробовать использовать bss_seg pragma , если вас не беспокоит переносимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...