информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Как уменьшить размер скомпилированного экзешника ?... 25.12.03 08:27  
Автор: rus_lan Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Доброе утро !
Написал простую (строк 30) прогу ( win32 console application ) в VC ++ 6.0 . Подключил несколько библиотек ( io.h , direct.h , stdlib.h , stdio.h , string.h ) . А экзешник получился размером почти 200 КБайт !
По - моему , для такой простой проги это многовато .
200Кб.. многовато даже со стандартными либами.. 25.12.03 13:01  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
А ты случайно не Debug проект делаешь? Переключишь Build->Set active configuration -> Release. Тока опции придется заново расставлять.
Сейчас посмотрел - действительно Debug-проект ... А что это... 25.12.03 14:08  
Автор: rus_lan Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
> А ты случайно не Debug проект делаешь?
Сейчас посмотрел - действительно Debug-проект ... А что это значит и чем отличается от Realise-проекта ?
Размером :-) 25.12.03 16:03  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> > А ты случайно не Debug проект делаешь?
> Сейчас посмотрел - действительно Debug-проект ... А что это
> значит и чем отличается от Realise-проекта ?
Дебаг проект предназначен для отладки, релиз - для работы. Отсюда все отличия. Во-первых: в дебах версии чаще всего (но не обязательно) отключена оптимизация - чтоб не сводить с ума отладчик переставленными или отсутствующими инструкциями. Во-вторых: проверка стека после выхода из функций. В-третьих между функциями есть большие промежутки из "int 3" чтоб отловить неверные переходы. В-четвертых (и это больше всего влияет на размер) - включена отладочная информация. Причем включена прямо в исполняемый файл. Причем не стоит думать, что отладочная информация есть только в твоей проге. В программах из 10-ти строк она почти и не влиет на размер, а влияет то, что программа линкуется с библиотеками, ТОЖЕ имеющими отладочную информацию. И вот они действительно раздувают размеры.

Есть и еще отличия - просто не стоит их перечислять - лучше глянь в настройки конфигураций и сравни.
У меня все настройки по умолчанию - как после инсталяции VC 25.12.03 14:03  
Автор: rus_lan Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
FAQ 25.12.03 09:30  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Этот вопрос нахлжится в стадии подготовки в FAQ. Вот текущая версия.
Q: При компиляции программы, фактически состоящей лишь из одного вызова функции MessageBox, получается исполняемый файл размером 30 Кб. Как уменьшить его размер?

A:
Такой размер файл имеет потому, что в него включается код стандартной библиотеки времени выполнения языка C/С++ (Standard C/С++ Run-Time Library, далее – RTL).
Если стандартная библиотека C/C++ Вам не нужна, и Вы целиком напишите программу на Windows API, то можно отключить RTL. Для этого на вкладке Link в окне Project Settings (для компилятора Visual C++) необходимо:
1) Включить опцию Ignore all default libraries (можно также использовать ключ /NOD или /NODEFAULTLIB в командной строке линкера).
После этого в программе нельзя будет пользоваться функциями библиотеки C/C++ (printf, strcpy, malloc и т.д.), а следует использовать только Windows API.
2) Указать линкеру главную функцию программы в поле Entry Point Symbol (или использовать ключ линкера /ENTRY)
Заметим, что, в отличие от привычных WinMain/main, в нашу главную функцию не передаются параметры hInstance и указатель на командную строку процесса. Их придется получить через Windows API (функции GetModuleHandle, GetCommandLine; может пригодиться и CommandLineToArgW).

Q: Как уменьшить размер файла, не отказываясь от использования RTL?
A:
Рекомендуем прочитать статью Мэтта Питрека «Reduce EXE and DLL Size with LIBCTINY.LIB» в MSDN Magazine.
http://msdn.microsoft.com/msdnmag/issues/01/01/hood/default.aspx
Там же можно взять LIBCTINY - урезанный вариант RTL, содержащей основные функции стандартной библиотеки C/C++ (но далеко не все), исполненные на WinAPI. LIBCTINY удобно использовать для создания очень маленьких .EXE и .DLL, при этом можно вызывать некоторые стандартные функции RTL (printf, strcpy, malloc и др.).

Не забывайте о том, что для уменьшения размера файла можно использовать динамическую RTL (msvcrt.dll) или .exe-упаковщики.

Q: Без статической RTL размер файла получается 16 Кб. Как сделать его еще меньше?
A:
Можно уменьшить выравнивание секций в файле и/или объединить секции.
Как правило, компиляторы создают в исполняемом файле отдельные секции для кода, данных, таблицы импорта и т.д. Для компилятора MSVC эти секции называются соответственно .text, .data, .rdata.
Каждая секция в файле дополняется нулями, чтобы ее размер был кратен некоторому значению, которое называется выравниванием файла и представляет из себя число 2n. Выравнивание файла задается опцией линкера /FILEALIGN.
Минимальное выравнивание, при котором программа будет запускаться, составляет 512 байт (размер сектора диска). Visual C++ до версии 6.0 выравнивал секции по данному минимальному значению, но начиная с версии 6.0 линкер по умолчанию выравнивает секции по границе 4 Kб (размер страницы памяти на x86). Таким образом несколько увеличивается скорость загрузки файла на Windows 9x, но при этом увеличивается и размер файла.
Вернуться к старому поведению линкера позволяет опция /OPT:NOWIN98 (она эквивалентна опции /FILEALIGN:512)
С помощью ключа /MERGE можно объединить секции. Например, в нижеприведенной программе все секции объединяются в одну секцию .text, для которой устанавливаются атрибуты ERW (Execute, Read, Write), при этом игнорируется соответствующее предупреждение линкера.
Кстати, указания линкеру удобно давать прямо в тексте программы директивой #pragma.
// small.cpp 
#include <windows.h> 

#pragma comment(linker, "/MERGE:.rdata=.text") 
#pragma comment(linker, "/MERGE:.data=.text") 
#pragma comment(linker, "/FILEALIGN:512 /SECTION:.text,ERW /IGNORE:4078") 
#pragma comment(linker, "/ENTRY:New_WinMain") 
#pragma comment(linker, "/NODEFAULTLIB") 
#pragma comment(linker, "/SUBSYSTEM:WINDOWS") 

void New_WinMain() 
{ 
  MessageBox(NULL, "Hello from a tiny program!", "Bugtraq FAQ", MB_OK); 
}

---
При компиляция данной программы командой
cl small.cpp user32.lib
получается файл small.exe размером 1024 байта.
В принципе, линкер позволяет задать /FILEALIGN:32 и размер файла получится 672 байта. Но только запускаться этот файл не будет. Видимо, 1024 байта – это предел.

Следует отметить, что иногда объединение секций нецелесообразно. Например, если в программе используется большой глобальный массив типа char Buf[100000]. Если секции не объединять, то данный массив будет размещаться в секции неинициализированных данных и реально не будет присутствовать в исполняемом файле. Если же все секции объединить, то неинициализированные данные станут инициализированными и размер файла увеличится примерно на 100 Кб.
+= ntdll.dll 25.12.03 16:59  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Я бы добавил:
1) замену malloc()/free() на LocalAlloc()/LocalFree();
2) использование ntdll.dll вместо libc (только для NT);
Это все в libctiny есть 25.12.03 17:56  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
offtop: 2 dl & all faqmakers 25.12.03 13:29  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
А кстати, почему данный фак еще не в факе? Вроде все согласны были да и косяков действительно не заметно
fixed 25.12.03 14:32  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
Клёво ! 25.12.03 12:37  
Автор: rus_lan Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
Клёво !
Спасибо !
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach