The linker script, and a test that actually links

link/module.ld moved over from obSCEne, along with the comments that make it worth having: every rule in it was learned from a module a loader rejected, or accepted and then read wrongly.

The three that cost the most:

Testing something a compiler never sees

Two layers. layout.rs compiles the script in and asserts its text names the same constants selfish-elf::segment does - drift there produces a module whose headers are wrong and whose build succeeds. Then an integration test runs a real ld.lld over it and parses the output with this crate:

LOAD R E, LOAD RW           two loadable segments, not three
DYNAMIC, INTERP
LOOS+0x1000001              PT_SCE_PROCPARAM
LOOS+0x1000000              PT_SCE_DYNLIBDATA

It skips when clang and ld.lld are absent rather than failing - they are not build dependencies here, and a test that fails on a clean machine teaches people to ignore failures.