Автор
|
Тема: Borland C++ Compiler 5.5
|
JoeUser |
опубликован 06-10-2001 17:43 MSK
Уважаемые господа!Решил попробовать использовать компилятор от Борланд (версия в теме). И он меня удивил, откомпилировав и собрав программку из одного "printf" я получил exe около 70, не помню точно, килобайт. Тот же пример, но компилятор lcc-win32 дал около 6 кб (т.е в 10 раз меньше!!!). Можно ли каким-либо образом получать размеры выполняемого файла, при использовании указанного в теме компилятора, соизмеримые с результатами lcc-win32? Буду признателен, если продублируете Ваши ответы на мой и-мэйл (o.melnikov@urs.nsys.by) Спасибо.
|
Emerald
|
опубликован 07-10-2001 15:20 MSK
А ты DEBUG режим убрал?? |
JoeUser
|
опубликован 08-10-2001 14:19 MSK
Видимо убрал: bcc32 -IInclude -LLib -5 -P -O1 -tWM -v- -y- 1.cpp Если не ошибаюсь это "-v-". Размер .obj 376 байт, но .exe - 54784. Видимо линкер чего-то добавил уж слишком "щедро". Мне .exe нужен в 10 раз меньше.Что еще можно предпринять? |
Flex Ferrum
|
опубликован 08-10-2001 14:34 MSK
Смотреть опции линкера на предмет отрезания ненужных функций. И вообще, для генерации компактных модулей функция printf подходит меньше всего - это же ведь, по сути дела, парсер. И тут очень многое зависит от реализации CRTL. Ты puts попробуй. |
Sourcer
|
опубликован 08-10-2001 14:58 MSK
Сожми UPXом |
JoeUser
|
опубликован 08-10-2001 15:08 MSK
to Flex Ferrum: да нет, printf, только как вариант, он мне нафиг не нужен. Я решил оценить увеличение кода. Ну на 3кб больше, ну на 5, но в 10 раз это нонсенс! А зачем линкер линкует вскую ерунду - я ж ведь "просил" -tWM. Как его заставить собрать то что нужно по минимуму. to Sourcer: не подходит, я же рассматриваю результат работы lcc-win32 и Borland С++. Сжимать - это уже после всего. |
Flex Ferrum
|
опубликован 08-10-2001 15:32 MSK
А теперь посуди сам: printf - парсер. То есть, в зависимости от того, что передали в строке он дергает либо одну либо другую функцию. Заранее он не знает, какую форматную строку ему передадут - посему он линкует _весь_ набор функций, относящихся к printf'у. Тут ты ему никак не объяснишь, какие из функций тебе действительно нужны а какие нет. Я же говорю, попробуй сравнить с использованием puts. Это первое. Второе - где гарантия, что lcc-win32 не юзает CRTL, лежащую в DLL. Вот тут тебе порядки и вылезут. |
JoeUser
|
опубликован 08-10-2001 16:04 MSK
Попробовал puts.obj - 374 байта .exe - 50688 байт не помогает. Смотрел через ShowDep: -для lcc-win32 (kernel32.dll+crtdll.dll) -для BC55 (kernel32.dll+user32.dll) А как добиться одного и того же использования dll? |
Flex Ferrum
|
опубликован 08-10-2001 16:22 MSK
Вот тебе и ответ: -для lcc-win32 (kernel32.dll+crtdll.dll)То есть, Борланд тебе генерит самодостаточный экзешник, а lcc-win32 - экзешник для работы еще и dll-ку требует (размером не меньше полмега). "А как добиться одного и того же использования dll?" Не знаю. Смотри ключи. Должно быть.
|
JoeUser
|
опубликован 08-10-2001 18:49 MSK
Ладно. Мальенькая провокация:crc32.exe - 12800 байт (без upx) использует только KERNEL32.DLL. Написан на Virtual Pascal (win32). Сканирует указанную ветвь каталогов и для каждого найденно файла по маске считает табличное crc32. Тип программы - win32 console. Я такого же на BC5.5 хочу :) Как это сделать? P.S. Акцент: не принципиальна какую программу в этом, размер .exe нужен не более чем на 5-10 к больше (меньше:)?) |
Flex Ferrum
|
опубликован 09-10-2001 11:40 MSK
Если он дергает только WINAPI функции - то портировать не составит труда. На самом деле, если прогрммировать исключительно через API (функции CRTL не дергать) - прогрммы получаются небольшими, поскольку содержат только логику. |
Sourcer
|
опубликован 09-10-2001 11:47 MSK
При создании проекта делай его динамическим а не статическим... потом правда твой exeшник будет требовать какуюто дллку из борланд С++ :)Я чёто не пойму ты чё троян чтоль хочешь написать??? Зачем тебе маленький файлик??? |
Sourcer
|
опубликован 09-10-2001 11:54 MSK
качай UPX http://wildsau.idv.uni-linz.ac.at/mfx/upx.html#download и сожми... :) |
Flex Ferrum
|
опубликован 09-10-2001 11:59 MSK
2Sources: Вопрос не в том, как уменьшить размер испольняемого модуля после компиляции, а в том, как _компилировать_ модули небольшого размера. Согласись, это несколько разные вещи. |
JoeUser
|
опубликован 09-10-2001 13:24 MSK
Нет, троян я писать не хочу. Я ненавижу неоправданно жирные программы. Нафиг мне всяческие неработающие довески. 5-10% неработающего кода - ну еще куда не шло, но 90% B-(Я уже говорил, хочу на C++ чего-нить сделать полезного (надоел Пасквиль:), да и кроссплатформенный код на С++ лучше ваять. Вот. Вернемся к нашим баранам :). Bcc32.exe после успешной компиляции запускает линкер, который клеит кроме стаба кучу барахла (разновсяческие либы), так вот вопрос: что действительно нужно клеить и как это указывается (ключами? конфигурацией?). На примере самодостаточного кода от Virtual Pascal размер файла принимаем 6-10kb |
Sourcer
|
опубликован 09-10-2001 13:28 MSK
Блин... Если тебе паскаль надаел и ты хочешь писать на С++, тогда пиши на Visual C++ Какие проблемы? |
Flex Ferrum
|
опубликован 09-10-2001 13:40 MSK
Я думаю, что опция -WR Target uses the dynamic RTL (same as -tWR) Кроме того, покопай в направлении опции "Ignore default libraries". |
JoeUser
|
опубликован 09-10-2001 13:43 MSK
Я выбрал фриварный компайлер, что в этом плохого. Нормальное законное использование. Майкрософт я слишком уважаю, чтобы воровать у них такие чудесные пакеты разработчика. Или оные так же фриварные? |
Sourcer
|
опубликован 09-10-2001 13:46 MSK
Шароварные... Ты что хочешь написать какой то проект и продать??? Зачем тебе фри....? |
JoeUser
|
опубликован 09-10-2001 13:52 MSK
To Sourcer: Пожалуйста, извини за бестактность. Ну не хочется мне эту тему дальше развивать (читай флейм:). У меня вопросы были по "Borland C++ Compiler 5.5". Лады? |
Sourcer
|
опубликован 09-10-2001 13:54 MSK
ok |
JoeUser
|
опубликован 09-10-2001 15:48 MSK
Наверняка мои пожелания не оправдались :( ну очень :(удалось при динамической компоновке сделать приложение в 6 кб, однако это "тянет" за собой сс3250.dll в 1.5 мега. Со статической линковкой стаб требует cw32.lib, тот требует import32.lib, тот uuid.lib и в результате - не менее 45 кб, т.е. бесполезного около 75%. Написал в новостные группы Борланда телегу :) мол нельзя так обижать начинающих своей "щедростью". Вот жду ответа. :( Если интересно, позже опубликую ответы. |
Flex Ferrum
|
опубликован 09-10-2001 16:23 MSK
Единственно, что могу сказать - видно не судьба. То есть судьба, но не с дефолтным стабом. Кстати, с помощью MSVC++ 6.0 можно слепить экзешник размером меньше килобайта. А Borland C++ для этого слишком умный. Хотя, он не под это затачивался. |
Sourcer
|
опубликован 09-10-2001 16:44 MSK
На сколько я знаю всё вот это место которое тебе мешается, оно как бы резервируется. И если ты напишеш прогу достойную там допустим 50 кило то размер EXEшника не увеличется, а просто забьётся то место которое не использовалось! Так что может даже и не имеет смысл всё это оптемезировать.... Я думаю у тебя прога не будет состоять из одного printf...например ща откомпилил свою утилитку от своей игры на борланде утилитка в исходниках весит 25 кило и у меня файл занимает 50 кило в принципе нормально... |
JoeUser
|
опубликован 09-10-2001 18:03 MSK
Хорошо :)))) Берем Perl для создания достойной программы на С++ (вернее на С) и создаем нечто: === #include <stdio.h> int main() { int i = 0; char *c = "Hello World - %d!\n"; i++; printf(c,i); ... таких операторов штук 20000 :-) i++; printf(c,i); return 0; } === достойная прога! Ж-) исходник 400097 байт, exe - 272987 (ну нормально вроде, хотя кто знает)Уменьшаем размер исходника: .c - 40097 .exe - 74752 .c - 4097 .exe - 54784 .c - 117 .exe - 52224 Итого: принимаем размер исходника в последнем случае = ноль. Увеличили исходник на (4097-117=3980), exe увеличился (54784-52224=2560). Да чуток меньше (но! это же код, а он должен быть меньше, я уверен). Далее. (40097-4097=36000), код - (74752-54784=19968). Не очень то получается эта теория. Или я не прав?
|
Sourcer
|
опубликован 09-10-2001 18:13 MSK
А ты подсчитай всё это на асме PUSH C PUSH I CALL printfивсё что ты тым вставлял! во скока байт обойдется всё это и сравни что с "printf(c,i);" - 12 байт! А вообще по оптимизации самыемощьные компиляторы считаются Visual C++ :) и WATCOM C++ (непомню ватком фриварный или нет :) )
|
JoeUser
|
опубликован 09-10-2001 18:32 MSK
А я что против, можно и инструкции посмотреть. Однако, если считать заполняемым резервом 40кб, то, при учете что код занимает 12б, а исходный 20б, первая, примерно, тысяча инструкций должна влезть в "резерв" :). Но она же бессовестно цепляется "за пределы" :) |
ua1zcl
|
опубликован 14-10-2001 17:29 MSK
Я как-то изголялся по этому вопрсу с BC 5.02. Ничего хорошего, что хотел - получил, но какой ценой? Мне пришлось подменить его любимые обьектные файлы и создать свою runtime библиотеку и в завершение всего - отредактировать одну длл-ку его IDE. Поэтому я вынужден MS VC иметь, и не только поэтому, там и vxd и shared dll, хотя скорость компиляции в MSVC раза в три хуже. |