There are multiple forms for storing objects on the filesystem, including abstractions, single- and multi-object library files, etc. Then there is the representation of what objects are assigned to which symbols. These don't need to be the same thing. Each patch has its own table of which symbols are attached to which objects, and this can be separate from which objects are actually loaded into memory.
One idea for handling this is to have separate tables of symbols for
which object files are loaded, versus which symbols are tied to which
objects for a given patch. It seems for this to be workable, there would
need to be a "loaded" table, then each patch would generate its table
from the loaded table. Then if an object isn't in the loaded table, the
loaded table handler would go and try to load it."
https://puredata.info/dev/PdNamespaces