информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаЗа кого нас держат?Spanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор 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