Линковщик для линукса

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Линковщик для линукса

Сообщение Сквозняк » 24.04.2013 04:19:43

Виндовый линковщик ld.exe поставляемый с fpc имеет фичи отсутствующие в линуксовом: собирает небольшой бинарник без опций -XX -CX и, самое главное, прилинковывает к бинарнику из модуля только используемые функции а не все подряд. Есть ли какой-то паскалевский альтернативный линковщик или проект по его написанию?
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Линковщик для линукса

Сообщение debi12345 » 24.04.2013 08:52:10

самое главное, прилинковывает к бинарнику из модуля только используемые функции а не все подряд.

"-CX -XX" делают то же самое.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Линковщик для линукса

Сообщение vada » 24.04.2013 11:15:19

Опа! А что линковщик уже знает какой метод из какого класса у меня будет вызываться, а какой нет? Умен бродяга!
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Линковщик для линукса

Сообщение Sergei I. Gorelkin » 24.04.2013 15:52:39

Линковщик для файлов формата ELF (что означает по крайней мере Linux и *BSD) уже практически доделан в составе компилятора.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Линковщик для линукса

Сообщение Сквозняк » 24.04.2013 16:47:17

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) уже практически доделан в составе компилятора.

Интересно, в какой версии он ожидается и как это скажется на размере пустой лазарусной формы, сейчас в линуксе она в три раза тяжелее виндовой.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Линковщик для линукса

Сообщение Sergei I. Gorelkin » 24.04.2013 17:32:03

Ожидается в следующей мажорной версии, размер результата можно проверить, дописав в конце файла systems/t_linux.pas строчку (рядом с вызовом RegisterExternalLinker, пример для i386-linux):
Код: Выделить всё
RegisterInternalLinker(system_i386_linux_info, TInternalLinkerLinux);


Вообще разницы в размере между внутренним линкером и компиляцией всего, включая RTL и пакеты, с ключами -CX -XX, не должно быть, т.к. алгоритмы исключения ненужных секций одни и те же.

Есть еще один нюанс - для Linux платформ до сих пор не была включена "section-based smartlinking", т.е. каждая функция компилировалась в отдельный объектный файл, из которых потом создавалася архив (.a). Это приводило к тормозам и большому расходу памяти при линковке.
В транке это исправлено.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Линковщик для линукса

Сообщение Павел Ишенин » 08.05.2013 16:03:24

Сквозняк писал(а):Интересно, в какой версии он ожидается и как это скажется на размере пустой лазарусной формы, сейчас в линуксе она в три раза тяжелее виндовой.


К линковке имеет посредственное отношение.

Проблема заключается в том как реализован GTK2 интерфейс (*) у Lazarus. В Win32 я проводил работу над уменьшением размера выполняемого файла. В GTK2 там еще разгребать и разгребать. Скорее следует ожидать нормальной реализации только в GTK3, который планируется писаться с нуля.

(*) При написании кода бэкенда (та часть которая называется GTK2/Win32/Qt Widgetset) не следует в общих методах обращаться к классам LCL, например писать
Код: Выделить всё
If Control is TCustomButton then
. Это создает ссылки, от которых линкер не может избавиться.
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru