Линковщик для линукса
Модератор: Модераторы
Линковщик для линукса
Виндовый линковщик ld.exe поставляемый с fpc имеет фичи отсутствующие в линуксовом: собирает небольшой бинарник без опций -XX -CX и, самое главное, прилинковывает к бинарнику из модуля только используемые функции а не все подряд. Есть ли какой-то паскалевский альтернативный линковщик или проект по его написанию?
Опа! А что линковщик уже знает какой метод из какого класса у меня будет вызываться, а какой нет? Умен бродяга!
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Линковщик для файлов формата ELF (что означает по крайней мере Linux и *BSD) уже практически доделан в составе компилятора.
vada писал(а):Опа! А что линковщик уже знает какой метод из какого класса у меня будет вызываться, а какой нет? Умен бродяга!
А программа на паскале всегда состоит из одного большого класса который теперь заменяет и модуль system а хелловорд весит как пустая форма?
Код: Выделить всё
"-CX -XX" делают то же самое.Почти но не совсем.
Код: Выделить всё
unit k_k;
interface
procedure koska;
procedure sobaka;
implementation
procedure koska;
begin
writeln('Ля ля ля, кошке дали 2 рубля.');
end;
procedure sobaka;
begin
writeln('Собак грыз кость .');
end;
begin
writeln('Модуль k_k подключен');
end.Код: Выделить всё
uses k_k;
begin
koska;
//sobaka;
end.После сборки в линуксе в бинарнике оказывается вкомпилено 3 фразы а в win32 экзешнике всего 2.
Добавлено спустя 3 минуты 18 секунд:
Sergei I. Gorelkin писал(а):Линковщик для файлов формата ELF (что означает по крайней мере Linux и *BSD) уже практически доделан в составе компилятора.
Интересно, в какой версии он ожидается и как это скажется на размере пустой лазарусной формы, сейчас в линуксе она в три раза тяжелее виндовой.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Ожидается в следующей мажорной версии, размер результата можно проверить, дописав в конце файла systems/t_linux.pas строчку (рядом с вызовом RegisterExternalLinker, пример для i386-linux):
Вообще разницы в размере между внутренним линкером и компиляцией всего, включая RTL и пакеты, с ключами -CX -XX, не должно быть, т.к. алгоритмы исключения ненужных секций одни и те же.
Есть еще один нюанс - для Linux платформ до сих пор не была включена "section-based smartlinking", т.е. каждая функция компилировалась в отдельный объектный файл, из которых потом создавалася архив (.a). Это приводило к тормозам и большому расходу памяти при линковке.
В транке это исправлено.
Код: Выделить всё
RegisterInternalLinker(system_i386_linux_info, TInternalLinkerLinux);
Вообще разницы в размере между внутренним линкером и компиляцией всего, включая RTL и пакеты, с ключами -CX -XX, не должно быть, т.к. алгоритмы исключения ненужных секций одни и те же.
Есть еще один нюанс - для Linux платформ до сих пор не была включена "section-based smartlinking", т.е. каждая функция компилировалась в отдельный объектный файл, из которых потом создавалася архив (.a). Это приводило к тормозам и большому расходу памяти при линковке.
В транке это исправлено.
-
Павел Ишенин
- постоялец
- Сообщения: 475
- Зарегистрирован: 24.03.2007 09:16:52
Сквозняк писал(а):Интересно, в какой версии он ожидается и как это скажется на размере пустой лазарусной формы, сейчас в линуксе она в три раза тяжелее виндовой.
К линковке имеет посредственное отношение.
Проблема заключается в том как реализован GTK2 интерфейс (*) у Lazarus. В Win32 я проводил работу над уменьшением размера выполняемого файла. В GTK2 там еще разгребать и разгребать. Скорее следует ожидать нормальной реализации только в GTK3, который планируется писаться с нуля.
(*) При написании кода бэкенда (та часть которая называется GTK2/Win32/Qt Widgetset) не следует в общих методах обращаться к классам LCL, например писать
Код: Выделить всё
If Control is TCustomButton then