Линкер в первом приближении работает
May. 27th, 2019 10:56 pmРаньше называлось "связывающий загрузчик", а теперь больше в ходу термин "линкер". Это программа, которая связывает вместе несколько объектных файлов и библиотек и производит готовую программу. Нынче говорят "executable image".
На БЭСМ-6 загрузчик был встроен в мониторную систему "Дубна". Это он вызывался картой *EXECUTE, находил в текущей библиотеке объектный модуль с именем PROGRAM, связывал с другими модулями из текущей библиотеки, готовил в памяти выполняемый код программы и передавал ей управление. Все трансляторы языков программирования готовят объектные модули в одном и том же совместимом формате. Раньше называлось "стандартный массив". Разработан загрузчик и формат стандартного массива был Игорем Николаевичем Силиным и другими программистами из Дубненской команды где-то в конце 60-х.
В юниксе линкер традиционно вызывается командой ld. Он берёт несколько объектных файлов и связывает их вместе, добавляя при необходимости модели из библиотек (lib*.a). Другие стандартные утилиты для работы с объектными файлами: nm, objdump, size, strip.
Мне кавалерийским наскоком удалось разобраться в алгоритме работы загрузчика и воспроизвести его в виде юниксной утилиты besm6-ld. Вызов выглядит так:
Пример:
Другие полезные утилиты: besm6-nm, besm6-objdump, besm6-strip. Про них я напишу отдельно.
Линкер выполняет всю работу за три прохода. Первый проход: считывание входных объектных файлов и библиотек в память, построение временной таблицы символов для определения списка требуемых библиотечных модулей, вычисление итогового размера секций команд, данных и bss. Второй проход: построение окончательной таблицы символов и их адресов, размещение common-блоков, добавление символов /etext, /edata, /end в юниксном стиле. Третий проход: настройка адресов секции команд, формирование выходного файла в формате стандартного массива. Результирующий файл может быть перемещаемым или неперемещаемым (готовым к выполнению).
Результат загрузки тоже имеет формат стандартного массива, с двумя небольшими отличиями:
(1) Отсутствует таблица входов (перед заголовком). Вместо этого имена входов представлены в таблице символами со специальными типами (414 для короткого имени и 614 для длинного имени). Количество входов не ограничено.
(2) В готовом к выполнению файле второе слово заголовка (ранее не задействованное) содержит базовый адрес загрузки и адрес входа.
Но пока ещё линкер не вполне готов к применению. Не реализованы две вещи: рассылка данных (команда Мадлена ,SET,) и формирование отладочной информации. Без рассылки данных ничего работать не будет: она нужна для инициализации системных структур данных в Паскалевских процедурах нижнего уровня. Отладочная информация полезна, чтобы утилита besm6-nm могла показывать и локальные символы тоже (не только глобальные).
Update: рассылка данных и запись отладочной информации готовы. Линкером можно начинать пользоваться.
На БЭСМ-6 загрузчик был встроен в мониторную систему "Дубна". Это он вызывался картой *EXECUTE, находил в текущей библиотеке объектный модуль с именем PROGRAM, связывал с другими модулями из текущей библиотеки, готовил в памяти выполняемый код программы и передавал ей управление. Все трансляторы языков программирования готовят объектные модули в одном и том же совместимом формате. Раньше называлось "стандартный массив". Разработан загрузчик и формат стандартного массива был Игорем Николаевичем Силиным и другими программистами из Дубненской команды где-то в конце 60-х.
В юниксе линкер традиционно вызывается командой ld. Он берёт несколько объектных файлов и связывает их вместе, добавляя при необходимости модели из библиотек (lib*.a). Другие стандартные утилиты для работы с объектными файлами: nm, objdump, size, strip.
Мне кавалерийским наскоком удалось разобраться в алгоритме работы загрузчика и воспроизвести его в виде юниксной утилиты besm6-ld. Вызов выглядит так:
$ besm6-ld
Linker for BESM-6 object files
Usage:
besm6-ld [options] file...
Options:
-d Force common symbols to be defined
-e symbol Set entry address
-l libname Search for library `libname'
-o filename Set output file name
-r Generate relocatable output
-s Strip all symbol information
-t Trace names of linked files
-T address Set base address (default 1)
-u symbol Start with undefined reference to `symbol'
Линкер принимает на вход объектные файлы (стандартные массивы), 100% совместимые с существующими трансляторами мониторной системы "Дубна". То есть можно пользоваться Фортраном (-ГДР, -Дубна или Forex), Алголом, Паскалем, Мадленом, БЕМШем, имеющимися библиотеками, записывать результат в файл, и потом всё это связывать.Пример:
$ besm6-ld hello.obj libpas.a -o hello.out
$ besm6-size hello.obj hello.out
text data bss dec hex filename
21 8 0 29 1d hello.obj
1047 130 1164 2341 925 hello.out
Файл hello.obj получен трансляцией файла hello.pas. Архив libpas.a содержит набор объектных модулей, выдернутых из стандартной Паскалевской библиотеки. Линкер связывает всё это вместе и создаёт файл hello.out. Утилита besm6-size показывает размер секций кода, инициализированных данных и неинициализированных данных (bss) в словах БЭСМ-6.Другие полезные утилиты: besm6-nm, besm6-objdump, besm6-strip. Про них я напишу отдельно.
Линкер выполняет всю работу за три прохода. Первый проход: считывание входных объектных файлов и библиотек в память, построение временной таблицы символов для определения списка требуемых библиотечных модулей, вычисление итогового размера секций команд, данных и bss. Второй проход: построение окончательной таблицы символов и их адресов, размещение common-блоков, добавление символов /etext, /edata, /end в юниксном стиле. Третий проход: настройка адресов секции команд, формирование выходного файла в формате стандартного массива. Результирующий файл может быть перемещаемым или неперемещаемым (готовым к выполнению).
Результат загрузки тоже имеет формат стандартного массива, с двумя небольшими отличиями:
(1) Отсутствует таблица входов (перед заголовком). Вместо этого имена входов представлены в таблице символами со специальными типами (414 для короткого имени и 614 для длинного имени). Количество входов не ограничено.
(2) В готовом к выполнению файле второе слово заголовка (ранее не задействованное) содержит базовый адрес загрузки и адрес входа.
Но пока ещё линкер не вполне готов к применению. Не реализованы две вещи: рассылка данных (команда Мадлена ,SET,) и формирование отладочной информации. Без рассылки данных ничего работать не будет: она нужна для инициализации системных структур данных в Паскалевских процедурах нижнего уровня. Отладочная информация полезна, чтобы утилита besm6-nm могла показывать и локальные символы тоже (не только глобальные).
Update: рассылка данных и запись отладочной информации готовы. Линкером можно начинать пользоваться.
no subject
Date: 2019-05-28 07:21 am (UTC)или с именем, указанным в директиве *MAIN
Кроме имён в библиотеках, еще были предопределенные имена, разрешавшиеся в адреса ниже 01000, например, LOADGO или LOADANGO, и EXIT - если мы на это когда-нибудь налетим, будем думать крепче.
Ну и надо понять, какие значения были у регистров при передаче управления на 01000.
no subject
Date: 2019-05-28 07:55 am (UTC)no subject
Date: 2019-05-28 01:29 pm (UTC)В отдаленном будущем, надеюсь, можно добавить функционал БЭСМ и аппаратную поддержку периферии БЭСМ с выгрузкой на SD-карточку.
no subject
Date: 2019-05-28 03:51 pm (UTC)no subject
Date: 2019-05-28 01:39 pm (UTC)Про регистры: точно не помню, надо вспоминать, в основном, это были регистры загрузчика, но что-то было полезным (неофициально используемым) , 13 и 15 - это понятно , что это возврат и магазин.
Вопрос о 414 и 614: как новый загрузчик их будет обрабатывать, если они встретятся в ст. массиве?
no subject
Date: 2019-05-28 03:31 pm (UTC)