Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Уменьшение размера exe |
Автор: Alexandr87 5.1.2005, 19:25 |
Как можно сделать размер готового exe, я вот тут нашел такую #pragma comment(linker, "/ENTRY:aWinMain") Т.е. устанавливаем точку входа, минуя стандартную, а следовательно загрузку CRT Но говорят можно достичь, чтоб экзешник весил чуть ли не килобайт??? Поделитесь пожайлуста информацией. Заранее спасибо |
Автор: Fixin 5.1.2005, 19:31 |
Можно на асме писать, но замучисси. Чистый WinAPI занимает довольно мало ~40Kb без ресурсов, но это редкость. Попробуй упаковщики, но я не пользовался не знаю насколько удобно и эффективно. Добавлено @ 19:31 ![]() ![]() |
Автор: Alexandr87 5.1.2005, 19:33 |
ухх, какую опцию линкера нашёл /opt:nowin98 Уменьшение величины выравнивания файловых секций |
Автор: Fixin 5.1.2005, 19:34 |
А где ты искал. Я тоже хочу посмотреть ![]() |
Автор: Alexandr87 5.1.2005, 19:34 |
Сейчас я добился, что скомпиленный exe, который просто загружает библиотеку и вызывает из нее функцию занимает у меня 1024 байт (и это без всяких асмов) |
Автор: Fixin 5.1.2005, 19:36 |
Неплохо. А собственное окно не создает? Добавлено @ 19:38 А по-подробнее о том что ты использовал для уменьшения ![]() А какой компилятор? |
Автор: Alexandr87 5.1.2005, 19:57 |
Вобщем пощарился по открытым ресурсам и нашел следующее по интерисующему меня вопросу: исполняемый файл можно уменьшить если, убрать "библиотеку" RTL, для чего мы переназначаем точку входа со стандартной на ту, которая нам нужна делается это следующим образом #pragma comment(linker, "/ENTRY:aWinMain"), где aWinMain - ваша функция. Кроме того можно уменьшить exe, путем добавления следующих строк: #pragma comment(linker, "/MERGE:.rdata=.text") #pragma comment(linker, "/MERGE:.data=.text") #pragma comment(linker, "/SECTION:.text,EWRX") #pragma comment(linker, "/IGNORE:4078") Могу ошибаться так как новичок, но помоему первые три строки соединяют две секции rdata и data в text. Четвертая строка делает игнор на варнинг, который возникае вследствии первый двух строк. + в завершении сия строчка кода #pragma comment(linker, "/opt:nowin98") Здесь мы уменьшаем велечину вырвнивания файловых секкций, так как в обычных условия они выравниваются по 512 байт Ну вот, мож половина что я здесь наплел плод моей больной фантазии, но всеж. |
Автор: Fixin 5.1.2005, 20:12 |
Супер!!!!!!!!!!!!!!!! ![]() ![]() ![]() ![]() Класс!!! Я б тебе репутацию поднял, если б мог. |
Автор: Fixin 5.1.2005, 20:24 | ||
А почему это во столько раз уменьшает размер проги? И работать все перестает в проге. ![]() |
Автор: Alexandr87 5.1.2005, 20:48 |
Fixin Работать перестает не всё, но к сожалению, многое(: -Работа с числами с плавающей точкой -Работа с дин памятью -Улетает несколько стандартных функций Просто в моем примере это всё не надо было, я щас свою длл с 36 до 2 кб сжал, не конечно суперская весчь ЗЫ #pragma comment(linker, "/opt:nowin98") можно заменить на #pragma comment(linker,"/FILEALIGN:512") |
Автор: S.A.P. 5.1.2005, 20:55 |
http://www.rsdn.ru/article/cpp/crt.xml |
Автор: Nicky 27.1.2005, 02:33 | ||
Спосибо за ссылочку ![]() |
Автор: chipset 27.1.2005, 03:50 |
У меня был рекорд - DLL 4 кб со всеми стандартными функциями ![]() |
Автор: 4udo 16.4.2006, 09:57 | ||||
Привет,всем. Суперская тема - вношу две лепты. 1.Можно влинковать свой Stub - делается так #pragma comment /STUB:stub.exe Ещё вот кое-какие прагмы /ALIGN:4096 /NODEFAULTLIB /IGNORE:4078 2.Все эти оптимизациии сконцентрированы вот здесь - AggressiveOptimize.h:
3.Можно использовать мини-библиотеку - LIBCTINY.LIB : 4.Кому интересно вот ещё находка , MiniCrt.h:
|
Автор: SergeCpp 17.4.2006, 09:42 | ||
Вот, писал в своё время... Исходники и EXE-файлы — в архиве (проекты для VS6) Размеры в байтах
|
Автор: 4udo 21.4.2006, 18:23 |
Наверно тема пролопачена от и до . Осталось лишь сжимать exe - ки автоматом - пакерами , протекторами или ещё чем-то?????......... |
Автор: 4udo 29.4.2006, 12:22 |
Существенно почему - то ни кто это ни пишет,а ведь реально прописать в опциях так: /FILEALIGN:0x10 /ALIGN:0x10 Это дает существенный сброс массы исполняемого файла то бишь .exe |
Автор: aleksLAN 29.4.2006, 13:44 | ||
можно... почитай здесь http://hack-expo.void.ru/groups/uinC/text/28/index.htm |
Автор: 4udo 29.4.2006, 15:21 |
aleksLAN , походи по форуму пользуясь поиском и найдешь .exe в 153 байта. А то что в приведенной статье - все уже есть в топике читай внимательно. Вот примеры: http://forum.vingrad.ru/index.php?showtopic=18307 http://forum.vingrad.ru/index.php?showtopic=91814 |
Автор: Wolf 13.6.2006, 18:53 |
Подскажите пожалуйсата, как мне уменьшить размер exe в компиляторе Borland C++ Builder 6, пишу на чистом API. В опциях проекта на вкладке Linker снимаю галочку Use dynamic RTL, но размер увеличивается с 10 Кб до 55 Кб, а если подключаю заголовочный файл fstream.h до вобще до 280 Кб. В чём причина? Возможно ли уменьшение в BCB6? |
Автор: rsm 14.6.2006, 19:10 |
Первая цитата со второй что-то никак не стыкуется ![]() З.Ы. Могу поискать свою приватную тулзу (кажись, должна была где-то сохраниться), позволяющую делать в C++ Builder самодостаточные ЕХЕшники размером от 7,5 Кб. Но она поможет только если пишешь на чистом WinAPI, без всяких там CRT и прочих VCL. |
Автор: Wolf 14.6.2006, 20:50 |
Да, понял, что я ламер ![]() ![]() |
Автор: rsm 15.6.2006, 22:06 |
Wolf, см. аттач. Там утилита, описание к ней, и парочка простеньких демонстрационных примеров. // fixed: исправленный аттач см. ниже по теме |
Автор: Wolf 15.6.2006, 22:49 |
rsm, огромное спасибо ![]() ![]() Хе... Вот и вопрос возник, а что делать с dll, создаю библиотечку в ней только windows.h, в опциях также можно настраивать Use dynamic RTL и т. п. Неужели при загрузке dll, сама dll будет вызывать RTL? Короче как быть с библиотечками? Извеняюсь, если не по теме, хотя тоже с уменьшением размера связано, тока длл... |
Автор: Wolf 16.6.2006, 17:41 |
Думаю, если даже принцип удаления RTL из dll одинаковый, то точку входа надо всё равно изменять, хотя... Если DllEntryPoint заменить на WinMain )))) или не прокатит? ![]() |
Автор: rsm 17.6.2006, 10:17 | ||
А почему нет? Тебя же не удивляет, что в DLL могут быть вызовы функций из системных библиотек (kernel32.dll и пр.). Если бы еще тупой BСВ'шный линкер позволял переносить точку входа... нет у него такой опции, просто нет. Добавил поддержку DLL. |
Автор: Wolf 17.6.2006, 19:46 |
Просто прекрасный вклад в программирование, неужели эти америкосы не понимают, что просто прекрасно писать маленькие программы с маленькими длл, нетребующими ничего. Просто раздражает то, что на ассме написанная прога весит гораздо меньше... Но всегда хочется оценить функциональность с занимаемым объёмом... Пасибо... Вот теперь то настоящее человеческое спасибо... ![]() |
Автор: Wolf 18.6.2006, 20:27 | ||
А какие компиляторы больше всего подходят для программирования на API? Что лучше? Говорили мне, что Visual C++ но так он мне не нравится, да и ктому же стоит много... И что лучше подходит WinAPI+OpenGL или WinAPI+Direct3D |
Автор: S.A.P. 18.6.2006, 20:52 |
а чем он не нравится? WinAPI он и в Африке WinAPI. есть еще бесплатный MinGW. Простое OpenGL приложение в 12 килобайт укладывается. |
Автор: rsm 18.6.2006, 21:14 | ||||
Лично мне более всего нравится и полностью устраивает http://www.smorgasbordet.com/pellesc - маленькая (дистрибутив 6,5 Мб), бесплатная (в т.ч. и для коммерческого применения), удобная IDE со встроенным редактором диалогов и подсветкой аргументов WinAPI-функций. Однако, есть у нее и недостатки: - выдаваемый компилятором код очень и очень посредственный в плане оптимизации, для задач с высоким быстродействием применять его категорически нельзя; - поддерживается только наш родной нормальный чистый Си, без всяких там плюсов и решеток - для любителей С++ это смертельное препятствие; - нет автодополнения; Для моих задач Pelles C for Windows подходит идеально, но подойдет ли тебе, я не знаю.
Правильно говорили - Visual C++ это, пожалуй, лучшая IDE, со всеми новомодными фишками (автодополнение, подсветка функций всплывающими подсказками и пр.) и очень хорошо оптимизирующим компилятором (лучше разве что только у Intel). Насчет цены можно не беспокоиться если не собираешься использовать ее в коммерческих целях - с сайта MS можно свободно утянуть бесплатную VC++ 2005 Express Edition. Добавишь к ней PSDK, редактор диалогов по вкусу - и будет отличная вещь! VC++ или еще лучше Intel C++ Compiler. Отличная оптимизация по размеру и скорости, плюс в отличие от ВСВ не будет ультра-геморроя с подключением хидеров и библиотек DirectX. |
Автор: Toohtik 5.12.2006, 11:38 |
Я в этой теме новичок, но недавно нашел прогу под названием ASPack, которая офигенно сжимает exe. Для примера: после написания мной проги она весила - 160кб, а псоле сжатия ASPack`ом - 33Кб. Почему бы не использовать её для сжатия exe? |
Автор: Solomon 5.12.2006, 11:40 |
rsm, Assembler рулит ![]() |
Автор: rsm 5.12.2006, 16:36 |
Ты просто еще не видел в деле NsPack... ![]() Когда как, иной раз на С писать удобнее и быстрее. |
Автор: Toohtik 6.12.2006, 13:37 | ||
Действительно. Ту же прогу сжало до 25.7 кб:-) |
Автор: neosapient 6.12.2006, 20:02 | ||
А твоя прога Relese или Debug, а то во втором случае много лишнего имеется... |
Автор: nerezus 27.5.2007, 14:23 |
cl.exe /nologo /TC сырец.c /link msvcrt.lib /ALIGN:32 /FIXED /MERGE:.rdata=.text /NODEFAULTLIB /MERGE:.data=.text /RELEASE /MACHINE:IX86 /ENTRY:main /out:прога.exe ;) около 600 байт для хеллоуорлдов. При этом хеллоуорлд на Python'е - 700байт(да, скомпилил), но требует dll питона. |
Автор: jonie 27.5.2007, 14:39 | ||
|
Автор: Dem_max 27.5.2007, 18:04 | ||||
Не скажи я программирую в среде Borland C++ Builder, счас изучаю чистый WinAPI на нем, так вот готовый exe чистого окна весит 4 кБ. (при этом секции выравниваются по 512 байт), так что не надо говорить что билдер плохой, все зависит от кривости рук.
Мне он тоже не нравиться из-за трудности восприятия кода, возможно там и используется WinAPI, только вот синтаксис этого API изменен. Хотя в этом компиляторе можно использовать и стандартный синтаксис. |
Автор: nerezus 27.5.2007, 18:37 | ||
|
Автор: Любитель 28.5.2007, 01:12 | ||||
WinAPI он и в Африке ВинАПИ это раз. MS придумали ВинАПИ и тяжело сказать, что в ихнем компилер синтаксис ВинАПИ изменён 0 это два ![]()
Угу. |
Автор: Dem_max 28.5.2007, 19:45 |
Мне вообще Fortran нравиться... и считает он лучше.. |
Автор: Toohtik 28.5.2007, 19:54 |
Dem_max, я слыхал что это язык для мат вычислений? |
Автор: Dem_max 28.5.2007, 20:27 |
Я не слыхал, я даже на нем программировал. |
Автор: dizzy1984 30.5.2007, 10:48 |
Я не сравнивал программы сжатия екзешников по "крутизне", но регулярно пользуюсь тулзой UPX. Побочным эфектом сжатия является то, что программа станет немного более устойчивой к взлому, т.к будет в запакованном виде. Приятно греет душу то, что малолетние хакеры не смогут с наскока поломать код ![]() |
Автор: nerezus 30.5.2007, 16:49 |
dizzy1984, даже я, как полный ноль в крякинге, могу снять всякие ваши фсг и прочие ;) |
Автор: Любитель 2.6.2007, 12:35 | ||
Мдя, считать upx (в чистом виде - без всяких скрамблеров) защитой от взлома... Даже побочной... Как то странно. |
Автор: W4FhLF 2.6.2007, 14:31 | ||
Скажу больше, сам же upx имеет опцию распаковки файлом сажтых им же ![]() |
Автор: Любитель 5.6.2007, 15:50 |
Дык про то и речь. upx -d <file_name>. |
Автор: jonie 5.6.2007, 20:16 | ||
[off]
[/off] и может хватит оффтопить...? |
Автор: progstone 9.8.2007, 16:42 | ||
Динамическая память и классы никуда не делись просто надо переопределить new и delete через VirtualAlloc единственное что не надо использовать это статические глобальные экземпляры классов вместо них нужно использовать глобыльные указатели на классы и память выделять динамически |
Автор: evkwarrior 22.11.2007, 09:05 |
Ребят, давайте перестанем спорить, какой компилятор лучше, а будем дальше сжимать екзешник!))) Вот я, например, учился и до сих пор пишу на BCB6, давно хотел освоить VC7, но всё руки не доходят. Если сравнивать только компиляторы, т.е., к примеру, bcc32.exe и ilink32, то, наверное билдер проиграет. Но а если говорить об IDE и всех его наворотах? Компоненты рулят, если уметь их использовать, потому что они очень глючные. Если вы не знаете, что в AnsiString нельзя хранить большие строки, если не знаете, что TImage мерцает, а TPaintBox нет, то вы всегда будете считать VCL и BCB гавном. Таких нюансов очень много, поэтому ещё неизвестно, что сложнее - выучить API или компоненты. Но вот, что я хотел добавить: уменьшение размера EXE в BCB его же средствами: - включаем "Use dynamic RTL" - вкл. "Build with runtime packages" - удаляем файлы формы - удаляем файлы ресурсов И прога с WinAPI-ным окошком будет занимать 11k (как кто-то получил 4k - я не понимаю...) Включаем всё это, и прога весит около 500k (я проводил тестирование) Опции компилятора, компоновщика, паскаля можно настроить в файле проекта (*.BPR), но не во внешнем редакторе (это бессмысленно), а выбрав Project->Edit Open Source. Я почти всё перепробовал, но меньше файл не стал. В итоге вообще борланд перестал создавать екзешник)))) Почему-то в хелпе написано, что можно поиграться с опциями выравнивания компоновщика -Af:512 и -Ao:4096, и сделать их меньше, но на деле меньше сделать их нельзя!!! Может, кто-нибудь знает, в чем проблема? Потом я предпринял отчаянную попытку создать екзешник из командной строки. bcc32 -c -O1 file1.cpp file2.cpp ilink32 -aa -c -Gn -Af:512 -Ao:4096 file1.obj C0W32.OBJ file2.obj, , ,IMPORT32.LIB CW32.LIB, , И получил екзешник размером в 50К, который работает!!!!)))) ( я был уже этому рад) Без CW32.LIB, C0W32.OBJ (это наш враг - RTL) нифига не работает. Точнее, работает: создается файл размером в 2К, у которого размер секции text = 0 ))))) Но создаётся)))) И, конечно, программа начинается со __startup, в неё добавляются всякие RTL-кие примочки и т.д. и т.п. Вот. Может, кто-нибудь знает ещё что-то о компиляторе и линкере от Borland? |
Автор: dumb 22.11.2007, 15:55 |
это, простите, бред. от начала и до конца. |
Автор: nerezus 22.11.2007, 16:05 | ||
Какая разница, какой размер, если он небольшой? |
Автор: evkwarrior 24.11.2007, 03:26 | ||||
nerezus,
Я писал о BCB6. dumb,
Простите, что? |
Автор: WM_SASHA 30.1.2008, 09:44 |
а у меня получилась программа весом 848 байт.она в принципе ничего не делает: выводит текст на дисплее и тихо кончает. и всего 848 байт ля-ля-ля )))) |
Автор: dizzy1984 1.2.2008, 08:39 | ||
Ну я вот, к примеру, могу взломать незапакованный экзешник и ломал как минимум один коммерческий продукт, но мой дизасемблер w32dasm показывает кашу (запакованный код) в случае когда он упакован и я так слету не скажу что же сделать по этому поводу. Хотя делается это довольно просто, да и размер уменьшается. UPX имеет опцию распаковки, это я знаю, но 1) Еще надо как-то определить, что это upx 2) Другие упаковщики могут и не иметь опций распаковки. |
Автор: MAKCim 1.2.2008, 11:43 | ||
ну а у меня есть рабочая программа 78 байт и что? ![]() |
Автор: Любитель 1.2.2008, 12:19 | ||
Блин, а PeID и прочее зачем придуманы? ![]() ![]() |
Автор: WM_SASHA 2.2.2008, 18:25 | ||
круто! как сделал? без упаковщика надеюсь? |
Автор: GoldFinch 2.12.2008, 20:41 | ||
гон. минимальный PE-файл - 97 байт |