D213 - The payload path split along selfish's charter: format knowledge in selfish, runtime in obSCEne - and multi-library resolution works

The crt0 was briefly in selfish. selfish's charter forbids it: "a crt ... anything that executes on the console - do not [belong here], and neither does a convenience layer for writing homebrew." Correcting that produced a cleaner split and closed the one real duplication.

Where each piece landed

piece home why
payload/crt0.c obSCEne it runs on the console - runtime, not format knowledge
tool/examples/gen_payload_table.rs obSCEne build orchestration; the vaddrs it emits are per-firmware measurements
Sections::dynamic_symbols selfish reading .dynsym is a format primitive, and it was a real gap

The generator had hand-rolled a .dynsym parse because selfish's symbols() read only .symtab. That was the duplication. selfish now has dynamic_symbols() beside symbols() (shared symbols_of(kind)), and the generator calls it - so obSCEne consumes the primitive rather than reimplementing it. The per-firmware vaddrs stay in obSCEne, exactly as selfish's own "corpus is a measurement, not a format" ruling requires.

My earlier selfish D047 entry (arguing a mission expansion to hold the crt0) collided with the real D047 (signing) and contradicted the charter; both it and its WORKLOG note were reverted. selfish keeps only the dynamic_symbols primitive.

Multi-library resolution, validated on hardware

The crt0's resolve_lib_base - sceKernelLoadStartModule then sceKernelGetModuleInfo for a non-libkernel base - was written but untested. A body calling strlen from libSceLibcInternal (library 1) resolved it and returned 12 for a twelve-character string, clean exit. So the crt0 handles the general case: libkernel from getpid, every other library loaded and based at runtime.

That unblocks both remaining fronts. The full suite imports across many libraries and now has a resolution path for all of them. Rendering resolves libSceVideoOut the same way - load it, base it, resolve by vaddr - so the display API is reachable from a payload; what remains for rendering is the foreground context, not the resolution.

Status: hardware - the split built and ran, and cross-library resolution returned a correct value on the console, 2026-08-27.