C++ как уменьшить прогу ?
От: jyuyjiyuijyu  
Дата: 31.08.11 20:36
Оценка: 1 (1)
как писать утилиты размером 20 кб ? при этом используя самые свежие версии ATL
использовать CRT (msvcrt.dll) без гимора и пользоватся всеми благами цивилизации ?
подключаем два файла в командной строке линкеру
c:\msvcrt.lib c:\msvcrt_winxp.obj пишем че нить с CString компилим запускаем и...
видим memmove_s бла бла бла нет таких функций в msvcrt.dll
и тут мы делаем ход конем определяем макрос -D_CRTIMP= пересобираем
и наша программа летает зависит только от системной msvcrt.dll при этом
пользуется новой ATL (хорошие строки etc...) и весит всего 20 кб
тоесть абсолютно автономная при максимуме комфорта и минимальном размере
вот ссылка скачать c:\msvcrt.lib c:\msvcrt_winxp.obj
hxxp://slil.ru/31632539

P.S и да я так собираю на Windows XP MSVC++ 2008
Re: C++ как уменьшить прогу ?
От: мыщъх США http://nezumi-lab.org
Дата: 31.08.11 20:42
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:


J>как писать утилиты размером 20 кб ? при этом используя самые свежие версии ATL

J>использовать CRT (msvcrt.dll) без гимора и пользоватся всеми благами цивилизации ?
еще можно rtl отключить и секции смержить. на xp легко сделать exe меньше килобайта штатными средствами ms vc и без асма. не уверен, впрочем, что это будет работать на семерке.

но нормальная программа не может занимать 20 кб. так что в реальных проектах выигрыш мизерный. а все зависимые библиотеки надо покласть в дистр, получив в итоге dll hell. так что я скорее прилинкую либу статически.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: C++ как уменьшить прогу ?
От: jyuyjiyuijyu  
Дата: 31.08.11 20:55
Оценка:
Здравствуйте, мыщъх, Вы писали:

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


М>еще можно rtl отключить и секции смержить. на xp легко сделать exe меньше килобайта штатными средствами ms vc и без асма. не уверен, впрочем, что это будет работать на семерке.


да смысл же не в этом а в том что бы все было комфорт удобство
и ничего за это небыло каких то 20 кб

М>но нормальная программа не может занимать 20 кб.


вполне себе пишутся тулзы > 1000 строк со всеми
удобствами (CString etc...) размером 20 — 30 кб зависящие только от msvcrt.dll
Re: C++ как уменьшить прогу ?
От: nen777w  
Дата: 31.08.11 21:00
Оценка:
имхо это раньше было актуально когда программы целиком не помещались в кеш процессора.
а сейчас то зачем? да и правильно сказал мыщих со статической линовкой надежнее будет.
Re[2]: C++ как уменьшить прогу ?
От: jyuyjiyuijyu  
Дата: 31.08.11 21:05
Оценка:
Здравствуйте, nen777w, Вы писали:

>>а сейчас то зачем?

ради эстетического удовольствия исключительно
Re[3]: C++ как уменьшить прогу ?
От: мыщъх США http://nezumi-lab.org
Дата: 31.08.11 22:10
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Здравствуйте, мыщъх, Вы писали:


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


М>>еще можно rtl отключить и секции смержить. на xp легко сделать exe меньше килобайта штатными средствами ms vc и без асма. не уверен, впрочем, что это будет работать на семерке.


J>да смысл же не в этом а в том что бы все было комфорт удобство

J>и ничего за это небыло каких то 20 кб

а в чем удобство динамической линковки? во-первых, это заметно медленнее (критично, если процесс запускается по многу раз из скрипта), во-вторых, дистр все равно не уменьшается, а логика инсталлятора заметно усложняется.

М>>но нормальная программа не может занимать 20 кб.

J>вполне себе пишутся тулзы > 1000 строк со всеми
J>удобствами (CString etc...) размером 20 — 30 кб зависящие только от msvcrt.dll
а что в ней есть такого, чего нет в ntdll/kerner32? просто интересно. кстати, если работаете со строками, то там возможно переполнение буфера, а для msvcrt есть универсальный хакерский ROP-загрузчик, обходящий DEP. кстати, у вас хоть readme есть? я молчу уже за хелп. блин, у меня только текст лицензии занимает порядка 20 кб

в большинстве программ больше данных чем кода. разницы между 20 кб и 200 кб практически нет. вот 20 кб и 20 мб -- это уже заметно, да.

кстати, а какие CString в никсах? писать системно зависимый код только из-за CString?!
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[3]: C++ как уменьшить прогу ?
От: мыщъх США http://nezumi-lab.org
Дата: 31.08.11 22:16
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

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


>>>а сейчас то зачем?

J>ради эстетического удовольствия исключительно
какое-то мазохистское это эстетическое удовольствие. если у вас утилита командной строки, попробуйте запустить ее из скрипта сто раз поряд и сравните скорость со статической линковкой и с динамической (особенно когда линкуется много библиотек). так же объясните мне эстетику добровольного заключения себя в кандалы ms, когда есть маки и линь.

я и сам увлекался написанием программ предельно компактного размера, но после того как обнаружил, что они не запускаются то под wine, то под вистой -- отказался от этой затеи.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[4]: C++ как уменьшить прогу ?
От: jyuyjiyuijyu  
Дата: 31.08.11 22:42
Оценка:
нашла коса на камень вот и поговорили
Re: C++ как уменьшить прогу ?
От: tehKosh  
Дата: 01.09.11 06:40
Оценка:
Статическая линковка — это источник трудноуловимых ошибок. Классический пример — попытки использовать dll со статически прилинкованной crt. Так чтож более лучший способ — все же динамическая линковка..
Re[2]: C++ как уменьшить прогу ?
От: _nn_ www.nemerleweb.com
Дата: 01.09.11 07:39
Оценка: +2
Здравствуйте, tehKosh, Вы писали:

K>Статическая линковка — это источник трудноуловимых ошибок. Классический пример — попытки использовать dll со статически прилинкованной crt. Так чтож более лучший способ — все же динамическая линковка..


Это ошибка дизайна.
Память должна освобождаться там же где и аллоцируется.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: C++ как уменьшить прогу ?
От: _nn_ www.nemerleweb.com
Дата: 01.09.11 07:44
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

Я об этом как-то писал: msvcrt.dll && !VC6 == true
Автор: _nn_
Дата: 22.04.07
.
Посмотрите еще Анатомия C Run-Time, или Как сделать программу немного меньшего размера
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: C++ как уменьшить прогу ?
От: jyuyjiyuijyu  
Дата: 01.09.11 12:22
Оценка:
Здравствуйте, _nn_, Вы писали:

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


__>Я об этом как-то писал: msvcrt.dll && !VC6 == true
Автор: _nn_
Дата: 22.04.07
.

__>Посмотрите еще Анатомия C Run-Time, или Как сделать программу немного меньшего размера
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.

... вообще круто! Респект! Вот только не всегда это прокатывает, потому как в новых CTR добавляются время от времени новые функции, и, как я понимаю, ежели некая либа, от которой зависит ваш проект, например ATL_v.9.0, запользует такую функцию, то линковка с msvcrt.dll не прокатит. Например в VC++ 2008 я собрал тестовый ATL/WTL пример, в Release версии слинковавшись с ATL статически и динамически с CRT (msvcrt.lib и msvcrt_win2000.obj из WinDDK.7600.16385.0), то во время запуска получил следующий мессадж: "The procedure entry point wcsncpy_s could not be located in the dynamic link library msvcrt.dll".

а вот как раз от этой проблемы когда новый ATL тянет функции с суффиксом _s которые потом загрузчик не может найти в msvcrt.dll помогает избавится ключик компилятора
-D_CRTIMP= тогда просто они не добавляются в импорт а встраиваются статически из msvcrt_winxp.obj там как раз все эти функции которых нет в msvcrt.dll но если не определить -D_CRTIMP= то линкер несмотря на то что код этих функций есть в msvcrt_winxp.obj все равно встроит их в динамический импорт из msvcrt.dll а вот если дефайн определить он кстати в црт определен примерно так
#ifndef _CRTIMP
#define _CRTIMP __declspec(dllimport)
#endif
а мы в итоге объявляем так #define _CRTIMP важно сделать это до всех хедеров или еще лучше в командной строке -D_CRTIMP= то линкер не будет использовать динамический импорт а возмет их код из msvcrt_winxp.obj
вообщем 2 шага надо сделать
1) в зависимости написать c:\msvcrt.lib c:\msvcrt_winxp.obj
2) в командной строке добавить -D_CRTIMP=
все дальше можно наслаждаться написанием утилиты
Re: C++ как уменьшить прогу ?
От: MasterZiv СССР  
Дата: 01.09.11 12:36
Оценка:
On 01.09.2011 0:36, jyuyjiyuijyu wrote:

> как писать утилиты размером 20 кб ? при этом используя самые свежие версии ATL

> использовать CRT (msvcrt.dll) без гимора и пользоватся всеми благами цивилизации ?

Не работать программистом.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: C++ как уменьшить прогу ?
От: jyuyjiyuijyu  
Дата: 01.09.11 12:37
Оценка:
да и кстати когда определен -D_CRTIMP= то будут братся функции только которых нет
в msvcrt.dll из msvcrt_winxp.obj скажем если вы вызываете memmove
то она поскольку ее нет в msvcrt_winxp.obj будет динамически импортироваться из
msvcrt.dll а если вызываете memmove_s то найдя ее в msvcrt_winxp.obj линкер встроит
ее тело в программу но если вы не определите -D_CRTIMP= то даже функции
имеющиеся в msvcrt_winxp.obj не будут встраиватся а будут динамически импортироваться
и в итоге при запуске будете получать memmove_s не найдена в msvcrt.dll
еще поскольку компилятор новый у меня например cl.exe 15.0 он автоматически
подключает _except_handler4 ее нет в msvcrt.dll но она есть в msvcrt_winxp.obj
именно ее и встроит линкер если msvcrt_winxp.obj не подключить получим
_except_handler4 не найдена в msvcrt.dll для таких функций не обязательно
определять -D_CRTIMP= линкер все равно возмет ее тело из msvcrt_winxp.obj
Re[3]: C++ как уменьшить прогу ?
От: _nn_ www.nemerleweb.com
Дата: 01.09.11 15:37
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

Можете еще посмотреть тут для MFC приложений: https://tedwvc.wordpress.com/

P.S.
Все это баловство, в реальной жизни разве что для понта или для вируса это нужно.
Или для времен медленного интернета, которые уже для многих позади.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: C++ как уменьшить прогу ?
От: jyuyjiyuijyu  
Дата: 01.09.11 16:17
Оценка:
Здравствуйте, _nn_, Вы писали:

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


__>Можете еще посмотреть тут для MFC приложений: https://tedwvc.wordpress.com/


__>P.S.

__>Все это баловство, в реальной жизни разве что для понта или для вируса это нужно.
__>Или для времен медленного интернета, которые уже для многих позади.
хороший понт дороже денег )))
если получилось что то выстраданное и вымученное почему бы и не
понтонуть ))) всем приятно когда его поделку ценят
Re[4]: C++ как уменьшить прогу ?
От: falntss  
Дата: 04.09.11 17:28
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>а что в ней есть такого, чего нет в ntdll/kerner32? просто


В ней может и ничего, но куча С++ либ требует STL и CRT. Функционал этих либ тоже реимплементить? Тогда собствено на полезную нагрузку времени не останется.

M>секции смержить. на xp легко сделать exe меньше килобайта штатными средствами ms vc


В экзешнике, который ничего не делает кроме как запускается, смысла нет. Кроме эстетического удовольствия может быть. Мы говорим про случай, когда уже существующий код (который к тому же использует third-party либы) хочется ужать.

M>в большинстве программ больше данных чем кода. разницы между 20 кб и 200 кб практически нет. вот 20 кб и 20 мб -- это уже заметно, да.

М>кстати, а какие CString в никсах?

В никсах std::string. Ситуация когда в бинаре 20 Кб — полезная нагрузка, а 700 Кб — статически прилинкованый код CRT, нездоровая. Можно конечно изначально писать с испорльзованием только api, предоставляемого ОС, но это во-первых некроссплатформенно, во-вторых нет возможности пользоваться STL, да и вообще 99% С++ библиотек.

Реальный выход здесь — отрезать CRT. Но универсального решения здесь нет. Последние версии STL юзают фичи в CRT, которых просто нет в msvcrt.dll. Так что надо либо реимплементить в свем коде недостающие куски CRT (что не всегда возможно), либо откатываться до более старых версий STL (что тоже не всегда возможно).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.