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

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

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

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

Сообщение vitaly_l » 21.10.2015 21:55:40

Лекс Айрин писал(а):Собирать исполнимый файл не внешним линкером, а самим компилятором.

Ничего не понимаю. Как это компилятор, без специальной команды, сам удалит названия: функций, классов и переменных?
А если я их использую в программе? Что-то Вы перемудрили :roll:, либо я чего-то не понял :cry:


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

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

Сообщение Снег Север » 21.10.2015 22:17:49

vitaly_l, насколько я понимаю, сейчас линкер для лазаруса используется сишный, т.е. ничего не знающий о внутренней "кухне" паскаля. Вот если бы это был линкер "родной", то возможностей для оптимизации у него было бы больше.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3038
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение vitaly_l » 22.10.2015 00:11:55

Снег Север писал(а):линкер

Я вообще-то никогда в эту сторону не копал... Однако, я чуть покопал и моему удивлению не было конца, когда выяснилось, что Лекс Айрин говорит правду. Там действительно на этапе компиляции, точнее линковки, заранее создаются адреса... И это в общем-то разумно, т.к. процессор тогда работает уже "на всём готовом"...
Лекс Айрин писал(а):Не забывайте, что кроме этого в коде линкуемых библиотек полно мертвого (недостижимого) кода. Который нет возможности исключить, так как неизвестно используется он или нет.

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

Вот здесь вот есть небольшая... совсем крохотная... малюсенькая... микро проблемка. Точнее: неясность... расплывчатость... неопределённость...
Компилятор в моём понимании это FPC. Он вроде как должен содержать свой линкер. Да? А как его включить если "по умолчанию" со слов дымилки "Снег Севера" FPC, зачем-то, обращается к сишному линкеру... В моих программах, мне ненужны названия у меня нет внешних библиотек... Однако тема оказалась очень интересна и познавательна!
:?: Как правильно обратиться к "родному линкеру" или без него "самим компилятором" проделать такую "линковку" ? :cry:


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

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

Сообщение sign » 22.10.2015 07:24:37

vitaly_l писал(а):нужно только как-то на эти адреса сослаться в IDE... И всё!... Файл станет в 555 раз меньше...

Хочу, очень хочу увидеть вашу методу подсчёта.
В мою голову никак не вмещается, что мой exe-шник, с инфой для отладки в 39.0 МБ и 8.31 МБ после удаления галочки на "генерировать отладочную информацию" станет 0,014 МБ или порядка 15 кб.
Ёкарный бабай!!!
У меня там данных многажды больше!!! Ну как, Карл, КАРЛ, как!!!! :shock: :shock: :shock:

Я конечно понимаю, что хороший художник, художник с шизой, но... вы же не такой? :oops:
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение SSerge » 22.10.2015 07:30:28

vitaly_l писал(а):Как правильно обратиться к "родному линкеру"


Поставить Турбо Паскаль 7.0 на соответствующую ему машину, он "правильно обращается к родному линкеру". Т.е. умеет убирать из .exe неиспользуемый код. И, кстати, имен переменных и классов туда не пишет.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение Mikhail » 22.10.2015 09:51:25

Похоже здесь никто не знает что такое RTTI. :)
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение vitaly_l » 22.10.2015 10:59:17

Mikhail писал(а):Похоже здесь никто не знает что такое RTTI.

Я действительно не знаю что такое RTTI, но на форуме говорили что это для отладки. Отладка у меня отключена.
sign писал(а):художник с шизой, но... вы же не такой? Хочу, очень хочу увидеть вашу методу подсчёта.

Конечно я "не такой", и я с шизой. Шиза оч. полезная вещь, т.к. даёт людям воображение. Методика подсчёта очень проста. Выше Vada писал, что существует такое понятие как "Object.Name" ещё классы есть, у них тоже есть имена. Ещё есть: переменные и функции - они тоже имеют названия. Ваш код составляет 8.31 Мб - это наверное большая программа ( если конечно там не труд Достоевского зашит в переменных ). Моя программа весит 3.6 Мб, а вот исходники всего лишь 600 Кб. Если я в СВОИХ исходниках заменю все названия: переменных, функций, классов и объектов на порядковые номера, то исходники станут весить 100 Кб. А итоговая программа будет весить примерно 3.1 Мб. Соответственно: я выйграл 500 Кб. Однако откуда берутся 3 Мб ? Я не знаю... все говорят что там 80% мусора... ну и что? Мне это сейчас неважно, т.к. я точно знаю, что если там вместо имён поставить "порядковые номера", то эти 3 Мб по аналогии с 600 кб превратятся в 500 Кб. Итого: МОЯ программа вместо 3.6 Мб, станет весить всего 600 Кб. Но как выяснилось и это не предел, т.к. Лекс Айрин (а также это говорится и в описании линковщика), говорит что все названия при линковании заменяются на адреса. Так вот, если в итоговой программе использовать исключительно только адреса, а ВСЕМ названиям после линковки присвоить значение nil, то 600 кб превратятся в ~333 Кб. Что в моём понимании соответствует понятию 555.

Числа: 555 или 333 - это заранее неопределённые значения, но чем оно больше 555 или меньше 333, тем больше в МОЁМ понимании будет процент полезности от действий.

Однако несмотря на то что имена были убраны, остался неиспользуемый код (хотя там убраны имена и он стал меньше)... Так вот если его убрать, то моя программа станет весить 111 Кб вместо 3.6 Мб. Для виндоуз мне пофигу сколько она весит, но я хочу попробовать её скомпилировать для андроида, т.к. мне удобнее ей будет пользоваться на андроиде. И вот для андроида, 111 Кб вместо 3.6.Мб ОЧЕНЬ большой прирост! Я исчерпал Ваш интерес к моим расчётам, Карл?

SSerge писал(а):Поставить Турбо Паскаль 7.0 на соответствующую ему машину, он "правильно обращается к родному линкеру". Т.е. умеет убирать из .exe неиспользуемый код. И, кстати, имен переменных и классов туда не пишет.

Вот пожалуйста, вкратце ВСЁ тоже самое, только на скупом программистском языке. Соответственно, то что говорит Лекс Айрин и мои рассчёты - это не миф, а реальность! Осталось только выяснить, как это сделать из под Лазаруса или напрямую обращаясь к FPC. Я последнее время, не верю, что Лазарус с FPC чего-то не могут...

Соответственно мой вопрос к Лекс Айрину всё ещё в силе:
:?: Как правильно обратиться к "родному линкеру" или без него "самим компилятором" проделать такую "линковку" ? :cry:


.
Последний раз редактировалось vitaly_l 22.10.2015 11:02:49, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Лекс Айрин » 22.10.2015 11:01:38

vitaly_l писал(а): Как это компилятор, без специальной команды, сам удалит названия: функций, классов и переменных?
А если я их использую в программе?


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



vitaly_l писал(а):Он вроде как должен содержать свой линкер. Да? А как его включить если "по умолчанию" со слов дымилки "Снег Севера" FPC, зачем-то, обращается к сишному линкеру...


Все просто. В FPС нет встроеной линковки.


vitaly_l писал(а):Мне это кстати не очень понятно, т.к. по идее на этапе Препроцессинга и Ассемблирования - вполне можно вычислить все используемые функции.


Нельзя. Дело в том, что код библиотек компилируется заранее и вставляется в программу целиком -- is as!

vitaly_l писал(а):В моих программах, мне ненужны названия у меня нет внешних библиотек...


Неправда ваша! У вас есть внешние библиотеки. Любая программа использует для своих целей системные функции, которые поставляются в библиотеках динамически подключаемых к ней.

vitaly_l писал(а):...и моему удивлению не было конца, когда выяснилось...

Я был вынужден достаточно плотно изучить этот вопрос. Были некоторые идеи, для воплощения которых это необходимо.

Добавлено спустя 4 минуты 38 секунд:
vitaly_l писал(а):Однако несмотря на то что имена были убраны, остался неиспользуемый код (хотя там убраны имена и он стал меньше)... Так вот если его убрать, то моя программа станет весить 111 Кб вместо 3.6 Мб. Для виндоуз мне пофигу сколько она весит, но я хочу попробовать её скомпилировать для андроида, т.к. мне удобнее ей будет пользоваться на андроиде. И вот для андроида, 111 Кб вместо 3.6.Мб ОЧЕНЬ большой прирост! Я исчерпал Ваш интерес к моим расчётам, Карл?


Сборка для андроида, линукса и для винды это разные процессы. Например под виндой программа весит 2-3 метра, а под линуксом 7-8. Разница, как я понял, преимущественно возникает из-за библиотеки эмулирующей винподобный API.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Mikhail » 22.10.2015 11:07:47

vitaly_l писал(а):Я действительно не знаю что такое RTTI,


Ну и зря... :)

vitaly_l писал(а):... но на форуме говорили что это для отладки.

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

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

Сообщение vitaly_l » 22.10.2015 11:10:15

Mikhail писал(а):Это не для отладки. Без этого на базе FPC невозможно построить RAD.

Спасибо, я поищу описания.

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

Вот здесь, боюсь Вы заблуждаетесь, Лазарус не цепляет системные библиотеки и вставляет в программу "всё своё"... т.к. он кросс-платформенный. Мне говорили об этом раньше другие программисты.

Лекс Айрин писал(а):Я был вынужден достаточно плотно изучить этот вопрос. Были некоторые идеи, для воплощения которых это необходимо.

Я знаю эти причины, и соответственно Вам верю, т.к. Ваша задача, требует изучения подобных вещей.

Но Вы не ответили на самый главный вопрос:
:?: Как правильно обратиться к "родному линкеру" или без него "самим компилятором" проделать такую "линковку" ? :cry:

Добавлено спустя 3 минуты 33 секунды:
Лекс Айрин писал(а):Сборка для андроида, линукса и для винды это разные процессы. Например под виндой программа весит 2-3 метра, а под линуксом 7-8. Разница, как я понял, преимущественно возникает из-за библиотеки эмулирующей винподобный API.

Под виндовз можно сократить LLCL, он как раз очевидно и линкует библиотеки виндоуз вместо лазарусовских. А под линукс? Чем меньше вес тем лучше программе, при этом хочется сохранить "кросплатформенную" систему Лазаруса и пусть подключает свои библиотеки вместо системных, т.к. в последних может быть путаница из-за версий.

Добавлено спустя 18 минут 18 секунд:
Лекс Айрин писал(а):Вполне можно переписать в заголовок экзешника некоторые перемещаемые адреса и все.

Вот как это сделать силами FPC или Лазаруса?



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

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

Сообщение Лекс Айрин » 22.10.2015 11:33:16

vitaly_l писал(а):Вот здесь, боюсь Вы заблуждаетесь, Лазарус не цепляет системные библиотеки и вставляет в программу "всё своё"... т.к. он кросс-платформенный.


Кросс-платформенность Лазаря это результат преобразования системных вызовов к единому формату. Например, мой блокнотик цепляет 9 стандартных библиотек, даже когда я не использовал не кросс-платформенных возможностей. Другое дело, что их вызовы скрыты от обычного программиста.

vitaly_l писал(а):Под виндовз можно сократить LLCL? он как раз очевидно и линкует библиотеки виндоуз вместо лазарусовских.


lcl, вообще-то... но должен Вас огорчить. Для подключения системных функций используется другая библиотека -- rtl, которая является неотъемлемой частью FPC. Ах да...lcl это часть лазаруса.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение vitaly_l » 22.10.2015 11:44:38

Лекс Айрин писал(а):lcl, вообще-то... но должен Вас огорчить. Для подключения системных функций используется другая библиотека -- rtl, которая является неотъемлемой частью FPC. Ах да...lcl это часть лазаруса.

Я вот про этот LLCL (Light LCL), он как подтвердил выше скалогрыз, превращает 3 Мб в 200 Кб: http://forum.lazarus.freepascal.org/index.php/topic,30027.msg190940/topicseen.html

Но Вы опять "ушли" от ответов:
Как правильно дать команду FPC и проделать такую "линковку", если в FPC нет своего линковщика ? (если турбо умеет, то и Лазарус сможет)

И вот это (я возможно неграмотно задаю вопрос, но суть мне кажется понятна):
vitaly_l писал(а):Добавлено спустя 18 минут 18 секунд:
Лекс Айрин писал(а):
Вполне можно переписать в заголовок экзешника некоторые перемещаемые адреса и все.

Вот как это сделать силами FPC или Лазаруса?


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

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

Сообщение Лекс Айрин » 22.10.2015 12:07:44

vitaly_l писал(а):Вот как это сделать силами FPC или Лазаруса?


это же очевидно.... переписать fpc добавив линкер.

Добавлено спустя 1 минуту 38 секунд:
vitaly_l писал(а):(если турбо умеет, то и Лазарус сможет)


Это, вообще-то из разряда "если Маша родила, то почему это Петя не может?"
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение vitaly_l » 22.10.2015 12:22:35

Лекс Айрин писал(а):это же очевидно.... переписать fpc добавив линкер.

Да?... Такое простое решение?... Обидно :cry: Тогда это художникам не подходит :cry: Художники не будут компилировать свой FPC, т.к. овчинка выделки стоит, если её сделать для всех, но я боюсь мне не хватит знаний, чтобы дополнить FPC. Хотя очень хотелось-бы убрать из исполняемого файла, все неиспользуемые name.
Лекс Айрин писал(а):Это, вообще-то из разряда "если Маша родила, то почему это Петя не может?"

Да?... они так сильно различаются :oops: :oops: :oops: :cry: Ну вот... чуть-чуть облажались... ну и ладно... нестрашно... На турбо паскаль №7 художники всё равно не перейдут, т.к. наверняка, в него не так-то просто загрузить Лазарусовский проект, а к Лазарусу художники уже привыкли.

Соответственно, остаётся только: "умная обфускация" и дописывание FPC. Но их нужно делать :cry:


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

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

Сообщение Лекс Айрин » 22.10.2015 13:06:29

vitaly_l писал(а):а?... они так сильно различаются


Конечно. FPC обеспечивает только совместимость кода (да и то не полную).
vitaly_l писал(а):но я боюсь мне не хватит знаний, чтобы дополнить FPC.


К сожалению, компилятор придется переделать, а не дописать. Нужен будет новый слой оптимизациии, новый отладчик, новый поток управления. Возможно, новый формат сборки... в общем, новая парадигма компиляции.

Например, для исключения лишних функций надо будет иметь возможность доступа к местоположению любой из них. Как это организовать? с ходу, можно использовать 2 пути:

1) перекомпиляция исходников с пропуском функций
2)исключение из копии объектного модуля библиотеки.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 2

Рейтинг@Mail.ru
cron