D030 - The string table is the first entry in the dynamic table, and everything that names something comes last

Status: decided, on evidence.

A loader walks the dynamic table once, in order, and resolves a name offset the moment it meets one. Four tags carry a name offset rather than a pointer - the module's own name, its exported library, and the name of every module and library it imports from. Emitted before DT_SCE_STRTAB, they are offsets into a string table the loader has not been given, and it dereferences a base it does not have.

The symptom is a fault inside the loader, with nothing in its log, before a single guest instruction runs. It is indistinguishable from every other way a module can be malformed, which is what made it expensive.

How it was found. By cutting the dynamic table down one entry at a time and running each truncation. A table terminated immediately ran - the guest reached its spin loop. A table with one entry did not. That entry was DT_SCE_MODULE_INFO, carrying the module's own name at string-table offset 1.

Pinned by a test rather than a comment: this is exactly the ordering a tidy-up undoes.