Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Уменьшение размера исполняемого кода


Автор: Dаedra 18.5.2009, 17:25
Столкнулся с небольшой проблемой: даже самая маленькая программа из 5ти операторов занимает на диске по 160 кб. Например, написал такой код в Студии 2006:
Код

#include <stdio.h>

int main(){
    int x=0;
    printf("hello world");
    scanf("%d",&x);
    return 0;
}

После компиляции получил экзешник размером 160 кб. Как мне кажется, в экзешник компилируется вся включаемая библиотека stdio и все библиотеки, которые она подключает директивой include. И вот хочется узнать, можно как-то уменьшить размер кода с помощью ключей компилятора или линкера?
Искал в сети примеры такой оптимизации, натолкнулся на скомпилированный небольшой сервер и его исходник. Сам экзешник весит всего 9 кб, никаким пакером, кажется, не упакован. В исходнике был такой заголовок:
Код

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [ INCLUDE'S ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  \\

#include <winsock2.h>
#include <stdio.h>


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [ PRAGMA'S ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  \\

#pragma comment( lib, "ws2_32.lib" )
#pragma comment( lib, "kernel32.lib" )
#pragma comment( lib, "user32.lib" )

#pragma optimize("gsy",on)
#pragma comment(linker,"/RELEASE")
#pragma comment(linker,"/NOLOGO")
#pragma comment(linker,"/NODEFAULTLIB")
#pragma comment(linker,"/MERGE:.rdata=.text /MERGE:.data=.text") 
#pragma comment(linker,"/SECTION:.text,EWR")
#pragma comment(linker,"/FILEALIGN:512")
#pragma comment(linker,"/SUBSYSTEM:CONSOLE")
#pragma comment(linker,"/IGNORE:4078")
#pragma comment(linker,"/ENTRY:main")

И в статье, где была ссылка на этот пример, было описание методов оптимизации через pragma. Но даже скопировав этот заголовок в свою программу, я не только не уменьшил ее размер, но еще и увеличил ее на 40 кб. К тому же программа не хотела компилироваться, пока я не вырезал #pragma comment(linker,"/NODEFAULTLIB").
Пакеры использовать не хочу, потому что они чаще всего сжимают только размер исполняемого файла, а в оперативке программа разворачивается во весь свой размер. Можно как-то самому уменьшить размер генерируемого кода средствами Студии, чтобы приблизиться к размеру ассемблерных программ?

Автор: GoldFinch 18.5.2009, 17:34
достаточно #pragma comment(linker,"/entry:main")

Автор: SenkraD 18.5.2009, 19:27
Dаedra, ещё можно подменить CRT.
Мне в своё время помогла http://wcrt.sourceforge.net/ версия CRT

Автор: Dаedra 18.5.2009, 20:41
Цитата

достаточно #pragma comment(linker,"/entry:main")

у меня после этого программа стала рушиться через секунду после запуска, но её объем так и не уменьшился

Автор: Dаedra 18.5.2009, 21:08
Кстати, может, я что-то не так делаю, но я скачал WCRT, файл wcrt.lib кинул к другим либам, в папке хедеров создал папку wcrt и в нее скинул все хедеры библиотеки wcrt, в программе подключил stdio так:
Код

#include <wcrt/stdio.h>

 то есть, хедеры находятся относительно стандартной папки так: Include/wcrt/stdio.h, но размер так и не уменьшился. может, что-то еще нужно сделать?

Автор: GoldFinch 18.5.2009, 21:21
Цитата(Dаedra @  18.5.2009,  21:41 Найти цитируемый пост)
у меня после этого программа стала рушиться через секунду после запуска, но её объем так и не уменьшился 

при использованни этой строчки нельзя юзать CRT

Автор: math64 19.5.2009, 07:48
Может лучше выбрать другой компилятор? Например gcc.

Автор: SenkraD 19.5.2009, 08:48
Dаedra, wcrt используем так:
    - говорил линкеру, что мы её используем
    - говорим что мы игнорим стандартную crt

Автор: Echo78 27.6.2009, 11:20
Цитата(math64 @ 19.5.2009,  07:48)
Может лучше выбрать другой компилятор? Например gcc.

Это было одной из причин, по которой я выбрал gcc, теперь в нём и работаю.  smile 
В нём размер exe-файла после strip становится маленьким... 

Автор: DrHex 29.6.2009, 00:04
Цитата

достаточно #pragma comment(linker,"/entry:main")

А ресурсы ручками прикручивать? Так а смысл? Размер не особо уменьшится.
Если не хочется заниматся формированием исполняемого файла вручную, то просто упаковывай файл
Упаковщики UPX, Aspack, PeCompact(Это не реклама, UPX открый для использования и работает на многих ОС) ..... 

Автор: chaos 29.6.2009, 06:21
Dаedra, чот сказки какие-то
специально залез на машину на которой стоит VS2003 - на ней ваш пример собирается в ехе размером 44к релизная версия.

ЗЫ да и вообще считаю рано вы смотрите на размер бинарника

Автор: chaos 29.6.2009, 07:15
Цитата(math64 @ 19.5.2009,  04:48)
Может лучше выбрать другой компилятор? Например gcc.

с другим компилятором мы нормально сможем компилять под винду?

ЗЫ например COM server

Автор: andrew_121 29.6.2009, 08:09
chaos,  smile 

Автор: Lazin 29.6.2009, 08:33
Цитата(chaos @  29.6.2009,  07:15 Найти цитируемый пост)
с другим компилятором мы нормально сможем компилять под винду?

ЗЫ например COM server

сильно сомневаюсь, лучше для этого использовать visual studio

Автор: GoldFinch 29.6.2009, 08:38
Цитата(DrHex @  29.6.2009,  01:04 Найти цитируемый пост)
достаточно #pragma comment(linker,"/entry:main")

А ресурсы ручками прикручивать? Так а смысл? Размер не особо уменьшится.


а при чем тут ресурсы и точка входа? размер уменьшается как раз на размер CRT, до единиц килобайт
получается 0x400 байт на заголовок, выравнивание 0х200*(число секций) , а остальное - сколько кода напишешь - столько и будет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)