Почему в EXE-файле, который ничего не содержит, содержится столько фиктивных нулевых байтов? - PullRequest
4 голосов
/ 05 января 2011

Я скомпилировал файл C, который абсолютно ничего не делает (просто main, который возвращает ... даже не печатается "Hello, world"), и я скомпилировал его с помощью различных компиляторов (MinGW GCCVisual C ++, Windows DDK и т. Д.).Все они связаны со средой выполнения C, которая является стандартной.

Но чего я не получаю: когда я открываю файл в шестнадцатеричном редакторе (или дизассемблере), почему я вижу этополовина из 16 КБ - это просто огромные секции размером 0x00 или 0xCC?Мне кажется довольно нелепым ... есть ли способ предотвратить это?И почему они там на первом месте?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 05 января 2011

Исполняемые файлы обычно содержат сегмент кода и хотя бы один сегмент данных. Я думаю, что каждый из них имеет стандартный минимальный размер, который может быть 8K. И неиспользуемое пространство заполнено нулями. Также обратите внимание, что EXE-файл, написанный на языке более высокого уровня (чем ассемблер), содержит некоторые дополнительные вещи помимо прямого перевода вашего собственного кода и данных:

  • код запуска и завершения (в C и его преемниках он обрабатывает входные аргументы, вызывает main(), а затем очищается после выхода из main())
  • код и данные заглушки (например, исполняемые файлы Windows содержат небольшую заглушку для программы DOS, единственной целью которой является отображение сообщения «Эта программа не выполняется под DOS»).

Тем не менее, поскольку исполняемые файлы обычно должны что-то делать (т. Е. Их код и сегмент (ы) содержат полезные данные), а хранилище стоит дешево, по умолчанию никто не оптимизирует для вашего случая: -)

Однако я полагаю, что большинство компиляторов имеют параметры командной строки, с помощью которых вы можете принудительно оптимизировать их для пространства - вы можете проверить результаты с этим параметром.

Вот подробней о форматах файлов EXE .

4 голосов
/ 05 января 2011

Как выяснилось, мне следовало догадаться об этом заранее ... ответом были символы и код отладки;те занимали большую часть пространства.Не компилирование с / DEBUG и / PDB (что я всегда делаю по умолчанию) уменьшило 13 K до 3 K.

...