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: рассылка данных и запись отладочной информации готовы. Линкером можно начинать пользоваться.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

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

December 2025

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

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 14th, 2026 06:48 am
Powered by Dreamwidth Studios