Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
smile Прикольный аватар. Я тоже такой хочу сделать. smile

Автор: Alexandr87 5.1.2005, 19:33
ухх, какую опцию линкера нашёл
/opt:nowin98
Уменьшение величины выравнивания файловых секций

Автор: Fixin 5.1.2005, 19:34
А где ты искал. Я тоже хочу посмотреть smile

Автор: Alexandr87 5.1.2005, 19:34
Сейчас я добился, что скомпиленный exe, который просто загружает библиотеку и вызывает из нее функцию занимает у меня 1024 байт (и это без всяких асмов)

Автор: Fixin 5.1.2005, 19:36
Неплохо. А собственное окно не создает?
Добавлено @ 19:38
А по-подробнее о том что ты использовал для уменьшения smile
А какой компилятор?

Автор: 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
Супер!!!!!!!!!!!!!!!! smile smile smile smile
Класс!!!
Я б тебе репутацию поднял, если б мог.

Автор: Fixin 5.1.2005, 20:24
Код

#pragma comment(linker, "/ENTRY:aWinMain"), где aWinMain - ваша функция


А почему это во столько раз уменьшает размер проги?
И работать все перестает в проге. smile

Автор: 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
Цитата(Perchilla @ 5.1.2005, 20:55)
http://www.rsdn.ru/article/cpp/crt.xml

Спосибо за ссылочку smile

Автор: chipset 27.1.2005, 03:50
У меня был рекорд - DLL 4 кб со всеми стандартными функциями smile

Автор: 4udo 16.4.2006, 09:57
Привет,всем.
Суперская тема - вношу две лепты.

1.Можно влинковать свой Stub - делается так #pragma comment /STUB:stub.exe
Ещё вот кое-какие прагмы 
/ALIGN:4096 /NODEFAULTLIB /IGNORE:4078

2.Все эти оптимизациии сконцентрированы вот здесь - AggressiveOptimize.h:
Код

//////////////////////////////
// Version 1.40 
// October 22nd, 2002 - .NET (VC7, _MSC_VER=1300) support!
// Version 1.30
// Nov 24th, 2000
// Version 1.20
// Jun 9th, 2000
// Version 1.10
// Jan 23rd, 2000
// Version 1.00
// May 20th, 1999
// Todd C. Wilson, Fresh Ground Software
// ([email protected])
// This header file will kick in settings for Visual C++ 5 and 6 that will (usually)
// result in smaller exe's.
// The "trick" is to tell the compiler to not pad out the function calls; this is done
// by not using the /O1 or /O2 option - if you do, you implicitly use /Gy, which pads
// out each and every function call. In one single 500k dll, I managed to cut out 120k
// by this alone!
// The other two "tricks" are telling the Linker to merge all data-type segments together
// in the exe file. The relocation, read-only (constants) data, and code section (.text)
// sections can almost always be merged. Each section merged can save 4k in exe space,
// since each section is padded out to 4k chunks. This is very noticeable with smaller
// exes, since you could have only 700 bytes of data, 300 bytes of code, 94 bytes of
// strings - padded out, this could be 12k of runtime, for 1094 bytes of stuff! For larger
// programs, this is less overall, but can save at least 4k.
// Note that if you're using MFC static or some other 3rd party libs, you may get poor
// results with merging the readonly (.rdata) section - the exe may grow larger.
// To use this feature, define _MERGE_DATA_ in your project or before this header is used.
// With Visual C++ 5, the program uses a file alignment of 512 bytes, which results
// in a small exe. Under VC6, the program instead uses 4k, which is the same as the
// section size. The reason (from what I understand) is that 4k is the chunk size of
// the virtual memory manager, and that WinAlign (an end-user tuning tool for Win98)
// will re-align the programs on this boundary. The problem with this is that all of
// Microsoft's system exes and dlls are *NOT* tuned like this, and using 4k causes serious
// exe bloat. This is very noticeable for smaller programs.
// The "trick" for this is to use the undocumented FILEALIGN linker parm to change the
// padding from 4k to 1/2k, which results in a much smaller exe - anywhere from 20%-75%
// depending on the size. Note that this is the same as using /OPT:NOWIN98, which *is*
// a previously documented switch, but was left out of the docs for some reason in VC6 and
// all of the current MSDN's - see KB:Q235956 for more information.
// Microsoft does say that using the 4k alignment will "speed up process loading",
// but I've been unable to notice a difference, even on my P180, with a very large (4meg) exe.
// Please note, however, that this will probably not change the size of the COMPRESSED
// file (either in a .zip file or in an install archive), since this 4k is all zeroes and
// gets compressed away.
// Also, the /ALIGN:4096 switch will "magically" do the same thing, even though this is the
// default setting for this switch. Apparently this sets the same values as the above two
// switches do. We do not use this in this header, since it smacks of a bug and not a feature.
// Thanks to Michael Geary <[email protected]> for some additional tips!
//
// Notes about using this header in .NET
// First off, VC7 does not allow a lot of the linker command options in pragma's. There is no
// honest or good reason why Microsoft decided to make this change, it just doesn't.
// So that is why there are a lot of <1300 #if's in the header.
// If you want to take full advantage of the VC7 linker options, you will need to do it on a 
// PER PROJECT BASIS; you can no longer use a global header file like this to make it better.
// Items I strongly suggest putting in all your VC7 project linker options command line settings:
//            /ignore:4078    /RELEASE
// Compiler options:
//            /GL (Whole Program Optimization)
// If you're making an .EXE and not a .DLL, consider adding in:
//            /GA (Optimize for Windows Application)
// Some items to consider using in your VC7 projects (not VC6):
// Link-time Code Generation - whole code optimization. Put this in your exe/dll project link settings.
//            /LTCG:NOSTATUS
// The classic no-padding and no-bloat compiler C/C++ switch:
//            /opt:nowin98
//
// (C++ command line options:  /GL /opt:nowin98  and /GA for .exe files)
// (Link command line options: /ignore:4078 /RELEASE /LTCG:NOSTATUS)
//
// Now, notes on using these options in VC7 vs VC6.
// VC6 consistently, for me, produces smaller code from C++ the exact same sources,
// with or without this header. On average, VC6 produces 5% smaller binaries compared
// to VC7 compiling the exact same project, *without* this header. With this header, VC6
// will make a 13k file, while VC7 will make a 64k one. VC7 is just bloaty, pure and
// simple - all that managed/unmanaged C++ runtimes, and the CLR stuff must be getting
// in the way of code generation. However, template support is better, so there.
// Both VC6 and VC7 show the same end kind of end result savings - larger binary output
// will shave about 2% off, where as smaller projects (support DLL's, cpl's,
// activex controls, ATL libs, etc) get the best result, since the padding is usually
// more than the actual usable code. But again, VC7 does not compile down as small as VC6.
//
// The argument can be made that doing this is a waste of time, since the "zero bytes"
// will be compressed out in a zip file or install archive. Not really - it doesn't matter
// if the data is a string of zeroes or ones or 85858585 - it will still take room (20 bytes
// in a zip file, 29 bytes if only *4* of them 4k bytes are not the same) and time to
// compress that data and decompress it. Also, 20k of zeros is NOT 20k on disk - it's the
// size of the cluster slop- for Fat32 systems, 20k can be 32k, NTFS could make it 24k if you're
// just 1 byte over (round up). Most end users do not have the dual P4 Xeon systems with
// two gigs of RDram and a Raid 0+1 of Western Digital 120meg Special Editions that all
// worthy developers have (all six of us), so they will need any space and LOADING TIME
// savings they will need; taking an extra 32k or more out of your end user's 64megs of
// ram on Windows 98 is Not a Good Thing.
//
// Now, as a ADDED BONUS at NO EXTRA COST TO YOU! Under VC6, using the /merge:.text=.data
// pragma will cause the output file to be un-disassembleable! (is that a word?) At least,
// with the normal tools - WinDisam, DumpBin, and the like will not work. Try it - use the
// header, compile release, and then use DUMPBIN /DISASM filename.exe - no code!
// Thanks to Gлzim Pani <[email protected]> for discovering this gem - for a full writeup on
// this issue and the ramifactions of it, visit www.nopcode.com for the Aggressive Optimize
// article.

#ifndef _AGGRESSIVEOPTIMIZE_H_
#define _AGGRESSIVEOPTIMIZE_H_

#pragma warning(disable:4711)

#ifdef NDEBUG
// /Og (global optimizations), /Os (favor small code), /Oy (no frame pointers)
#pragma optimize("gsy",on)

#if (_MSC_VER<1300)
    #pragma comment(linker,"/RELEASE")
#endif

// Note that merging the .rdata section will result in LARGER exe's if you using
// MFC (esp. static link). If this is desirable, define _MERGE_RDATA_ in your project.
#ifdef _MERGE_RDATA_
#pragma comment(linker,"/merge:.rdata=.data")
#endif // _MERGE_RDATA_

#pragma comment(linker,"/merge:.text=.data")
#if (_MSC_VER<1300)
    // In VC7, this causes problems with the relocation and data tables, so best to not merge them
    #pragma comment(linker,"/merge:.reloc=.data")
#endif

// Merging sections with different attributes causes a linker warning, so
// turn off the warning. From Michael Geary. Undocumented, as usual!
#if (_MSC_VER<1300)
    // In VC7, you will need to put this in your project settings
    #pragma comment(linker,"/ignore:4078")
#endif

// With Visual C++ 5, you already get the 512-byte alignment, so you will only need
// it for VC6, and maybe later.
#if _MSC_VER >= 1000

// Option #1: use /filealign
// Totally undocumented! And if you set it lower than 512 bytes, the program crashes.
// Either leave at 0x200 or 0x1000
//#pragma comment(linker,"/FILEALIGN:0x200")

// Option #2: use /opt:nowin98
// See KB:Q235956 or the READMEVC.htm in your VC directory for info on this one.
// This is our currently preferred option, since it is fully documented and unlikely
// to break in service packs and updates.
#if (_MSC_VER<1300)
    // In VC7, you will need to put this in your project settings
    #pragma comment(linker,"/opt:nowin98")
#else

// Option #3: use /align:4096
// A side effect of using the default align value is that it turns on the above switch.
// Does nothing under Vc7 that /opt:nowin98 doesn't already give you
// #pragma comment(linker,"/ALIGN:512")
#endif

#endif // _MSC_VER >= 1000

#endif // NDEBUG

#endif //  _AGGRESSIVEOPTIMIZE_H_




3.Можно использовать  мини-библиотеку - LIBCTINY.LIB :



    
4.Кому интересно вот ещё находка , MiniCrt.h:
Код

////////////////////////////////////////
// This defines the headers for the mini C Runtime Lib.
// We use this instead of the usual one in order to cut down on the chaff
// and bloat that we don't need; for this project (RRLoginV3), doing so
// removed over 40k of C lib.
// Note that certain functions are not thread safe. These are flagged.
// Also note that if you cut out the CRT, you loose some things, such as
// automatic creation/destruction of objects that are made before the WinMain
// is hit; this is because we do not manage this area like CRT does (although
// we could, if we duplicate the code, but it's not 100% needed for RRLoginV3,
// so I left it out).
// If you delcare _USE_CRTLIB_, then the .cpp file will thunk into the crt.

#ifndef _minicrt_h_
#define _minicrt_h_

// Thread safe functions
unsigned long    GetCurrentSeconds();
void CopyMem(void *dest, const void *src, unsigned long size);
void ClearMem(void *dest,unsigned long size);
int Random(int range);

// Not thread safe functions; they use a static internal buffer. If you need a thread
// safe version, modify them or else make optional parms.
const char *StringNum(const int value);
const char *TimeAsWdMDYatHMS(const unsigned long thetime,bool shortform);
const char *PathFromFilename(const char *filename);

void InitMiniCRT(int heapsize=8192);
void KillMiniCRT();

bool GetSpecialFolderPath(HWND errWnd,char *pBuffer,int cisdl);    
char *AppendSlash(char *str);

bool SendMessageToRunningapp(UINT msg);
const char *FilenameInExePath(const char*addthis);
const char *GetCurrentAppPath();
void    LaunchApp(const char *appname,const char *command);
HKEY OpenUninstallKey(bool baseonly=false);

bool PumpMessages();

extern bool g_fQuitProgram;

#endif

 

Автор: SergeCpp 17.4.2006, 09:42
Вот, писал в своё время...

Исходники и EXE-файлы — в архиве (проекты для VS6)

Размеры в байтах

Код
Коллекция мелочей, могущих пригодиться

beep  [count]        // 1024 // == beep [count]
find   directory     // 1024 // диалог поиска файлов
prop   name          // 1024 // == <AltEnter> in Explorer
run   [name]         // 1536 // диалог запуска программ
sleep [milliseconds] // 1024 // == sleep [milliseconds]

gpf                  // 1024 // == General Protection Fault /чтение по адресу 0/
sysmove          (!) // 1104 // переименование системных файлов NT-систем /SysMove.cpp/
 

Автор: 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
Цитата(Wolf @  13.6.2006,  20:53 Найти цитируемый пост)
пишу на чистом API

Цитата(Wolf @  13.6.2006,  20:53 Найти цитируемый пост)
подключаю заголовочный файл fstream.h

Первая цитата со второй что-то никак не стыкуется smile Какая из них правильная?

З.Ы. Могу поискать свою приватную тулзу (кажись, должна была где-то сохраниться), позволяющую делать в C++ Builder самодостаточные ЕХЕшники размером от 7,5 Кб. Но она поможет только если пишешь на чистом WinAPI, без всяких там CRT и прочих VCL. 

Автор: Wolf 14.6.2006, 20:50
Да, понял, что я ламер  smile  Сёдня переделал программку, убрал fstream.h ну вот теперь то на чистом Win API (CreateFile WriteFile ReadFile), но всё равно 55 Кб не мало... Теперь подключаю только windows.h и gl.h По возможности поищи свою спасительную программку, которая поможет мне  smile  Буду примного благодарен 

Автор: rsm 15.6.2006, 22:06
Wolf, см. аттач. Там утилита, описание к ней, и парочка простеньких демонстрационных примеров. 

// fixed: исправленный аттач см. ниже по теме 

Автор: Wolf 15.6.2006, 22:49
rsm, огромное спасибо  smile  Программка просто супер, всё прекрасно работает... Описание, тоже прикольное, настроение поднимает...  smile  

Хе... Вот и вопрос возник, а что делать с dll, создаю библиотечку в ней только windows.h, в опциях также можно настраивать Use dynamic RTL и т. п. Неужели при загрузке dll, сама dll будет вызывать RTL? Короче как быть с библиотечками? 

Извеняюсь, если не по теме, хотя тоже с уменьшением размера связано, тока длл... 

Автор: Wolf 16.6.2006, 17:41
Думаю, если даже принцип удаления RTL из dll одинаковый, то точку входа надо всё равно изменять, хотя... Если DllEntryPoint заменить на WinMain )))) или не прокатит?  smile  

Автор: rsm 17.6.2006, 10:17
Цитата
Неужели при загрузке dll, сама dll будет вызывать RTL?

А почему нет? Тебя же не удивляет, что в DLL могут быть вызовы функций из системных библиотек (kernel32.dll и пр.).

Цитата(Wolf @  16.6.2006,  19:41 Найти цитируемый пост)
Если DllEntryPoint заменить на WinMain

Если бы еще тупой BСВ'шный линкер позволял переносить точку входа... нет у него такой опции, просто нет.

Цитата(Wolf @  16.6.2006,  00:49 Найти цитируемый пост)
Короче как быть с библиотечками?

Добавил поддержку DLL. 

Автор: Wolf 17.6.2006, 19:46
Просто прекрасный вклад в программирование, неужели эти америкосы не понимают, что просто прекрасно писать маленькие программы с маленькими длл, нетребующими ничего. Просто раздражает то, что на ассме написанная прога весит гораздо меньше... Но всегда хочется оценить функциональность с занимаемым объёмом... Пасибо... Вот теперь то настоящее человеческое спасибо...  smile   

Автор: rsm 17.6.2006, 23:15
Цитата(Wolf @  17.6.2006,  21:46 Найти цитируемый пост)
просто прекрасно писать маленькие программы с маленькими длл, нетребующими ничего

Понимают, и даже целые сайты создают: http://www.catch22.net http://www.foosyerdoos.fsnet.co.uk http://www.winprog.org и т.д.
Тут дело в разделении программирования для себя (WinAPI) и для дяди (MFC, Qt и иже с ними), а так же по сложности (на чистом WinAPI писать сложнее и опыта нужно больше).

Цитата(Wolf @  17.6.2006,  21:46 Найти цитируемый пост)
Просто раздражает то, что на ассме написанная прога весит гораздо меньше...

Если еще и компилятор нормальный взять (врагу не пожелаю писать на чистом WinAPI в ВСВ), тогда размеры даже уравнять получится. 

Автор: Wolf 18.6.2006, 20:27

Цитата

Если еще и компилятор нормальный взять (врагу не пожелаю писать на чистом WinAPI в ВСВ), тогда размеры даже уравнять получится.


А какие компиляторы больше всего подходят для программирования на API? Что лучше? Говорили мне, что Visual C++ но так он мне не нравится, да и ктому же стоит много... И что лучше подходит WinAPI+OpenGL или WinAPI+Direct3D 

Автор: S.A.P. 18.6.2006, 20:52
Цитата(Wolf @  18.6.2006,  20:27 Найти цитируемый пост)
Говорили мне, что Visual C++ но так он мне не нравится,

а чем он не нравится? WinAPI он и в Африке WinAPI.

есть еще бесплатный MinGW. Простое OpenGL приложение в 12 килобайт укладывается. 

Автор: rsm 18.6.2006, 21:14
Цитата(Wolf @  18.6.2006,  22:27 Найти цитируемый пост)
А какие компиляторы больше всего подходят для программирования на API? Что лучше?

Лично мне более всего нравится и полностью устраивает http://www.smorgasbordet.com/pellesc - маленькая (дистрибутив 6,5 Мб), бесплатная (в т.ч. и для коммерческого применения), удобная IDE со встроенным редактором диалогов и подсветкой аргументов WinAPI-функций. Однако, есть у нее и недостатки:
- выдаваемый компилятором код очень и очень посредственный в плане оптимизации, для задач с высоким быстродействием применять его категорически нельзя;
- поддерживается только наш родной нормальный чистый Си, без всяких там плюсов и решеток - для любителей С++ это смертельное препятствие;
- нет автодополнения;
Для моих задач Pelles C for Windows подходит идеально, но подойдет ли тебе, я не знаю.

Цитата(Wolf @  18.6.2006,  22:27 Найти цитируемый пост)
Говорили мне, что Visual C++ но так он мне не нравится, да и ктому же стоит много...

Правильно говорили - Visual C++ это, пожалуй, лучшая IDE, со всеми новомодными фишками (автодополнение, подсветка функций всплывающими подсказками и пр.) и очень хорошо оптимизирующим компилятором (лучше разве что только у Intel). Насчет цены можно не беспокоиться если не собираешься использовать ее в коммерческих целях - с сайта MS можно свободно утянуть бесплатную VC++ 2005 Express Edition. Добавишь к ней PSDK, редактор диалогов по вкусу - и будет отличная вещь!

Цитата(Wolf @  18.6.2006,  22:27 Найти цитируемый пост)
И что лучше подходит WinAPI+OpenGL или WinAPI+Direct3D

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 рулит  smile 

Автор: rsm 5.12.2006, 16:36
Цитата(Toohtik @  5.12.2006,  13:38 Найти цитируемый пост)
которая офигенно сжимает exe
Ты просто еще не видел в деле NsPack... smile

Цитата(Solomon @  5.12.2006,  13:40 Найти цитируемый пост)
 Assembler рулит
Когда как, иной раз на С писать удобнее и быстрее.

Автор: Toohtik 6.12.2006, 13:37
Цитата

Ты просто еще не видел в деле NsPack... 

Действительно. Ту же прогу сжало до 25.7 кб:-)

Автор: neosapient 6.12.2006, 20:02
Цитата

Действительно. Ту же прогу сжало до 25.7 кб:-) 

А твоя прога 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
Цитата

Ты просто еще не видел в деле NsPack... 
ну раз пошла такая пьянка то.. FSG тоже не плох (но на win2003 server проги такие не пашут изза настроек безопасности , равно как и с другими пакерами).

Автор: Dem_max 27.5.2007, 18:04
Цитата

Если еще и компилятор нормальный взять (врагу не пожелаю писать на чистом WinAPI в ВСВ), тогда размеры даже уравнять получится.


Не скажи я программирую в среде Borland C++ Builder, счас изучаю чистый WinAPI на нем, так вот готовый exe чистого окна весит 4 кБ.  (при этом секции выравниваются по 512 байт), так что не надо говорить что билдер плохой, все зависит от кривости рук. 

Цитата

Говорили мне, что Visual C++ но так он мне не нравится,


Мне он тоже не нравиться из-за трудности восприятия кода, возможно там и используется WinAPI, только вот синтаксис этого API изменен. Хотя в этом компиляторе можно использовать и стандартный синтаксис.

Автор: nerezus 27.5.2007, 18:37
Цитата

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

Автор: Любитель 28.5.2007, 01:12
Цитата(Dem_max @  27.5.2007,  18:04 Найти цитируемый пост)
Мне он тоже не нравиться из-за трудности восприятия кода, возможно там и используется WinAPI, только вот синтаксис этого API изменен.

WinAPI он и в Африке ВинАПИ это раз.
MS придумали ВинАПИ и тяжело сказать, что в ихнем компилер синтаксис ВинАПИ изменён 0 это два smile 

Цитата(nerezus)

Мне тебя жалко, если ты "хорошесть" компилятора считаешь по размеру получаемого бинарника

Угу.

Автор: 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.
Побочным эфектом сжатия является то, что программа станет немного более устойчивой к взлому, т.к будет в запакованном виде.
Приятно греет душу то, что малолетние хакеры не смогут с наскока поломать код  smile 

Автор: nerezus 30.5.2007, 16:49
dizzy1984, даже я, как полный ноль в крякинге, могу снять всякие ваши фсг и прочие ;)

Автор: Любитель 2.6.2007, 12:35
Цитата(dizzy1984 @  30.5.2007,  10:48 Найти цитируемый пост)
Я не сравнивал программы сжатия екзешников по "крутизне", но регулярно пользуюсь тулзой UPX.Побочным эфектом сжатия является то, что программа станет немного более устойчивой к взлому, т.к будет в запакованном виде.

Мдя, считать upx (в чистом виде - без всяких скрамблеров) защитой от взлома... Даже побочной... Как то странно.

Автор: W4FhLF 2.6.2007, 14:31
Цитата(Любитель @  2.6.2007,  12:35 Найти цитируемый пост)
Мдя, считать upx (в чистом виде - без всяких скрамблеров) защитой от взлома... Даже побочной... Как то странно.


Скажу больше, сам же upx имеет опцию распаковки файлом сажтых им же smile 

Автор: Любитель 5.6.2007, 15:50
Дык про то и речь. upx -d <file_name>.

Автор: jonie 5.6.2007, 20:16
[off]
Цитата

dizzy1984, даже я, как полный ноль в крякинге, могу снять всякие ваши фсг и прочие ;)
как насчет последний версий Armadillo или ASProtect ?)
[/off]
и может хватит оффтопить...?

Автор: progstone 9.8.2007, 16:42
Цитата

Alexandr87 
-Работа с дин памятью

Динамическая память и классы никуда не делись просто надо переопределить 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
Цитата

(как кто-то получил 4k - я не понимаю...)
 А я к примеру получил мешьше килобайта. И что с того?

Какая разница, какой размер, если он небольшой?

Автор: evkwarrior 24.11.2007, 03:26
nerezus
Цитата

 А я к примеру получил мешьше килобайта. И что с того?

Я писал о BCB6.


dumb
Цитата

это, простите, бред. от начала и до конца.

Простите, что?

Автор: WM_SASHA 30.1.2008, 09:44
 а у меня получилась программа весом 848 байт.она в принципе ничего не делает: выводит текст на дисплее и тихо кончает. и всего 848 байт ля-ля-ля )))) 

Автор: dizzy1984 1.2.2008, 08:39
Цитата(Любитель @  2.6.2007,  14:35 Найти цитируемый пост)
Мдя, считать upx (в чистом виде - без всяких скрамблеров) защитой от взлома... Даже побочной... Как то странно.

Ну я вот, к примеру, могу взломать незапакованный экзешник и ломал как минимум один коммерческий продукт, но мой дизасемблер w32dasm показывает кашу (запакованный код) в случае когда он упакован и я так слету не скажу что же сделать по этому поводу. Хотя делается это довольно просто, да и размер уменьшается. UPX имеет опцию распаковки, это я знаю, но 1) Еще надо как-то определить, что это upx 2) Другие упаковщики могут и не иметь опций распаковки.

Автор: MAKCim 1.2.2008, 11:43
Цитата(WM_SASHA @  30.1.2008,  09:44 Найти цитируемый пост)
а у меня получилась программа весом 848 байт.она в принципе ничего не делает: выводит текст на дисплее и тихо кончает. и всего 848 байт ля-ля-ля ))))  

ну а у меня есть рабочая программа 78 байт
и что?  smile 

Автор: Любитель 1.2.2008, 12:19
Цитата(dizzy1984 @  1.2.2008,  08:39 Найти цитируемый пост)
Хотя делается это довольно просто, да и размер уменьшается. UPX имеет опцию распаковки, это я знаю, но 1) Еще надо как-то определить, что это upx 2) Другие упаковщики могут и не иметь опций распаковки. 

Блин, а PeID и прочее зачем придуманы? smile Первый этап любого исследования, как говорится!  smile 

Автор: WM_SASHA 2.2.2008, 18:25
Цитата(MAKCim @ 1.2.2008,  11:43)
ну а у меня есть рабочая программа 78 байт
и что?  smile

круто! как сделал? без упаковщика надеюсь?

Автор: GoldFinch 2.12.2008, 20:41
Цитата(MAKCim @ 1.2.2008,  11:43)
ну а у меня есть рабочая программа 78 байт

гон. минимальный PE-файл - 97 байт

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