Уменьшение размера исполняемого файла

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Уменьшение размера исполняемого файла

Сообщение Mikhail » 23.10.2015 13:37:54

wavebvg писал(а):Не путайте компилятор и линковщик. Компилятор-то знает


Компилятор тоже не знает иногда, например когда используется RTTI.
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Уменьшение размера исполняемого файла

Сообщение Снег Север » 23.10.2015 13:45:45

Господи, в эпоху террабайтных дисков и 4-х гигового минимума памяти обсуждать уменьшение размера программы на десяток мегабайт... "Эдак скоро до мышей докатимся!" (С)
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 23.10.2015 13:47:54

Mikhail писал(а):Компилятор тоже не знает иногда, например когда используется RTTI.

Тогда остаётся только этот вариант: Если код получить после ассемблирования, то всё получится! Если бы можно было откомпилировать лазарусовский ассемблерный листинг, то это можно было бы сделать хоть сейчас! И без разницы для какой системы.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 23.10.2015 13:53:49

vitaly_l писал(а): Но Лекс Айрин говорит что Лазарус возвращает какой-то листинг, а не asm. И этот листинг нельзя откомпилировать... Или можно???


Вы невнимательно читали. Лазарус, при необходимости, возвращает asm-листинг. Но вот без танцев с бубном его использовать, как минимум, затруднительно.

Mikhail писал(а):LCL или VCL при этом не пересобирается, если Вы до сих пор не поняли.


Пересобираются используемые модули. Даже этого хватило бы для изменения размера хоть на байт. Кстати, LCL тоже пересобирается -- я проверил.

Mikhail писал(а):Да не известны! :twisted: Изучите наконец-то матчасть!


При использовании RTTI? Возможно. Но это не наш метод. Мы хотим уменьшить файл. И на мат-часть не кивайте. При выполнении метод может, и не известен, а при компиляции вполне.

wavebvg писал(а):к примеру Вы себе мозг вышибите, чтобы собрать приложений без RTL, но с поддержкой строк или работой с файлами - там прибито очень большими гвоздями (впрочем, возможно, я совсем не секу фишки)


Вообще-то RTL это есть библиотека стандартных используемых модулей -- вы при всем желании не сможете собрать прогу без их использования. Как минимум, подключается модуль System -- именно он отвечает за связь с системными файлами. Хотите его заменить -- перепишите и положите вместе с программой или (в случае неудачи) вместо стандартного.

Mikhail писал(а):Всегда используются внешние библиотеки, хотя бы из состава ОС.


С этим не спорю. Но вот использование своих внешних библиотек (dll) бред, если только нет необходимости использовать их код в 2х и более программах одновременно.

wavebvg писал(а):Ну вот Вы и ответили - Вам необходимо, чтобы приложение было компактным и быстрым, а не удобным при разработке и недающим отрезать себе руки...


Хотелось бы и то и другое. Но вообще-то я описал возможности реализуемые PE/ELF форматом исполняемого файла.

Mikhail писал(а):В общем еще раз призываю, учите матчасть! :evil:


Учу, может быть, вы найдете то, что я не знаю? Например, вы знаете, что большая часть никсовых утилит сделана так, чтобы не использовать dtk и его аналоги и имеет, по возможности, минимальный размер? А уже поверх них натянуты программы-оболочки для удобства пользователя, которые просто переводят "стрелки" на консольные утилиты и форматируют их выхлопы в более удобную для пользователей форму.Так что gtk(и иже с ним) нужен исключительно только для удобства, но не для функционала... ах да... еще для игр, офиса и графического редактора.

И gtk- программа, даже если не используется он сам, тянет за собой очень тяжелые библиотеки. В которых очень много неиспользуемого кода. И даже вредного. Представляете, поставили небольшую прогу и вся система резко потяжелела.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 23.10.2015 13:59:38

Лекс Айрин писал(а):Но вот без танцев с бубном его использовать, как минимум, затруднительно.

Так может тогда просто потанцевать с бубном? Там всё уже готовое и кросплатформенное! А потом, откомпилировать любым asm компилятором, который может удалить имена. В чём сложность танцев с бубнами? Что конкретно нужно сделать с файлом asm-листинга?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение Mikhail » 23.10.2015 14:06:11

Лекс Айрин писал(а):При выполнении метод может, и не известен, а при компиляции вполне.

Наоборот... :)

Лекс Айрин писал(а):Например, вы знаете, что большая часть никсовых утилит сделана так, чтобы не использовать gtk и его аналоги и имеет, по возможности, минимальный размер? А уже поверх них натянуты программы-оболочки для удобства пользователя, которые просто переводят "стрелки" на консольные утилиты и форматируют их выхлопы в более удобную для пользователей форму.

Ну знаю и что? Такое подход реализуем лишь для небольших утилит и программ работающих в пакетном режиме, для интерактивных программ такой подход не реализуем.

Лекс Айрин писал(а):И gtk- программа, даже если не используется он сам, тянет за собой очень тяжелые библиотеки. В которых очень много неиспользуемого кода. И даже вредного. Представляете, поставили небольшую прогу и вся система резко потяжелела.


Ну я же писал про дотнет, в XP его нужно было загружать отдельно, правда всего один раз для всех программ его использующих, но объем, ИМХО более 300Мб. А сами утилитки на дотнете могли весить несколько сот или даже десятков килобайт. Сейчас он сразу входит в состав win7,8,10 и загружать, как правило, ничего не нужно.
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Уменьшение размера исполняемого файла

Сообщение SSerge » 23.10.2015 14:08:49

vitaly_l писал(а):Там всё уже готовое и кросплатформенное!


С какого рожна оно там кросплатформенное то?
Не замечаете сюра? Скомпилировано в мнемонику команд ПРОЦЕССОРА. Все ссылки на набор библиотек целевой операционной системы. В чем кроссплатформенность?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Уменьшение размера исполняемого файла

Сообщение Sergei I. Gorelkin » 23.10.2015 14:12:29

Не нужно никаких танцев с бубном, это один из штатных режим работы. Внутреннй ассемблер в FPC реализован только для x86 и (очень недавно) ARM, для остальных платформ создаются текстовые файлы и скармливаются внешнему ассемблеру.
С ключом -al компилятор не удаляет созданные ассемблерные файлы.
С ключом -s он останавливается на месте вызова ассемблера, дополнительно создавая "батник" ppas.bat (или ppas.sh), в котором находятся команды для ассемблирования и линковки.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Уменьшение размера исполняемого файла

Сообщение Mikhail » 23.10.2015 14:15:14

Sergei I. Gorelkin писал(а): и (очень недавно) ARM


В какой версии это доступно?
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Уменьшение размера исполняемого файла

Сообщение wavebvg » 23.10.2015 14:16:07

Mikhail писал(а):Компилятор тоже не знает иногда, например когда используется RTTI.

[spoiler]Блин, как долго доходил смысл этой фразы... (когда используется RTTI = когда используется функция RTTI для поиска метода по имени)[/spoiler]
Конечно он не знает, с тем же успехом вы можете вызвать функцию по абсолютному адресу и наслаждаться, что это сработает (если адрес правильный).
Лекс Айрин писал(а):Хотелось бы и то и другое.

Как решение - можно было бы для RTTI - создавать отдельные файлы (как в случае с отладчиком), нет файла - RTTI не работает, а программа красивая и стройная всегда и выдает страшные сообщения, когда чего-то не хватает. Про объектные библиотеки я, кажется, уже упоминал - решение специфическое (для ЯП), но в общем-то подходит. Так же, как вариант, перенести весь необходимый функционал в сишные либы, а для корректной работы объектов использовать условности, вроде того, что первый параметр у функции - указатель на объект (правда тогда бабка надвое сказала, что сильно уменьшится, хотя всё дерево наследования можно скрыть в библиотеках, как минимум ошибок станет меньше).
Лекс Айрин писал(а):Вообще-то RTL это есть библиотека стандартных используемых модулей -- вы при всем желании не сможете собрать прогу без их использования. Как минимум, подключается модуль System

RTL - либо он есть (весь, согласно документации), либо его нет. Подмена модуля System - это способ сборки без RTL
Лекс Айрин писал(а):И gtk- программа, даже если не используется он сам, тянет за собой очень тяжелые библиотеки.

В LCL - тянутся не столько библиотеки (лежат себе и никому не мешаеют), сколько обертки, которые из-за RTTI-и нельзя выпилить из исходников.

Добавлено спустя 4 минуты 3 секунды:
Mikhail писал(а):
Sergei I. Gorelkin писал(а): и (очень недавно) ARM


В какой версии это доступно?

Присоединяюсь! И пример использования без внешнего линковщика, если не затруднит (в смысле ключики, условия и т.п., раньше настоятельно требовал линковщик).
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 23.10.2015 14:32:51

Sergei I. Gorelkin писал(а):С ключом -al компилятор не удаляет созданные ассемблерные файлы.
С ключом -s он останавливается на месте вызова ассемблера, дополнительно создавая "батник" ppas.bat (или ppas.sh), в котором находятся команды для ассемблирования и линковки.

Спасибо!, добрый: Sergei I. Gorelkin.
SSerge писал(а):С какого рожна оно там кросплатформенное то?
Не замечаете сюра? Скомпилировано в мнемонику команд ПРОЦЕССОРА. Все ссылки на набор библиотек целевой операционной системы. В чем кроссплатформенность?

А вот здесь требуется уточнение. В моём понимании, а я могу заблуждаться: После ассемблирования, код уже подготовлен под целевую систему со всеми привязками. После ассемблирования идут: компилирование и линковка (может ещё какая нить оптимизация), но главное, там уже: ничего не добавляется и не удаляется. После ассемблирования только компилируется и линкуется. Да? Это так или я сильно заблуждаюсь?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 23.10.2015 14:44:22

Снег Север, в том-то и проблема, что хотелось бы побольше. Да и программа не одна.

vitaly_l писал(а): Если код получить после ассемблирования, то всё получится!

Намного проще прогнать прогу каким-нибудь оптимизатором и просто выкинуть мертвый код.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Уменьшение размера исполняемого файла

Сообщение Sergei I. Gorelkin » 23.10.2015 15:00:13

Mikhail писал(а):В какой версии это доступно?

Только в транке, в 3.0 не попадает.

Внутреннй линкер тоже пока не включен.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 23.10.2015 15:01:14

Лекс Айрин писал(а):Намного проще прогнать прогу каким-нибудь оптимизатором и просто выкинуть мертвый код.

Оптимизатор не сделает обфускацию и не удалит "лишние" имена, т.к. его писали программисты, а программисты, твёрдо уверены что, имена классов/функций - программе "очень нужны" например для RTTI и библиотек внешних... (И это кстати правильно, т.к. надёжно). А мы хотим по сути нарушить правила и инструкции. По сути, мы, получается: программисты-хулиганы, которые подрывают веру в незыблемость глобальной системы. Радикалы... Однако Вы правы, чтобы самим не удалять мёртвый код, после компиляции ассемблерного кода, можно ещё удалить мёртвый код с помощью оптимизатора. А какого именно оптимизатора?
Последний раз редактировалось vitaly_l 23.10.2015 15:30:28, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 23.10.2015 15:26:08

Mikhail писал(а):Наоборот...


Да нет, как раз таки, все методы известны. Иначе их бы нельзя было откомпилировать.

Mikhail писал(а): для интерактивных программ такой подход не реализуем.


Угу... поколения программировавшие на/для ЕС ЭВМ|System/360 дружно кричат: "Да ты гонишь!" и показывают пальцы. Тогда была чистая итерактивность, мультизадачность, и многопользовательность... Винда только в NTсерии начала реализовывать функционал бывший для этих компов стандартным.

Им будут вторить пользователи DOS... или Вы будете утверждать, что NC не итерактивная программа? Да я до сих пор пользуюсь far (под линуксом MC), который является клоном этой проги. И все новомодные проги подобного типа давно уже мною не котируются.

Mikhail писал(а):Ну я же писал про дотнет,..

Там же я озвучил свое мнение об этом. Здесь не вижу смысла повторять. К счастью, gtk можно, если он не нужен легко снести не перетряхивая всю систему. Дотнет же это до тех пор, пока MS не придумает новую библиотеку и под нее не перепишут все программы.

Sergei I. Gorelkin писал(а):Не нужно никаких танцев с бубном, это один из штатных режим работы.


Хорошо если так. Еще бы найти именно тот ассемблер, под который создан листинг.

wavebvg писал(а):Подмена модуля System - это способ сборки без RTL


Угу... что я и написал чуть дальше. Только вы еще должны будете реализовать весь вам нужный функционал из модуля System самостоятельно.
wavebvg писал(а):В LCL - тянутся не столько библиотеки (лежат себе и никому не мешаеют), сколько обертки,


а какая разница? Все равно библиотеки должны быть. Причем, даже те, которые реально ненужны.

Добавлено спустя 4 минуты 31 секунду:
vitaly_l ищу. Вообще, я снял в процессе диалога галочки умного связывания и перемещения кода. Последнее оказалось только никому не нужной примочкой, которая не влияя на запуск программы только увеличивает ненамного код, но реально не используется. Возможно, для линукса картина будет иная, но это уже будет проверяться потом.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru