As someone who has worked far more with dynamic linking in Windows the ELF system has always seemed needlessly complex; the extra indirections of the GOT/PLT mechanism and PIC are avoided by simply linking DLLs with different load addresses (so they don't always need to be relocated, but can be if necessary), and the only thing that needs to be associated with a symbol is an address.
Makes it especially convenient when writing things like in-memory executable compression and shared data between processes.
RTLD_LOCAL and RTLD_DEEPBIND are completely unnecessary. Another advantage Windows has in practice is default symbol visibility.
Windows DLLs export only the symbols you explicitly instruct your compiler and linker to export --- through export files or compiler annotations.
So I'm only passingly familiar with the state of OS's back before I was born, but between "your code works unchanged between static and dynamic linking, you just have to change your build system which is already OS dependent" and "how you export and import symbols in the source code varies depending on how you're linking and also which OS you're building on and which compiler you're using", the former seems less insane.
Sure, but static linking isn't dynamic linking.
I've worked extensively with both ELF and PE systems --- I was on the Windows Perf team and the Windows Phone core team, and now I do low-level Android goo at Facebook. In addition to the advantages you mention, the Windows per-DLL symbol namesystem system is much better than ELF's hazardous model: in ELF, accidental interposition is a big hazard, so you have to very carefully namespace the symbols exported from a shared object.
In Windows (and in OS X), symbol name collisions are simply not a problem: there's no global namespace in which symbols can collide.
Also, it's a minor thing, but Load Library in Windows returns a pointer to the PE header.Fitz returns to Manchester after living 10 years in Australia with his wife and youngest son.He is soon drawn into the investigation of a British soldier who may have been traumatized by his years serving in Northern Ireland.Pretending that it is has done much harm, but I don't think it's led to demonstrable benefits.If you want to split a single module into two dynamically-linked parts, you need to define the interface between these parts anyway for versioning purposes.