It gets a bit more complicated than that as DLLs symbols are namespaced, can be changed to lazy link on demand instead of process/thread start, can represent .NET code instead of native, can contain COM objects with dynamic configuration and lookup rules, have lifetime logic associated to processes/threads, can have a special main entry point and invoked via RunDll or regsvr32.
Ah, custom sections and loaders can also be defined.
Ah, custom sections and loaders can also be defined.