WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Borland C++ Compiler 5.5

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Borland C++ Compiler 5.5
JoeUser опубликован 06-10-2001 17:43 MSK   Click Here to See the Profile for JoeUser   Click Here to Email JoeUser  
Уважаемые господа!

Решил попробовать использовать компилятор от Борланд (версия в теме). И он меня удивил, откомпилировав и собрав программку из одного "printf" я получил exe около 70, не помню точно, килобайт. Тот же пример, но компилятор lcc-win32 дал около 6 кб (т.е в 10 раз меньше!!!).

Можно ли каким-либо образом получать размеры выполняемого файла, при использовании указанного в теме компилятора, соизмеримые с результатами lcc-win32?
Буду признателен, если продублируете Ваши ответы на мой и-мэйл (o.melnikov@urs.nsys.by)
Спасибо.

Emerald опубликован 07-10-2001 15:20 MSK     Click Here to See the Profile for Emerald  Click Here to Email Emerald     
А ты DEBUG режим убрал??
JoeUser опубликован 08-10-2001 14:19 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
Видимо убрал:
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     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Смотреть опции линкера на предмет отрезания ненужных функций. И вообще, для генерации компактных модулей функция printf подходит меньше всего - это же ведь, по сути дела, парсер. И тут очень многое зависит от реализации CRTL. Ты puts попробуй.
Sourcer опубликован 08-10-2001 14:58 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
Сожми UPXом
JoeUser опубликован 08-10-2001 15:08 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
to Flex Ferrum:
да нет, printf, только как вариант, он мне нафиг не нужен. Я решил оценить увеличение кода. Ну на 3кб больше, ну на 5, но в 10 раз это нонсенс! А зачем линкер линкует вскую ерунду - я ж ведь "просил" -tWM. Как его заставить собрать то что нужно по минимуму.
to Sourcer: не подходит, я же рассматриваю результат работы lcc-win32 и Borland С++. Сжимать - это уже после всего.
Flex Ferrum опубликован 08-10-2001 15:32 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
А теперь посуди сам: printf - парсер. То есть, в зависимости от того, что передали в строке он дергает либо одну либо другую функцию. Заранее он не знает, какую форматную строку ему передадут - посему он линкует _весь_ набор функций, относящихся к printf'у. Тут ты ему никак не объяснишь, какие из функций тебе действительно нужны а какие нет. Я же говорю, попробуй сравнить с использованием puts. Это первое.
Второе - где гарантия, что lcc-win32 не юзает CRTL, лежащую в DLL. Вот тут тебе порядки и вылезут.
JoeUser опубликован 08-10-2001 16:04 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
Попробовал 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     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Вот тебе и ответ:
-для lcc-win32 (kernel32.dll+crtdll.dll)

То есть, Борланд тебе генерит самодостаточный экзешник, а lcc-win32 - экзешник для работы еще и dll-ку требует (размером не меньше полмега).

"А как добиться одного и того же использования dll?"
Не знаю. Смотри ключи. Должно быть.

JoeUser опубликован 08-10-2001 18:49 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
Ладно. Мальенькая провокация:

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     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Если он дергает только WINAPI функции - то портировать не составит труда. На самом деле, если прогрммировать исключительно через API (функции CRTL не дергать) - прогрммы получаются небольшими, поскольку содержат только логику.
Sourcer опубликован 09-10-2001 11:47 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
При создании проекта делай его динамическим а не статическим...
потом правда твой exeшник будет требовать какуюто дллку из борланд С++ :)

Я чёто не пойму ты чё троян чтоль хочешь написать??? Зачем тебе маленький файлик???

Sourcer опубликован 09-10-2001 11:54 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
качай UPX
http://wildsau.idv.uni-linz.ac.at/mfx/upx.html#download
и сожми...
:)
Flex Ferrum опубликован 09-10-2001 11:59 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
2Sources:
Вопрос не в том, как уменьшить размер испольняемого модуля после компиляции, а в том, как _компилировать_ модули небольшого размера. Согласись, это несколько разные вещи.
JoeUser опубликован 09-10-2001 13:24 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
Нет, троян я писать не хочу. Я ненавижу неоправданно жирные программы. Нафиг мне всяческие неработающие довески. 5-10% неработающего кода - ну еще куда не шло, но 90% B-(

Я уже говорил, хочу на C++ чего-нить сделать полезного (надоел Пасквиль:), да и кроссплатформенный код на С++ лучше ваять. Вот.

Вернемся к нашим баранам :). Bcc32.exe после успешной компиляции запускает линкер, который клеит кроме стаба кучу барахла (разновсяческие либы), так вот вопрос: что действительно нужно клеить и как это указывается (ключами? конфигурацией?). На примере самодостаточного кода от Virtual Pascal размер файла принимаем 6-10kb

Sourcer опубликован 09-10-2001 13:28 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
Блин...
Если тебе паскаль надаел и ты хочешь писать на С++, тогда пиши на Visual C++
Какие проблемы?
Flex Ferrum опубликован 09-10-2001 13:40 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Я думаю, что опция
-WR Target uses the dynamic RTL (same as -tWR)
Кроме того, покопай в направлении опции "Ignore default libraries".

JoeUser опубликован 09-10-2001 13:43 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
Я выбрал фриварный компайлер, что в этом плохого. Нормальное законное использование. Майкрософт я слишком уважаю, чтобы воровать у них такие чудесные пакеты разработчика. Или оные так же фриварные?
Sourcer опубликован 09-10-2001 13:46 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
Шароварные...
Ты что хочешь написать какой то проект и продать??? Зачем тебе фри....?
JoeUser опубликован 09-10-2001 13:52 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
To Sourcer: Пожалуйста, извини за бестактность. Ну не хочется мне эту тему дальше развивать (читай флейм:). У меня вопросы были по "Borland C++ Compiler 5.5". Лады?
Sourcer опубликован 09-10-2001 13:54 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
ok
JoeUser опубликован 09-10-2001 15:48 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
Наверняка мои пожелания не оправдались :( ну очень :(

удалось при динамической компоновке сделать приложение в 6 кб, однако это "тянет" за собой сс3250.dll в 1.5 мега. Со статической линковкой стаб требует cw32.lib, тот требует import32.lib, тот uuid.lib и в результате - не менее 45 кб, т.е. бесполезного около 75%.

Написал в новостные группы Борланда телегу :) мол нельзя так обижать начинающих своей "щедростью". Вот жду ответа. :( Если интересно, позже опубликую ответы.

Flex Ferrum опубликован 09-10-2001 16:23 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Единственно, что могу сказать - видно не судьба. То есть судьба, но не с дефолтным стабом. Кстати, с помощью MSVC++ 6.0 можно слепить экзешник размером меньше килобайта. А Borland C++ для этого слишком умный. Хотя, он не под это затачивался.
Sourcer опубликован 09-10-2001 16:44 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
На сколько я знаю всё вот это место которое тебе мешается, оно как бы резервируется. И если ты напишеш прогу достойную там допустим 50 кило то размер EXEшника не увеличется, а просто забьётся то место которое не использовалось! Так что может даже и не имеет смысл всё это оптемезировать....
Я думаю у тебя прога не будет состоять из одного printf...

например ща откомпилил свою утилитку от своей игры на борланде утилитка в исходниках весит 25 кило и у меня файл занимает 50 кило
в принципе нормально...

JoeUser опубликован 09-10-2001 18:03 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
Хорошо :))))
Берем 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     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
А ты подсчитай всё это на асме
PUSH C
PUSH I
CALL printf

ивсё что ты тым вставлял!

во скока байт обойдется всё это и сравни что с "printf(c,i);" - 12 байт!


А вообще по оптимизации самыемощьные компиляторы считаются Visual C++ :) и WATCOM C++ (непомню ватком фриварный или нет :) )

JoeUser опубликован 09-10-2001 18:32 MSK     Click Here to See the Profile for JoeUser  Click Here to Email JoeUser     
А я что против, можно и инструкции посмотреть. Однако, если считать заполняемым резервом 40кб, то, при учете что код занимает 12б, а исходный 20б, первая, примерно, тысяча инструкций должна влезть в "резерв" :). Но она же бессовестно цепляется "за пределы" :)
ua1zcl опубликован 14-10-2001 17:29 MSK     Click Here to See the Profile for ua1zcl  Click Here to Email ua1zcl     
Я как-то изголялся по этому вопрсу с BC 5.02. Ничего хорошего, что хотел - получил, но какой ценой? Мне пришлось подменить его любимые обьектные файлы и создать свою runtime библиотеку и в завершение всего - отредактировать одну длл-ку его IDE. Поэтому я вынужден MS VC иметь, и не только поэтому, там и vxd и shared dll, хотя скорость компиляции в MSVC раза в три хуже.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.