При компиляции программы, фактически состоящей лишь из одного вызова функции MessageBox, получается исполняемый файл размером 30 Кб. Как уменьшить его размер?25.12.03 14:27 Publisher: dl <Dmitry Leonov>
При компиляции программы, фактически состоящей лишь из одного вызова функции MessageBox, получается исполняемый файл размером 30 Кб. Как уменьшить его размер? :-) http://www.bugtraq.ru/cgi-bin/iforum.mcgi?type=si&u=94
Такой размер файл имеет потому, что в него включается код стандартной библиотеки времени выполнения языка C/С++ (Standard C/С++ Run-Time Library, далее – RTL).
Если стандартная библиотека C/C++ Вам не нужна, и Вы целиком напишите программу на Windows API, то можно отключить RTL. Для этого на вкладке Link в окне Project Settings (для компилятора Visual C++) необходимо:
Включить опцию Ignore all default libraries (можно также использовать ключ /NOD или /NODEFAULTLIB в командной строке линкера).
После этого в программе нельзя будет пользоваться функциями библиотеки C/C++ (printf, strcpy, malloc и т.д.), а следует использовать только Windows API.
Указать линкеру главную функцию программы в поле Entry Point Symbol (или использовать ключ линкера /ENTRY)
Заметим, что, в отличие от привычных...
> Я видел подобный совет в другом месте, только там ещё > говорили выходить из программы по ExitProcess. Я не знаю > точно почему, но на всякий случай...
Не надо.
> Кто тут крутой системщик, что происходит, когда исполняется > return(1) ?
Ничего страшного не происходит. Программа возвращается в kernel32!BaseProcessStart, и там вызывается ExitThread
После завершения последнего потока вызывается ExitProcess
ЗЫ: Да, кстати, на всякий случай напомню, что есть еще два FAQ-а, посвященных уменьшению размера:
> При компиляции программы, фактически состоящей лишь из > одного вызова функции MessageBox, получается исполняемый > файл размером 30 Кб. Как уменьшить его размер? > :-) http://www.bugtraq.ru/cgi-bin/iforum.mcgi?type=si&u=94 > > > Такой размер файл имеет потому, что в него включается код > стандартной библиотеки времени выполнения языка C/С++ > (Standard C/С++ Run-Time Library, далее – RTL).
> Если стандартная библиотека C/C++ Вам не нужна, и Вы > целиком напишите программу на Windows API, то можно > отключить RTL. Для этого на вкладке Link в окне Project > Settings (для компилятора Visual C++) необходимо:
> Включить опцию Ignore all default libraries (можно также > использовать ключ /NOD или /NODEFAULTLIB в командной строке > линкера).
> После этого в программе нельзя будет пользоваться функциями > библиотеки C/C++ (printf, strcpy, malloc и т.д.), а следует > использовать только Windows API. Указать линкеру главную
> функцию программы в поле Entry Point Symbol (или > использовать ключ линкера /ENTRY) Заметим, что, в отличие
> от привычных... Воспользуйся ASPack'ом
Он увеличивает размер проги в памяти и зачастую увеличивает время запуска проги. Предлагаемый же способ уменьшает все - и размер на диске (что в принципе фигня) и размер в памяти (за счет исключения выделения памяти под нужды RTL) и скорость загрузки (за счет исключения инициализации RTL). Юзать это конечно надо только тогда когда это имеет смысл. В моей практике такое бывало не раз.
Да и вообще ASPack не по нашему). Честно говоря не очень понимаю какой с него толк кроме легкой защиты от взлома. А размер инсталляционного пакета проги с ехешником запакованным аспаком больше чем размер того же пакета, но с простым ехешником (это в случае нормальной инсталляшки которая сама умеет хорошо жать, самопальные склеивалки всего в один файл не в счет) .
Да. И еще в случае с dll-ками17.01.05 12:21 Автор: amirul <Serge> Статус: The Elderman
Описанный метод позволит разным процессам разделять память под ней, внешние же упаковщики за счет CoW будут отжирать память в каждом процессе, который использует эту длл-ку.