как писать утилиты размером 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
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.
Здравствуйте, мыщъх, Вы писали:
М>Здравствуйте, jyuyjiyuijyu, Вы писали:
М>еще можно rtl отключить и секции смержить. на xp легко сделать exe меньше килобайта штатными средствами ms vc и без асма. не уверен, впрочем, что это будет работать на семерке.
да смысл же не в этом а в том что бы все было комфорт удобство
и ничего за это небыло каких то 20 кб
М>но нормальная программа не может занимать 20 кб.
вполне себе пишутся тулзы > 1000 строк со всеми
удобствами (CString etc...) размером 20 — 30 кб зависящие только от msvcrt.dll
имхо это раньше было актуально когда программы целиком не помещались в кеш процессора.
а сейчас то зачем? да и правильно сказал мыщих со статической линовкой надежнее будет.
Здравствуйте, 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.
Здравствуйте, 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.
Статическая линковка — это источник трудноуловимых ошибок. Классический пример — попытки использовать dll со статически прилинкованной crt. Так чтож более лучший способ — все же динамическая линковка..
Здравствуйте, tehKosh, Вы писали:
K>Статическая линковка — это источник трудноуловимых ошибок. Классический пример — попытки использовать dll со статически прилинкованной crt. Так чтож более лучший способ — все же динамическая линковка..
Это ошибка дизайна.
Память должна освобождаться там же где и аллоцируется.
... вообще круто! Респект! Вот только не всегда это прокатывает, потому как в новых 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=
все дальше можно наслаждаться написанием утилиты
On 01.09.2011 0:36, jyuyjiyuijyu wrote:
> как писать утилиты размером 20 кб ? при этом используя самые свежие версии ATL > использовать CRT (msvcrt.dll) без гимора и пользоватся всеми благами цивилизации ?
да и кстати когда определен -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
P.S.
Все это баловство, в реальной жизни разве что для понта или для вируса это нужно.
Или для времен медленного интернета, которые уже для многих позади.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, jyuyjiyuijyu, Вы писали:
__>Можете еще посмотреть тут для MFC приложений: https://tedwvc.wordpress.com/
__>P.S. __>Все это баловство, в реальной жизни разве что для понта или для вируса это нужно. __>Или для времен медленного интернета, которые уже для многих позади.
хороший понт дороже денег )))
если получилось что то выстраданное и вымученное почему бы и не
понтонуть ))) всем приятно когда его поделку ценят
Здравствуйте, мыщъх, Вы писали:
М>а что в ней есть такого, чего нет в 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 (что тоже не всегда возможно).