vak: (Default)
[personal profile] vak posting in [community profile] besm6
Раньше называлось "связывающий загрузчик", а теперь больше в ходу термин "линкер". Это программа, которая связывает вместе несколько объектных файлов и библиотек и производит готовую программу. Нынче говорят "executable image".

На БЭСМ-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: рассылка данных и запись отладочной информации готовы. Линкером можно начинать пользоваться.

Date: 2019-05-28 07:21 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
находил в текущей библиотеке объектный модуль с именем PROGRAM

или с именем, указанным в директиве *MAIN

Кроме имён в библиотеках, еще были предопределенные имена, разрешавшиеся в адреса ниже 01000, например, LOADGO или LOADANGO, и EXIT - если мы на это когда-нибудь налетим, будем думать крепче.

Ну и надо понять, какие значения были у регистров при передаче управления на 01000.

Date: 2019-05-28 01:29 pm (UTC)
x86128: (Default)
From: [personal profile] x86128
Да нам для целей МЭСМ-6 это всё несущественно. Мы же не собираемся запускать бинарники под мониторкой.

В отдаленном будущем, надеюсь, можно добавить функционал БЭСМ и аппаратную поддержку периферии БЭСМ с выгрузкой на SD-карточку.

Date: 2019-05-28 01:39 pm (UTC)
From: [personal profile] mrupor
Таблица загруженных имен существенна не только для области monitor*, она так же необходима при загрузки динамических разделов ( в первой книге Мазного это было очень подробно расписано, т.к. частично решало ограничения памяти), что в Дубне очень активно использовалось на счётных задачах. Эта таблица, в кругах ОС Дубна, называлась: ТРП - таблица распределения памяти, хранилась на 20 мат.мб. и изменялась загрузчиками (мн.ч) , некоторые ей манипулировали, и были прорицаемы Силиным.


Про регистры: точно не помню, надо вспоминать, в основном, это были регистры загрузчика, но что-то было полезным (неофициально используемым) , 13 и 15 - это понятно , что это возврат и магазин.

Вопрос о 414 и 614: как новый загрузчик их будет обрабатывать, если они встретятся в ст. массиве?

Profile

Сообщество любителей БЭСМ-6

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 11th, 2026 08:32 pm
Powered by Dreamwidth Studios