Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
Здравствуйте, Аноним, Вы писали:
А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
Можно написать свою собственную stub-программу, может удасться сэкономить пару сотен байт
А если серьёзно, то может упаковщик какой-нибудь попробовать.
Здравствуйте, Аноним, Вы писали:
А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
Здравствуйте, korzhik, Вы писали:
K>Можно написать свою собственную stub-программу, может удасться сэкономить пару сотен байт K>А если серьёзно, то может упаковщик какой-нибудь попробовать.
Не, упаковщик — это не то. Я хочу программу сделать реально меньше, а не сделать вид что она меньше.
K>Или на асме всё переписать
А почему на асме — тот асм что нагенерил компилятор итак невелик. Размер файла, имхо — заслуга линкера.
Уверен сделать ещё меньше — можно.
Помню что-то когда-то видел в интернете информацию на эту тему (правда не по VC 2005, а VC 6). Вроде есть (был) ключик для линкера какой-то.
" Аноним " <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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Аноним, Вы писали:
А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
Попробуй добавить линкеру вот эти ключики:
/OPT:REF /OPT:ICF /OPT:WIN98
+ в опциях компилера можно выставить /O1 и favor for small code
"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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
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. Если там пошуровать — ещё сколько-нибудь ужмётся.
Здравствуйте, Аноним, Вы писали:
А>Возникает вопрос: а почему всё такое большое? Если мне не изменяет память — в 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 бинарный файл
Если 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 КБ!
Здравствуйте, Аноним, Вы писали:
А>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.
Здравствуйте, ncode, Вы писали:
N>Здравствуйте, Аноним, Вы писали:
А>>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
N>Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.
Минимальный Win32PE, показывающий MessageBox — 59 байт. Пролетал то ли на wasm.ru то ли на xakep.ru
Здравствуйте, ncode, Вы писали:
N>Здравствуйте, Аноним, Вы писали:
А>>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
N>Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.
Если порезать рантайм, то можно получить экзешник около 600 байт, исключительно за счет настроек линкера в с++. Ассемблер тут абсолютно не при чем.
Что за странный стереотип насчет ассемблера
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, ncode, Вы писали:
N>>Здравствуйте, Аноним, Вы писали:
А>>>Есть крохотная Win32 аппликация, использует только API функции. Размер релизного билда (статический рантайм) с обычными установками — 200 КБ (это практ всё "не моё"). Хочу уменьшить до возможного минимума. Собрал без рантайма — стало 60 КБ. А как бы ещё ужать — уверен, что можно.
N>>Помнится, собирал консольный "Хелло Ворлд" в VC7. По умолчанию выходило где-то 20-30 к.б. После длительного изучения вопроса уменьшения екзешника добился размера в 2кб (исключительно за счет опций компилера и линкера). Столько же получилось когда я переделал программу на ассемблере. По всей видимости это предел для формата PE EXE.
IID>Минимальный Win32PE, показывающий MessageBox — 59 байт. Пролетал то ли на wasm.ru то ли на xakep.ru
Ни один линкер ни при каких настройках такое не сделает. Только если вручную PE-заголовок сделать.
Все равно не вижу смысла во всем этом. Только ради фаллокомпарации, разве что.