VC 2005 - минимальный размер модуля
От: Аноним  
Дата: 08.11.06 11:28
Оценка:
Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
Re: VC 2005 - минимальный размер модуля
От: korzhik Россия  
Дата: 08.11.06 11:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.


Можно написать свою собственную stub-программу, может удасться сэкономить пару сотен байт
А если серьёзно, то может упаковщик какой-нибудь попробовать.

Или на асме всё переписать
Re: VC 2005 - минимальный размер модуля
От: 0xd34df00d Россия  
Дата: 08.11.06 11:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.


http://gzip.rsdn.ru/article/cpp/crt.xml
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.
And solder won't keep me together (c)
Re[2]: VC 2005 - минимальный размер модуля
От: Аноним  
Дата: 08.11.06 11:46
Оценка:
От рантайма я уже избавился.
Re[2]: VC 2005 - минимальный размер модуля
От: Аноним  
Дата: 08.11.06 11:52
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Можно написать свою собственную stub-программу, может удасться сэкономить пару сотен байт

K>А если серьёзно, то может упаковщик какой-нибудь попробовать.
Не, упаковщик — это не то. Я хочу программу сделать реально меньше, а не сделать вид что она меньше.

K>Или на асме всё переписать

А почему на асме — тот асм что нагенерил компилятор итак невелик. Размер файла, имхо — заслуга линкера.
Уверен сделать ещё меньше — можно.
Помню что-то когда-то видел в интернете информацию на эту тему (правда не по VC 2005, а VC 6). Вроде есть (был) ключик для линкера какой-то.
Re[3]: VC 2005 - минимальный размер модуля
От: Sergey Россия  
Дата: 08.11.06 12:00
Оценка:
" Аноним " <0@users.rsdn.ru> wrote in message news:2204226@news.rsdn.ru...
> Здравствуйте, korzhik, Вы писали:
>
> K>Можно написать свою собственную stub-программу, может удасться сэкономить пару сотен байт
> K>А если серьёзно, то может упаковщик какой-нибудь попробовать.
> Не, упаковщик — это не то. Я хочу программу сделать реально меньше, а не сделать вид что она меньше.
>
> K>Или на асме всё переписать
> А почему на асме — тот асм что нагенерил компилятор итак невелик. Размер файла, имхо — заслуга линкера.
> Уверен сделать ещё меньше — можно.
> Помню что-то когда-то видел в интернете информацию на эту тему (правда не по VC 2005, а VC 6). Вроде есть (был) ключик для линкера какой-то.

/ALIGN ? Ну и проверить, что манифеста в екзешнике нет.
Posted via RSDN NNTP Server 2.0
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: VC 2005 - минимальный размер модуля
От: Andrew_D  
Дата: 08.11.06 13:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.


Попробуй добавить линкеру вот эти ключики:
/OPT:REF /OPT:ICF /OPT:WIN98
+ в опциях компилера можно выставить /O1 и favor for small code
Re[2]: VC 2005 - минимальный размер модуля
От: Sergey Россия  
Дата: 08.11.06 13:16
Оценка:
"Andrew_D" <53050@users.rsdn.ru> wrote in message news:2204412@news.rsdn.ru...
> Здравствуйте, Аноним, Вы писали:
>
> А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
>
> Попробуй добавить линкеру вот эти ключики:
> /OPT:REF /OPT:ICF /OPT:WIN98

Наоборот — если надо меньший размер, то опция должна быть /OPT:NOWIN98.
Posted via RSDN NNTP Server 2.0
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: VC 2005 - минимальный размер модуля
От: Andrew_D  
Дата: 08.11.06 13:27
Оценка:
Здравствуйте, Sergey, Вы писали:


S>"Andrew_D" <53050@users.rsdn.ru> wrote in message news:2204412@news.rsdn.ru...

>> Здравствуйте, Аноним, Вы писали:
>>
>> А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
>>
>> Попробуй добавить линкеру вот эти ключики:
>> /OPT:REF /OPT:ICF /OPT:WIN98

S>Наоборот — если надо меньший размер, то опция должна быть /OPT:NOWIN98.


Точно! — спасибо за поправку
Re[2]: VC 2005 - минимальный размер модуля
От: Аноним  
Дата: 08.11.06 16:11
Оценка:
Здравствуйте, Andrew_D, Вы писали:

Проверил всё что может влиять на размер файла в сторону увеличения, поправил — теперь 52 КБ

Возникает вопрос: а почему всё такое большое? Если мне не изменяет память — в 6 VC размер минимальной Win аппликции получался 40-50 КБ со статическим линком к рантайму, без извратов и трюков, а тут 200 КБ с рантаймом и 50 — если его открутить. Слышал, что при откручивании рантайма в 6-ом VC можно было даже в несколько килобайт уложиться, сам не пробовал.

Понятно, что в наше время 20 КБ или 200 КБ — без разницы. Но интересно (и не совсем понятно), что же в эти 200КБ напихано и зачем оно нужно (нужно ли)? Ну и субъективно — иметь утилитку в 20 КБ мне лично всё же приятнее чем в 200. При такой разнице я может даже не поленюсь подобные штуки 6-ым VC собирать.
Re[3]: VC 2005 - минимальный размер модуля
От: Аноним  
Дата: 08.11.06 16:23
Оценка:
Соврал: сейчас собрал настоящую минимальную Win32 app c дефолтными установками — вышло 92 КБ (стат. рантайм). Многовато, но всё же не 200. При этом дефолтные установки в VC 2005 на мой вкус странные — например включенный RTTI. Если там пошуровать — ещё сколько-нибудь ужмётся.
Re[3]: VC 2005 - минимальный размер модуля
От: Ivan Россия www.rsdn.ru
Дата: 08.11.06 17:06
Оценка: 13 (3)
Здравствуйте, Аноним, Вы писали:

А>Возникает вопрос: а почему всё такое большое? Если мне не изменяет память — в 6 VC размер минимальной Win аппликции получался 40-50 КБ со статическим линком к рантайму, без извратов и трюков, а тут 200 КБ с рантаймом и 50 — если его открутить. Слышал, что при откручивании рантайма в 6-ом VC можно было даже в несколько килобайт уложиться, сам не пробовал.


Прежде всего нужно включить генерацию map файла (linker/debuggin/generate amp file = yes. Вполне возможно, что размер бинарника вырос за счет ресурсов — мастер win32 приложения создает проект с довольно объемнымии ресурсами.

Если в CRT необходимости нет — не используются исключения, функции crt, нет глобальных переменных с конструкторами — можно избавиться от CRT совсем.
Вот пример win32 приложение (cl test.cpp user32.lib), которое компилируется в 2kb бинарный файл
#include <Windows.h>
#pragma comment(linker, "/nodefaultlib")
#pragma comment(linker, "/entry:WinMain")
int WINAPI WinMain(HINSTANCE hInstance,    
                   HINSTANCE hPrevInstance,
                 LPSTR lpCmdLine,
                 int nCmdShow
                 )
{
    MessageBox(0, "Hello, world", "Hello", MB_OK);
    return 0;
}


Если CRT нужна, можно попробовать переключиться на _ATL_MIN_CRT . Минимальную реализацию crt из ATL можно использовать даже для не ATL проектов. Ограничения — нельзя использовать C++ исключения (SEH можно) и некоторые функции CRT (в ATL реализваны не все). например вместо sprintf придется использовать win32 api аналог wsprintf (для большинства CRT функций есть аналоги в win32 api). ЧТобы переключиться на _ATL_MIN_CRT достаточно на вкладке general включить "Minimize crt use in ATL", на закладке c++/code generation выключить c++ exceptions и включить <atlbase.h> первым хедером в stdafx.h. Если в проекте использовались исключения или расширенные функции CRT — он не соберется с ошибкой "unresolved external symbol _main". В этом случае нужно включить на закладке Linker/General/Show progress "Display all progress messages" и смотреть в output какие объектные файлы и функции потянули crt.

Дополнительно к этому на размер влияют:
— опитмизация компилятора O1 и линковщика OPT:REF, OPT:ICF, OPT:NOWIN98
— объединение секций
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/MERGE:.text=.text")
#pragma comment(linker, "/MERGE:.reloc=.text")
Re[4]: VC 2005 - минимальный размер модуля
От: Аноним  
Дата: 08.11.06 17:44
Оценка: :)
I>Прежде всего нужно включить генерацию map файла (linker/debuggin/generate amp file = yes. Вполне возможно, что размер бинарника вырос за счет ресурсов — мастер win32 приложения создает проект с довольно объемнымии ресурсами.
Угу. Две иконки сгенерённые визардом — каждая по 24 КБ!
Re: VC 2005 - минимальный размер модуля
От: ncode  
Дата: 09.11.06 13:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.


Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.
Re[2]: VC 2005 - минимальный размер модуля
От: IID Россия  
Дата: 09.11.06 21:43
Оценка:
Здравствуйте, ncode, Вы писали:

N>Здравствуйте, Аноним, Вы писали:


А>>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.


N>Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.


Минимальный Win32PE, показывающий MessageBox — 59 байт. Пролетал то ли на wasm.ru то ли на xakep.ru
kalsarikännit
Re[2]: VC 2005 - минимальный размер модуля
От: TiLex Россия  
Дата: 11.11.06 04:22
Оценка:
Здравствуйте, ncode, Вы писали:

N>Здравствуйте, Аноним, Вы писали:


А>>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.


N>Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.


Если порезать рантайм, то можно получить экзешник около 600 байт, исключительно за счет настроек линкера в с++. Ассемблер тут абсолютно не при чем.
Что за странный стереотип насчет ассемблера
Re[3]: VC 2005 - минимальный размер модуля
От: TiLex Россия  
Дата: 11.11.06 04:26
Оценка:
Здравствуйте, IID, Вы писали:

IID>Здравствуйте, ncode, Вы писали:


N>>Здравствуйте, Аноним, Вы писали:


А>>>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.


N>>Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.


IID>Минимальный Win32PE, показывающий MessageBox — 59 байт. Пролетал то ли на wasm.ru то ли на xakep.ru


Ни один линкер ни при каких настройках такое не сделает. Только если вручную PE-заголовок сделать.
Все равно не вижу смысла во всем этом. Только ради фаллокомпарации, разве что.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.