6 ms·
Static linking is practically impossible on modern Unix because of bullet point 4 in nopaste7's linked page. > all kinds of features in the libc (locale (throu
by saljam 13y ago
Static linking is practically impossible on modern Unix because of bullet point 4 in nopaste7's linked page.
> all kinds of features in the libc (locale (through iconv), NSS, IDN, ...) require dynamic linking (...)
These are all features which have been shoehorned into libc on Linux, but only work when it's a shared library because they rely on shared state. I would argue a cleaner way of implementing them would have been as services, but alas, you have what you have.
- caf 13y agoIt's not shared state - dynamic libraries don't share any more state between processes than static libraries do. Those features use dynamic linking so that they can load only the necessary implementations at runtime - eg if you aren't using LDAP name lookups, then the NSS won't load the library that does LDAP name lookups.
- johntb86 13y agoHopefully Linux doesn't allow anything like Windows' shared data sections: http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.90).aspx http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.90).as...
- amscanne 13y agoAFAIK there's no shared, writable section in ELF. But of course you could still easily mmap() a file to achieve the same thing (even from the shared library .init functions). I can understand that the shared section might be abused by goofy programmers ("Hey guys! We don't need to open a file for storage, we can just build it into the DDL!") ... but is there a reason you think it's a bad idea otherwise?
- amscanne 13y ago> It's not shared state - dynamic libraries don't share any more state between processes than static libraries do. The above sentence could be misconstrued. I assume when you say static libraries, you mean standard shared libraries (i.e. those listed when you run ldd). Not statically-linked libraries?
- caf 13y agoShared libraries on Linux only share read-only text and data, which should not be application-visible. If you want to share state between processes, the library must explicitly set up a shared mapping - but of course a statically linked library can do this just as well.
- amscanne 13y agoYes, I know. My point was related to the terminology re: static, dynamic, shared, etc. A statically-linked library won't share any state with other users of the library. It's statically-linked into the binary. State will be shared only with the instances of the same binary.
- caf 13y agoIt is irrelevant whether the library is statically-linked into the binary or not - a statically-linked library can share state with instances of that library linked into other binaries just as easily as a dynamically-linked library can. In both cases the library must explicitly set up some shared state.