Форум программистов, компьютерный форум, киберфорум
Разработка и тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/67: Рейтинг темы: голосов - 67, средняя оценка - 4.93
Эксперт по электронике
7186 / 3362 / 346
Регистрация: 28.10.2011
Сообщений: 13,260
Записей в блоге: 7

Минимальный размер EXE файла PE формата.

15.05.2012, 19:47. Показов 14265. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне интересно с помощью какого компилятора ЯВУ можно создать исполняемый файл PE формата (Windows) минимальных размеров. Естественно без вырезания "лишнего" после компиляции или упаковки файла.
Пишите каков минимальный размер файла на выходе при компиляции проги с одной строкой, выводящей сообщение в MessageBox(). А лучше приложите к сообщению скомпилированную прогу.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2012, 19:47
Ответы с готовыми решениями:

Вычислить размер программы формата .EXE
Делаю это следующим образом: format MZ ;EXEпрограмма entry csg: begin ;адрес первой команды программы stack 256 ...

Размер скомпилированного EXE-файла
Простое Win32bit приложение в XE5 с кнопкой на форме после компиляции имеет размер 19,5 мб, в то время как Delphi7 компилит экзешник около...

Уменьшить размер .exe файла
Здравствуйте! Какими способами можно уменьшить .exe файл? В исходнике 470 строк. В данный момент весит 63*951 байт. Батник выглядит так: ...

29
Заблокирован
08.08.2014, 15:20
Студворк — интернет-сервис помощи студентам
locm,
Встроенный дизайнер форм появился в версии 5.10.
А в 10.10 может доберется до уровня дизайнера Delphi... До уровня дизайнера Delphi 7 - 2002 год...

функции, которых (если считать только кроссплатформенные) больше 1000.
Думается, меньше их, чем в Java и Qt... Или хоть не больше.
Пишут на Java, на Qt... А какой-то PureBasic...
0
Эксперт по электронике
7186 / 3362 / 346
Регистрация: 28.10.2011
Сообщений: 13,260
Записей в блоге: 7
08.08.2014, 15:38  [ТС]
Давайте не будем отклонятся от темы. Она называется Минимальный размер EXE файла PE формата.

Цитата Сообщение от Смолевич Посмотреть сообщение
Думается, меньше их, чем в Java и Qt... Или хоть не больше.
Пишут на Java, на Qt... А какой-то PureBasic...
Аргументируйте в контексте темы. Докажите что исполняемый файл на Java и Qt получается меньше чем на PureBasic.
Свою позицию я озвучил.
Цитата Сообщение от locm Посмотреть сообщение
ЯП выбирают под задачу и если нужен исполняемый файл с минимальным размером, то PureBasic в сравнении с другими ЯВУ, дает один из лучших результатов.
0
Заблокирован
08.08.2014, 15:51
Докажите что исполняемый файл на Java и Qt получается меньше чем на PureBasic.
Да я же их вообще не знаю... А на Java это вообще не исполняемый файл PE формата... Там все зависит еще от упаковщика... И Java не нативна...
0
1 / 1 / 0
Регистрация: 15.06.2018
Сообщений: 2
16.06.2018, 13:21
Урезал все что можно урезать и получил 269 байт.
DOS stub практически весь наложил на PE заголовок. Поле e_lfanew совпадает с SectionAlign. Пришлось еще и FileAlign = SectionAlign = 2 (т.к. FileAlign не может быть > SectionAlign)
Таблицу каталога сократил до 2-х элементов (экспорт и импорт).
Естественно все объединяется в одну секцию (.text)
Последнюю (нулевую) запись каталога импорта слил с названием функции MessageBox, так чтобы последние 4 байта = 0.
Assembler
1
2
3
4
 
import_:
dd 0,0,0,user32_dll,user32_table
 _MessageBox db "MessageBoxA",0,0,0,0,0
Строку названия user32.dll сократил до user32 и вписал в заголовок дескриптора секции (в поля PointerToRelocations и PointerToLinenumbers, т.к. релокации в программе не использую).
Assembler
1
user32_dll    db "user32",0,0
И наконец в качестве данных текста и заголовка сообщение использую MessageBoxA и user23.

Запакованный файл занимает больше места чем мой exe )
Вложения
Тип файла: zip msbox.zip (295 байт, 16 просмотров)
1
1 / 1 / 0
Регистрация: 15.06.2018
Сообщений: 2
16.06.2018, 13:49
PS.
В конце exe-файла 5 нулей, который относятся к последней нулевой записи импорта.
Их по идее можно сократить, но не все так просто. Как только их удаляю, программа не запускается
(даже если в заголовке меняю виртуальный и физический размеры секций).
Так и не смог разобраться почему загрузчику эта запись нужна именно в файла
(ведь при загрузке это место и так заполнится нулями).
Если кто знает подскажите...
0
Нарушитель
 Аватар для HACKER KAY
21 / 47 / 5
Регистрация: 03.06.2019
Сообщений: 368
Записей в блоге: 10
10.01.2023, 22:53
Написал прикола ради такой EXE на чистейшем ассемблере (использовал компилятор FASM)

Получился EXE файл в ровно 1 Килобайт (со сжатием около 350 Байт)

Выводит сообщение "Hello, World"

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
include 'win32a.inc'
 
PRT_BASE    =   $400000 ; 4 Mi
RVA_SHIFT   =   $1000   ; 4 Ki
 
format binary as "EXE"
use32
org 0
; *** MZ-Заголовок, заглушка (0,$60) ***
db  'MZ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
; Исходные байты DOS-секции. Но какой дурак будет пытаться запустить этот файл в MS-DOS?! Перезаписываем нулями!
;db $0E,$1F         ; push cs // pop ds
;db $B4,9,$BA,$20,0 ; mov ah,9 // mov dx,$0020
;db $CD,$21         ; int $21
;db $B8,1,$4C       ; mov ax,$4C01
;db $CD,$21         ; int $21
 
db  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'DosX', 0, 0, 0, 0, 0, 0, 0, 0  ; Можно использовать это пространство как душе угодно, хоть целый роман написать
db  $60 ; здесь начинается сообщение DOS
db  0, 0, 0, 'Coded by DosX', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
; *** PE-Header ($60,$18 ) ***
db  'PE', 0, 0  ; Сигнатура PE
dw  $014C, 1    ; информация о кол-ве секций
dd  0, 0, 0
dw  $00E0, $010F, $010B ; Какие-то три байта. Они определённо делают что-то полезное
dw  0   ; Ненужный нам "linker version"
dd  0, 0, 0 ; Тоже ненужный .code/.idata/.data sizes
dd  $1000   ; Точка входа
dd  0, 0    ; Опять мусор, только на этот раз оффсеты .code/.data
dd  PRT_BASE    ; Адрес
dd  $1000, $0200    ; Выравнивание разделов в памяти и файле: 4КБ / 512Б
dd  1, 0, 4, 0  ; Требуемая ОС ( "NT 1.0" ) + Версия образа + Версия подсистемы + Разделитель
dd  ((($1000 +\ ; размер образа  = (rva + размер раздела) до $1000
XXIT_END-ENTRY_POINT) shr 12) + 1) shl 12
dd  $0200   ; (MS-DOG + PE + Optional + Sectional), оффсет
dd  0   ; Неиспользуемый раздел чексуммы ("checksum")
dw  2   ; "подсистема": 2 - GUI; 3 - Console
dw  0   ; Неиспользуемый раздел DLL
 
dd  $1000, $1000, $1000, 0  ; stack/heap reserve/commit
dd  0   ; Obsolete/reserved
dd  16  ; "directories" : 16 входов по 8 байт: 128 = $80 bytes
 
; *** Directories ($D8,$80) ***
dq  0   ; Неиспользуемый раздел экспортов ("exports")
dd  XXIT_BEGIN-PRT_BASE, XXIT_END-XXIT_BEGIN    ; Импорты  Wink
dq  14 dup(0)   ; 14 пустых входов
 
; *** Заголовок секций ($158,$28 ) ***
db  '.dosx',0,0,0   ; Название секции, 8 Bytes
dd  XXIT_END - ENTRY_POINT, RVA_SHIFT   ; Смещение rva
dd  PE_END - ENTRY_POINT    ; Выравнивание до $0200
dd  $0200, 0, 0, 0, $0E0000020  ; Задаём атрибуты: readable, writable, executable
db  ($0200-$) dup(0)    ; перейти к $0200/$1000
org $401000
 
; *** Главная секция ***
ENTRY_POINT:
    pushd 0 ; Айди стилизации месседжбокса. В данном случае это просто 0
    pushd TITLE_TEXT
    pushd MESSAGE_TEXT
    pushd 0 ; арг заглушка
    call  dword [MessageBox]
 
    pushd 0
    call  dword [ExitProcess]
 
MESSAGE_TEXT:   db  'Hello, World! :D', 0
TITLE_TEXT: db  '', 0
 
; *** Таблица импортов ***
XXIT_BEGIN:
dd  0, 0, 0, KERNEL_LIB - PRT_BASE, KERNEL_TABLE - PRT_BASE
dd  0, 0, 0, USER_LIB - PRT_BASE, USER_TABLE - PRT_BASE, 0, 0, 0, 0, 0
KERNEL_LIB: db 'kernel32.dll', 0
KERNEL_TABLE:
ExitProcess: dd _ExitProcess - PRT_BASE
dd 0
_ExitProcess: db 0, 0, 'ExitProcess', 0
USER_LIB: db 'user32.dll', 0
USER_TABLE:
MessageBox: dd _MessageBox - PRT_BASE
dd 0
_MessageBox: db 0, 0, 'MessageBoxA', 0
XXIT_END:
 
if ($ mod $0200) > 0
    db (($1FF)-($+$1FF) mod $0200) dup(0)
end if
 
PE_END:
 
; Вывод: Лучше бы я работал уборщиком ._.
Вложения
Тип файла: zip HELLO.zip (362 байт, 5 просмотров)
0
Нарушитель
 Аватар для HACKER KAY
21 / 47 / 5
Регистрация: 03.06.2019
Сообщений: 368
Записей в блоге: 10
10.01.2023, 23:05
P.S. Я не смог поменять смещение e_lfanew >:(
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
23.02.2023, 16:03
Ну, вот... Всё это конечно хорошо, только цель другая была.
Цитата Сообщение от locm Посмотреть сообщение
с помощью какого компилятора ЯВУ
0
Эксперт по электронике
7186 / 3362 / 346
Регистрация: 28.10.2011
Сообщений: 13,260
Записей в блоге: 7
23.02.2023, 16:36  [ТС]
Цитата Сообщение от HACKER KAY Посмотреть сообщение
Получился EXE файл в ровно 1 Килобайт
Килобайт можно и на ЯВУ получить.
0
Эксперт PHP
 Аватар для liris
5517 / 1200 / 164
Регистрация: 16.01.2023
Сообщений: 2,852
24.02.2023, 09:39
Есть интересная статья на Хабре, там на Си написали программу с гуем (графическим интерфейсом), которая уместилась в 1 килобайт (правда со сжатием, но зато с гуем):
https://habr.com/ru/post/416135/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.02.2023, 09:39

Как уменьшить размер exe-файла?
Создал элементарную программку на lazarus. Прога -- только одна форма и одна кнопка, а exe весит 14 метров! Может кто подскажет почему, и...

Как уменьшить размер exe файла?
Всем привет, начал изучать c++ и меня очень смутило то, что exe файл даже простого hello world весит 542кб!? я просто не могу понять,...

Как уменьшить размер exe-файла?
Exe весит 10 мб. , не могу понять почему. Сначала думал что фоновые картинки и кнопки ( кнопками использую image для более приятного...

Как уменьшить размер EXE файла?
Люди, подскажите, пожалуйста, что можно отключить, чтобы скомпилённый экзешник стал немного поменьше размером?...

QFrame c QLabel минимальный размер + размер по содержимому
Здравствуйте. У меня есть QFrame, который выполнен в горизонтальной компоновке, в нем есть содержимое которое включает в себя QLabel....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru