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

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

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

Ответить
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

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

Сообщение Сквозняк »

Виндовый линковщик ld.exe поставляемый с fpc имеет фичи отсутствующие в линуксовом: собирает небольшой бинарник без опций -XX -CX и, самое главное, прилинковывает к бинарнику из модуля только используемые функции а не все подряд. Есть ли какой-то паскалевский альтернативный линковщик или проект по его написанию?
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

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

"-CX -XX" делают то же самое.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Опа! А что линковщик уже знает какой метод из какого класса у меня будет вызываться, а какой нет? Умен бродяга!
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Линковщик для файлов формата ELF (что означает по крайней мере Linux и *BSD) уже практически доделан в составе компилятора.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

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
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Код: Выделить всё

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
. Это создает ссылки, от которых линкер не может избавиться.
Ответить