Собираю здесь все что связано с разработкой на C, предпочтительно с использованием кросскомпиляции GCC
-
В папке
gccлежит скриптbuild_gcc_uknc.shс помощью которого можно собрать тулчейн для сборки проектов для УКНЦ. -
В папке
examplesлежат минимальные примеры приложений, собираемых с помощью тулчейна, получаемого скриптом из пункта 1.
Благодаря STARTFILE_SPEC (см. ниже) отдельный Makefile не обязателен —
gcc сам скомпилирует и слинкует программу за один вызов:
pdp11-uknc-rt11-gcc -std=gnu23 -fomit-frame-pointer -msoft-float -O2 \
-nodefaultlibs -Wl,--gc-sections -o example.sav example.c -lgccВ результате получается готовый .sav файл — самостоятельный образ памяти
в формате RT-11 SAV, который можно сразу записывать на диск (rt11dsk) и
запускать на УКНЦ под RT-11 без какой-либо дополнительной обработки.
Целевой триплет — pdp11-uknc-rt11. Тулчейн (binutils + GCC) собирается из
ванильных исходников (binutils-2.45, gcc-15.2.0) с наложением патчей из
форков wdigger/binutils-gdb и
wdigger/gcc — build_gcc_uknc.sh скачивает
их автоматически. Ниже — что именно эти патчи меняют относительно ванильного
binutils/GCC.
sav-pdp11(bfd/sav-pdp11.c) — новый write-only BFD-таргет, который пишет исполняемые файлы RT-11 SAV напрямую, без внешнего конвейера bin2load/lda2sav. Заголовок SAV содержит стартовый адрес, начальный SP (адрес вершины пользовательской памяти, а не точки входа — RT-11 копирует это слово в адрес042перед передачей управления) и битовую карту занятых блоков.- Вендор
uknc(config.sub) — алиас дляpdp11-uknc-aout; при сборке GCC для этого вендора автоматически включается-mbm2(проц 1801ВМ2), если пользователь не указал-mbm1/-mbm2явно. - Система
rt11(config.sub,gas/configure.tgt,bfd/config.bfd,ld/configure.tgt) — отдельная (отaout) система в триплете (pdp11-uknc-rt11). Форматsav-pdp11компилируется и виден только для неё (через-DBFD_SUPPORTS_SAV_PDP11вtarg_cflags);aoutостаётся побайтово ванильным binutils. - Встроенный линкер-скрипт (
ld/emulparams/pdp11rt11.sh,ld/scripttempl/pdp11rt11.sc) — эмуляцияpdp11rt11со скриптом, зашитым вld, так что-Tбольше не требуется. pdp11rt11sav— эмуляция по умолчанию для rt11 —ldдля этой системы сразу производит.sav. Технически линковка всё равно идёт черезa.out-pdp11(у него есть собственный, проверенный код разрешения релокаций —pdp11_aout_link_input_section), а конвертация в SAV происходит уже после того, как файл полностью записан на диск, через новый необязательный хук эмуляцииld—after_close_output(ld/ldemul.h/.c,ld/emultempl/emulation.em, один вызов вld/ldmain.c). Так получилось после того, как выяснилось, что прямая линковка вsav-pdp11через generic BFD final-link даёт неверные релокации (например, для строковых констант).
- Поддержка процессоров 1801ВМ1/1801ВМ2 (
-mbm1/-mbm2) — Советские клоны PDP-11, отличия в системе команд от штатных моделей DEC. - Исправление кодогенерации и использование инструкции
SOBдля организации циклов сдвига — по мелочи улучшают качество генерируемого кода под эти процессоры. - Исправление реального бага компилятора: 32×32-битное знаковое
умножение (
mulhisi3) компилировалось неверно (ошибка в reload/LRA) — найдено и исправлено на реальном тестовом коде. -fstack-usage/-Wstack-usage— бэкенд pdp11 раньше молча игнорировал эти опции; теперь размер стека кадра репортится, как и на других таргетах. Добавлено после того, как именно эта информация могла бы сразу поймать баг с переполнением стека вcrt0, который до этого пришлось ловить руками через симулятор.- Система
rt11в триплете (gcc/config.gcc) —pdp11-uknc-rt11зарегистрирован как отдельная (отpdp11-uknc-aout) система; задел под будущий порт newlib (у негоconfigure.hostвыбираетlibc/sys/<os>по системе триплета, аaoutдля этого не подходит — это формат объектных файлов, а не среда выполнения). STARTFILE_SPECдля rt11 (gcc/config/pdp11/pdp11.h,libgcc/config.host,libgcc/config/pdp11/{t-pdp11rt11,crt0rt.s, parse_args.c}) — обычная линковка дляpdp11-uknc-rt11работает без-nostartfilesи ручной линковкиcrt0rt.o:crt0rt.o/parse_args.oсобираются как часть сборки libgcc (по образцуlibgcc/config/nds32/t-nds32) и подключаются автоматически.crt0rt.sберёт SP из заголовка SAV-файла и строитargc/argvиз области командной строки, которую RT-11 сама заполняет при запуске программы (argv[0]— пустая строка-плейсхолдер: RT-11 никогда не сообщает программе её собственное имя).pdp11-uknc-aoutэту особенность не получает и продолжает использовать штатныйSTARTFILE_SPECGCC.