Skip to content

Latest commit

 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Электроника МС 0511 (УКНЦ)

разработка на С

GCC кросскомпиляция

Собираю здесь все что связано с разработкой на C, предпочтительно с использованием кросскомпиляции GCC

  1. В папке gcc лежит скрипт build_gcc_uknc.sh с помощью которого можно собрать тулчейн для сборки проектов для УКНЦ.

  2. В папке 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/gccbuild_gcc_uknc.sh скачивает их автоматически. Ниже — что именно эти патчи меняют относительно ванильного binutils/GCC.

binutils

  • 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 — эмуляция по умолчанию для rt11ld для этой системы сразу производит .sav. Технически линковка всё равно идёт через a.out-pdp11 (у него есть собственный, проверенный код разрешения релокаций — pdp11_aout_link_input_section), а конвертация в SAV происходит уже после того, как файл полностью записан на диск, через новый необязательный хук эмуляции ldafter_close_output (ld/ldemul.h/.c, ld/emultempl/emulation.em, один вызов в ld/ldmain.c). Так получилось после того, как выяснилось, что прямая линковка в sav-pdp11 через generic BFD final-link даёт неверные релокации (например, для строковых констант).

GCC

  • Поддержка процессоров 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_SPEC GCC.

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages