D025 - The dynamic-table writer moves here, and the manifest stays with the caller

dynlib.rs is the writing half of dynamic.rs: it rebuilds the string, symbol and hash tables, re-encodes every import, emits the tag list in both conventions, and performs the module surgery a linker cannot - appending the segment, repurposing the declared vendor header, overwriting the standard dynamic table, and removing the section headers.

What did not move is which library resolves a given name. That is a manifest, not a fact about the format, and it arrives as a closure. Every consumer has a different one; none of them disagrees about the format.

Returning None from that closure for an undefined symbol is an error naming the symbol, not a default. Library zero is a real id - usually the kernel's - so defaulting to it is a valid-looking answer that resolves to nothing at run time.

The knowledge in this module was earned by obSCEne against real loaders and is transcribed with its reasoning intact, because the reasoning is the part that stops it being re-litigated: