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

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

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

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

Сообщение Sergei I. Gorelkin » 23.10.2015 08:35:13

SSerge писал(а):И последняя стадия сборки каждый объектный файл в готовый проект вставляет только целиком и никак иначе.


Уже с незапамятных времен поддерживается формат объектных файлов, в которых каждая функция помещается в свою секцию, а при линковке те секции, на которые нет ссылок, исключаются. Правда, в случае gcc этот режим не включен по умолчанию, и нужно компилировать с ключами -ffunction-sections -fdata-sections -wl,--gc-sections. В FPC это соответствует -CX -XX, но вроде бы на всех платформах, где в приниципе поддерживается, оно включено по умолчанию и я навскидку не вспомню как отключить.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение Лекс Айрин » 23.10.2015 10:03:59

Sergei I. Gorelkin, не получается. Каждый новый компонент, даже просто положенный на кнопку, значительно увеличивает код. Дальнейшее добавление компонент из этого модуля не сильно меняет код.

Sergei I. Gorelkin писал(а): В FPC это соответствует -CX -XX, но вроде бы на всех платформах, где в приниципе поддерживается, оно включено по умолчанию и я навскидку не вспомню как отключить.

В параметрах это вкладка "компиляция и компоновка" обе галочки (у меня они по умолчанию сняты) умная компоновка. И, вот же странное в королевстве Датском, их установка/снятие НИКАК не влияет на исходный код. Размер файла совпадает до байта.

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

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

Сообщение Sergei I. Gorelkin » 23.10.2015 10:41:54

Если LCL не перекомпилируется вместе с проектом, то естественно галочки не будут почти ничего менять.
А вообще можно добавить параметр -Xm, тогда созастся .map файл, в котором будет расписано, что выброшено и что из-за чего оставлено.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение Лекс Айрин » 23.10.2015 11:00:11

Sergei I. Gorelkin, не, я конечно, могу перекомпилировать полностью среду без этих галочек... но ведь я специально перекомпилирую проект полностью, со всеми необходимыми модулями. Да и бред, для включения/отключения таких вещей перекомпилировать компилятор заново. Вы ведь не собираете автомобиль заново, когда заправляетесь?

Sergei I. Gorelkin писал(а):А вообще можно добавить параметр -Xm, тогда созастся .map файл, в котором будет расписано, что выброшено и что из-за чего оставлено.


Угу... а то, что размер файла не изменился, получается фигня... тогда объясните тупому мне, что можно выбросить из файла имеющее размер 0 байт? И какой смысл этим тогда пользоваться?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Mikhail » 23.10.2015 11:22:48

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

Так и должно быть, почему я Вам уже объяснил. Это не баг, а фича. :) В других подобных системах точно также, если что.

Лекс Айрин писал(а):но ведь я специально перекомпилирую проект полностью, со всеми необходимыми модулями. Да и бред, для включения/отключения таких вещей перекомпилировать компилятор заново. Вы ведь не собираете автомобиль заново, когда заправляетесь?

Не компилятор, а библиотеку и это не бред... в общем, Вам надо бы мат часть немного изучить, тогда и вопросы отпадут что да почему. :roll:

sign писал(а):imho, если сбудется "мечта" о динамической линковке рунтайма лазаруса, это похоронит его нынешнее достоинство - "везу весь свой код на себе, в одной программе - и буду независим", и создаст кучу проблем.

Нет рантайм пакеты это хорошо, жаль что их сейчас нет, не нужно было бы пересобирать лазарус каждый раз при добавлении компонентов.
А насчет "все свое ношу с собой" - так никто же не принуждает собирать с рантайм пакетами, можно как в Делфи и так и эдак. 8)
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение SSerge » 23.10.2015 11:27:53

Лекс Айрин писал(а):что можно выбросить из файла


Ну... У меня из нижепреведенной композиции строки, содержащиеся в PRO1,PRO2,PRO4,PRO6 из откомпилированного кода - исчезли. Без включения дополнительных опций (смотрел, правда, после применения strip). Вот только кто сделал? Компилятор или таки линкер? (Windows, проект делался через CodeTyphon. Тип проекта: "Simple Program" (т.е. без LCL вообще). 173568 байта .exe. Вообще-то не сказать, чтобы так уж мало
Код: Выделить всё
program prtest;

uses prtestunit;

begin
  Pro3;
  Pro5;
end.   


unit prtestunit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;


procedure Pro1;
procedure Pro2;
procedure Pro3;
procedure Pro4;
procedure Pro5;
procedure Pro6;



implementation


procedure Pro1;
begin
  writeln('===== Procedure PRO1! ====');
end;


procedure Pro2;
begin
  writeln('===== Procedure PRO2! ====');
end;

procedure Pro3;
begin
  writeln('===== Procedure PRO3! ====');
end;

procedure Pro4;
begin
  writeln('===== Procedure PRO4! ====');
end;

procedure Pro5;
begin
  writeln('===== Procedure PRO5! ====');
end;

procedure Pro6;
begin
  writeln('===== Procedure PRO6! ====');
end;

end.
                                                 


ЗЫ: не обратил внимания на uses в prtestunit, нагенерированный ide.
Без Classes и SysUtils - 40960 после strip.
И действует, скорее всего линкер. Потому что в файлe prtestunit.o информация есть из всех процедур, в том числе и неиспользуемых.
Последний раз редактировалось SSerge 23.10.2015 11:45:06, всего редактировалось 1 раз.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

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

Mikhail писал(а):Это не баг, а фича.


Я бы сказал, где я видал такие фичи... но меня забанят.

Mikhail писал(а):В других подобных системах точно также, если что.


Угу... Петя застрелился, Вася спился... чем я хуже?

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


Так я и перекомпилировал весь проект, со всеми необходимыми библиотеками... результат -- выброшено 0 байт.

SSerge писал(а): Вот только кто сделал? Компилятор или таки линкер?


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

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

Сообщение Mikhail » 23.10.2015 12:06:34

Лекс Айрин писал(а):Я бы сказал, где я видал такие фичи... но меня забанят.
Угу... Петя застрелился, Вася спился... чем я хуже?


Опять демонстрируете невежество в вопросе, не надоело? :?
Здесь все просто или RAD и оверхед по размеру или не RAD и меньший оверхед. По другому не бывает. Не устраивает размер отказывайтесь от RAD и кодите все вручную.

Лекс Айрин писал(а):Так я и перекомпилировал весь проект, со всеми необходимыми библиотеками... результат -- выброшено 0 байт.

Уверены? Кстати, Вы знаете что такое раздельная компиляция? :|
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение wavebvg » 23.10.2015 12:07:50

Лекс Айрин писал(а):Я бы сказал, где я видал такие фичи... но меня забанят.

А как Вы метод по имени собираетесь запускать если его линкер вырежет? (хотя все можно)

Лекс Айрин писал(а):Угу... Петя застрелился, Вася спился... чем я хуже?


Не хуже, просто при всем прочем, для запуска конечного приложения не требуется никаких дополнительных libc и еже с ними (а чего-то врода bpl-ок я пока не видел. Спец. библиотеки как раз решают все проблемы при наличии пакетного менеджера - просто добавляете зависимость и получаете ну очень маленький бинарник, а rtl, lcl, lcl-ext и т.п. закачиваете из репозитария и не паритесь)
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

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

Сообщение Лекс Айрин » 23.10.2015 12:20:17

Mikhail писал(а):Не устраивает размер отказывайтесь от RAD и кодите все вручную.


И ведь, со временем, придется(( Даже невзирая на то нравится или не нравится.

Я процитированное -- это просто чтобы было понятно как это выглядит со стороны.

Mikhail писал(а):Уверены? Кстати, Вы знаете что такое раздельная компиляция? :|


Вообще-то, я проект очистил и пересобрал. Я всегда так делаю после изменения настроек и/или перекомпиляции лазаря. Так что по любому библиотеки были перекомпилированы. Да и выхлоп компилятора это подтвердил. Что-то большее это уже перекомпиляция всей среды. И что такое раздельная компиляция я знаю.

Подберите уж аргументы более приближенные к реальности.

Добавлено спустя 10 минут 27 секунд:
wavebvg писал(а):А как Вы метод по имени собираетесь запускать если его линкер вырежет?


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

wavebvg писал(а): просто при всем прочем, для запуска конечного приложения не требуется никаких дополнительных libc и еже с ними


Речь о другом. Широкое использование "прописных истин" мешает найти правильный подход. Зачем, если он уже известен? А вынос функционала в дополнительную библиотеку ничего не решает -- суммарный объем запускаемого (и скачиваемого!) кода остается прежним, а то его становится и больше.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение vitaly_l » 23.10.2015 12:41:45

SSerge писал(а):НЕверно. Вместо них он подключает свои библиотеки, являющиеся сильно урезанным по функционалу кодом - поэтому, меньшего размера.

Вы правы - это был полёт моего воображения. но я перепроверю и Ваше утверждение, когда подключу (т.к. 1000 против 100 - очень много). Хотя возможно и Ваша правда, т.к. библиотеки действительно всегда вставляются полностью (но Sergei I. Gorelkin говорит это ОКАЗЫВАЕТСЯ можно регулировать!!! Спасибо... ). И кстати хорошо что Вы уточнили, т.к. мне больше нравится Лазарусовский вариант "всё своё ношу с собой", нежели "подключаю постоянно меняющееся системное".

SSerge писал(а):А ничего, что в TP в принципе нет ни классов, ни соответствующих им полей "published"

Какие ещё "поля" и какие ещё "классы" после ассемблирования??? Там даже названия переменных, можно было-бы убрать, т.к. они там нумеруются. Ассемблирование, в моём понимании это практически уже машинный код, только в человеко-читаемой форме, откуда там классы и поля? Если это можно получить в виде нормального ассемблерного кода, который можно откомпилировать - то я прав и даже не пытайтесь оспорить. Но Лекс Айрин говорит что Лазарус возвращает какой-то листинг, а не asm. И этот листинг нельзя откомпилировать... Или можно???

SSerge писал(а):Кстати, именно по озвученной причине в Си принято аж с самого рождения языка исходник каждой функции записывать в отдельный файл.
Это безусловно круто, для 60-90 годов прошлого века... но в наше время, можно было бы уже и написать обработчик, разделяющий один файл со 100 процедурами и функциями, на массив из 100 процедур и функций! И потом выбирать из этого массива, то что нужно <=== Даже не пытайтесь это оспорить и сразу признайте, поражение СИ системы... т.к. это реально сделать. Однако Sergei I. Gorelkin - говорит что в Лазарусе есть что-то подобное и мы просто не умеем пользоваться. <== Вот в это я верю... и все инструкции: Sergei I. Gorelkin - проанализирую.

SSerge писал(а):imho, если сбудется "мечта" о динамической линковке рунтайма лазаруса, это похоронит его нынешнее достоинство - "везу весь свой код на себе, в одной программе - и буду независим", и создаст кучу проблем.

А вот здесь я с Вами согласен на все 100!!! Свои библиотеки - это реальное достоинство и громадный ПЛЮС лазаруса, но выше уже говорили что это можно отключить - это кстати раз в 15 уменьшит файл.

Лекс Айрин писал(а):Все имена известны при компиляции. Компилятор заменит имя на соответствующий адрес и все.

Это будет 100% работать, можете даже не спорить, я вчера прочитал описание работы. Это не только сократит код, но и ускорит работу.


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

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

Сообщение Mikhail » 23.10.2015 12:58:37

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


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

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


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

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


Всегда используются внешние библиотеки, хотя бы из состава ОС. Например в WinXP для того чтобы запустить программу весом в пол мегабайта, а то и меньше, приходилось ставить дотнет весом в пару сотен мегабайт. Тоже самое касается и линуксов, там тоже для запуска программы использующей, например gtk нужно установить пакеты его содержащие. В общем еще раз призываю, учите матчасть! :evil:
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение wavebvg » 23.10.2015 13:02:59

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

Ну вот Вы и ответили - Вам необходимо, чтобы приложение было компактным и быстрым, а не удобным при разработке и недающим отрезать себе руки...
Вам нужно переписать rtl с $M- (а можно просто его выкинуть) и работать без него (ни о какой кроссплатформенности тогда речи не будет, зато лишнего тоже не будет).
Вообще, при всех плюсах (стабильный результат здесь и сейчас) подход разработчиков FPC имеет ряд недостатков, к примеру Вы себе мозг вышибите, чтобы собрать приложений без RTL, но с поддержкой строк или работой с файлами - там прибито очень большими гвоздями (впрочем, возможно, я совсем не секу фишки)
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

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

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

Mikhail писал(а):Да не известны!

Это фантастика... как это они не известны, когда они напечатаны в каждом модуле? Что Вы там курите?

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

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

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

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

Сообщение wavebvg » 23.10.2015 13:30:49

Mikhail писал(а):Да не известны!

vitaly_l писал(а):Это фантастика...

Не путайте компилятор и линковщик. Компилятор-то знает, а C-ный линковщик - нет, поэтому и возникают проблемы.
vitaly_l писал(а):Да? Если код получить после ассемблирования то всё

No comments
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru