информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеВсе любят медЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
FAQ 25.12.03 09:30  Число просмотров: 1299
Автор: :-) <:-)> Статус: 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 Кб.
<beginners> Поиск 






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


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