From a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1 Mon Sep 17 00:00:00 2001 From: claude Date: Sun, 12 Jul 2026 01:19:32 +0000 Subject: 🌭 plan9-kencc-linux: кросс-тулчейн Plan9 (cc/as/ld) + EFI-болванка MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build_arch.sh / build_al.sh: сборка kencc-компиляторов, ассемблеров, линкеров всех арок (5/6/8/v/q/k) на Linux-хосте через plan9port. - патчи под musl/gcc: sbrk->mmap, round/log2->p9*, Runemask, swcmp const, -fcommon, machcap/omachcap, /sys рантайм-файлы. Подробно в PATCHES.md. - bin/: готовые 8c 6c 5c vc qc kc + 6a 6l (Linux/musl x86_64). - efi/: болваночный bootx64.efi (PE32+) тем же тулчейном (6a+6c+6l+dd), референс — 9legacy nboot/efi; ESP-образ через mkesp.py. Co-Authored-By: Claude Opus 4.8 --- PATCHES.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 PATCHES.md (limited to 'PATCHES.md') diff --git a/PATCHES.md b/PATCHES.md new file mode 100644 index 0000000..f8b20aa --- /dev/null +++ b/PATCHES.md @@ -0,0 +1,58 @@ +# Патчи под сборку kencc на Linux-хосте + +Все правки автоматически накладываются `scripts/build_arch.sh` и `build_al.sh` +на свежие копии исходников (оригинальное дерево не трогается). Ниже — что и зачем. + +## 1. `round` / `log2` → `p9round` / `p9log2` +`cc/` определяет свои `round()` и `log2()`, конфликтующие по типу с прототипами +из musl `math.h`. Переименовываем определения и вызовы во всех файлах (и в +сгенерённом `y.tab.c`). Файлы: `cc/dcl.c`, `cc/pgen.c`, `cc/sub.c`, `cc/cc.h`, +`Xc/swt.c`, `Xc/cgen.c`. + +## 2. Порядок и единичность `#include "y.tab.h"` +`y.tab.h` (генерит yacc) использует тип `Node`, объявленный в `cc.h`, и не имеет +include-guard. Значит: включать строго ПОСЛЕ `cc.h` и ровно один раз (иначе +конфликт переопределения `YYSTYPE`/`yylval`). В свежем `lex.c` порядок уже +верный — правка нужна была только при ручной возне. + +## 3. Плоская раскладка include +Исходники ссылаются на соседние каталоги: `#include "../cc/cc.h"`, +`"../6c/6.out.h"`, `"../8l/elf.h"`, extension-less `"compat"`, `"macbody"`, +`"lexbody"`. Складываем всё в один каталог сборки и срезаем `../*/` из include. +Extension-less файлы копируем явно. + +## 4. `Runemask` +Плановская libc-константа `Runemask` (маска 21-битной руны) есть в родной Plan9, +но НЕ в plan9port. Добавляем `#define Runemask 0x1FFFFF` в `lex.c`. + +## 5. Прототип `swcmp` → `const` +`swcmp` — компаратор для `qsort`. У musl сигнатура `int(const void*, const void*)`, +а плановский прототип в `gc.h` — `int(void*, void*)`. Приводим прототип к `const`. + +## 6. `-fcommon` +Старый код держит tentative-дефиниции глобалов (напр. `hintabsize` в нескольких +`.c` через общий `gc.h`). Современный gcc по умолчанию `-fno-common` и ругается на +multiple definition. Компилируем с `-fcommon` (как раньше). + +## 7. `mysbrk`: `sbrk()` → `mmap()` ← ключевой +Hunk-аллокатор kencc берёт память через `mysbrk` → `sbrk()`. На musl `sbrk()` +возвращает `-1` (не поддерживается совместно с malloc), из-за чего `gethunk()` +падал в «out of memory» → `exits`, причём диагностика уходила в неинициализированный +Bio-буфер и терялась (компилятор молча выходил с кодом 1). Заменяем тело `mysbrk` +на анонимный `mmap`. Без этого патча компиляторы линкуются, но не компилируют. + +## 8. Дубликат `machcap` / `omachcap` +`cc/omachcap.c` (старый machcap) и `Xc/machcap.c` (новый) оба определяют `machcap`. +В родной сборке `omachcap.o` дремлет в архиве `cc.a` и не тянется. У нас — линкуем +плоско, поэтому: если у арки есть свой `machcap.o` (6c/8c/qc) — выкидываем +`omachcap.o`; если нет (5c/vc/kc) — `omachcap.o` и предоставляет `machcap`. + +## 9. Плановские рантайм-файлы вон +Файлы вроде `Xc/sys.c` тянут `#include "/sys/src/libc/9syscall/sys.h"` — это +рантайм ОС, не часть компилятора, и в `OFILES` mkfile их нет. Выкидываем любые +`.c` с include по абсолютному `/sys/...`. + +## 10. Авторитетность `cc/` при конфликте имён (kc) +У `kc` завалялся собственный устаревший `bits.c`, использующий уже вырезанный из +plan9port форматный тип `Fconv`. Копируем `cc/`-файлы ПОСЛЕ арочных, чтобы общий +`cc/bits.c` (новый fmt API) побеждал. -- cgit v1.2.3