SchOS/.gitignore
Nexoniarz 1be5f3a704 ldls: the loader, and what it measured
docs/plan/ldls.md milestone L0. ldls/ko.c indexes the sections of an ELF64
relocatable object, places the allocatable ones, resolves undefined symbols
against a caller's table and applies the relocations. Nothing is executed.

It is freestanding -- no libc, no allocation, no I/O -- so the same source
builds as a host tool now and as the SchOS-side host later. That is the
arrangement mkschfs and the kernel already share, and for the same reason:
the failures at this layer are format failures, and one found on the host
costs a second instead of a boot.

    $ ldls-inspect 8139too.ko
      module    8139too
      license   GPL
      loads to  33988 bytes
      relocations: 1980
        R_X86_64_64 363, PC32 991, PLT32 428, 32S 169, PC64 29
      undefined symbols: 94
      stops at: unresolved: __fentry__

The licence is printed before anything is loaded, because it is the one
property that decides whether the object may be on the machine at all and it
is a plain string in .modinfo. Rule 1 is easier to keep when the answer is on
screen.

94 symbols is the measured API surface of 8139too on 6.18.46 -- the list,
exactly, rather than an estimate -- and it is L1's work queue. It is smaller
than it looks: __fentry__, __stack_chk_fail, __ref_stack_chk_guard,
__x86_return_thunk and __fortify_panic are compiler and instrumentation
artefacts that stub out in a line each.

Swept over every module in a stock 6.18.46 tree: 2,440 objects, all of them
laid out and relocated to completion, none with a relocation type the loader
does not handle. That sweep is also what retired the fixed section table --
nvidia-modeset has 7,069 sections and 74,305 relocations, against a median of
50 -- so the caller supplies the table and there is no limit to run into
rather than a generous one that fails later.

Loading is not running, and the doc says so: not one symbol is implemented,
and the distance between "relocates" and "transmits a packet" is the rest of
the plan.

No .ko is in this tree and .gitignore now refuses one outright. make
ldls-check runs 18 checks against ldls/test/refmod.c, which is ours, written
to contain one of each thing the loader has to get right.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQ7Qx8E1q1M1bbCq8QLHS2
2026-09-14 07:45:31 +02:00

50 lines
1.6 KiB
Text

# Build output. Everything here is reproducible from `make`.
build/
schos.img
schos.iso
*.o
*.d
*.asm
*.sym
# The staged root filesystem. Assembled by the build from cmd/, lib/ and
# ports/ -- tracking it would mean committing a second copy of every binary
# on every build.
sysroot/
# Upstream tarballs, fetched not authored: musl, toybox, mksh, dash, the DOOM
# WADs and usb.ids. 61 MB of other people's release artefacts, all of which
# the build downloads again if they are missing. The patches that matter are
# under ports/*/patches/ and those *are* tracked.
dist/
# Test and screenshot output.
*.log
*.ppm
*.png.tmp
# Claude Code's per-machine settings (permissions granted on this host).
# .claude/memory/ IS tracked -- it is the project memory, and committing it is
# how it survives a directory rename and reaches the other machines.
.claude/settings.local.json
# Emacs lock files: dangling symlinks like .#README -> user@host.pid, left
# behind when a session ends badly. One was committed in the initial import.
.#*
*~
\#*\#
# Build output under projects/ -- these are programs that run on SchOS, and
# their binaries were tracked by accident.
projects/schcom/schcom
projects/schcom/schcom-demo
# A built ISO dropped next to the site for download.html. 62 MB; not source.
docs/Website/releases/
# Kernel modules, ever. docs/plan/ldls.md rule 1: LDLS ships the layer and
# never the thing it loads, and that applies to this tree as well as to an
# image. The loader's test input is built from ldls/test/refmod.c, which is
# ours; a .ko here would be someone else's GPL code in an Apache-2.0 repo.
*.ko
*.ko.xz