Plan 9 from Bell Labs’s /usr/web/sources/wiki/d/164

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


Why Static
D1135249771
Auriel (82.182.149.46)
#Why has Plan 9 chosen statically linked binaries instead of dynamic
#ones? Read below:
#
#[http://groups.google.com/group/comp.os.plan9/msg/42c4232fac260f29]
#! 	From: [email protected] (ron minnich)
#! 	Subject: Re: [9fans] acme, rio workalike available in plan 9 ports
#! 	Message-ID: <[email protected]>
#! 	Date: Tue, 20 Apr 2004 14:57:50 GMT
#! 	
#! 	On Tue, 20 Apr 2004, boyd, rounin wrote:
#! 	
#! 	> debian managed to shoot themselves in the foot with some libc,
#! 	> some time back.  you couldn't go forward 'cos other stuff would
#! 	> break and you couldn't go back 'cos more stuff would break.
#! 	
#! 	gets better. Symbols are now versioned (well, this really happened a few
#! 	years back). So you are very tightly screwed (good word) to the library
#! 	you use, and it covers a definite range forward/backward. I assume but am
#! 	not sure that glibc nowadays encompaesses lots of versions of lots of
#! 	functions going back for years. Which also means the version naming of the
#! 	file (libc-2.3.2.so) has a lot less meaning than it used to. At some
#! 	point, given the tight wiring of an executable to the particular library
#! 	version, one starts to lose track of just why .so's are still thought to
#! 	be a good idea (I mean, on a 1960s-era Burroughs machine with not much
#! 	memory, I get it, but ... /bin/cat on my Redhat box at 20K, is not much
#! 	smaller than /bin/cat on Plan 9 (22K stripped), and the Plan 9 one doesn't
#! 	do symbol fixup every time it runs ...).
#! 	
#! 	And, as Linus mentioned, TLBs matter. Hmm. Judging by 'ps', cat on linux
#! 	needs 256 of them, and cat on Plan 9 needs 6. xclock has got 900 or so, 
#! 	and Plan 9 clock appears to have 3*30 or so (3 clock procs when you run 
#! 	clock). 
#! 	
#! 	So you do pay a bit for .so's. You don't gain an
#! 	implementation-independent interface for your programs, since the .so is
#! 	versioned and the symbols in it are versioned; I wonder what you DO gain?  
#! 	The theory always was you could swap out a shared library and swap in a
#! 	bug-fixed version, which sounds nice until you try it and it fails
#! 	miserably (there was a time when this worked ...)
#! 	
#! 	ron
#
#! 	From: Ron Minnich
#! 	To: 9fans
#! 	
#! 	On Fri, 23 Apr 2004, Christoph Hellwig wrote:
#! 	
#! 	> That beeing said I'm the last one to defend glibc's bloat, but in a
#! 	> system where you can't easily rebuild all binaries for whatever
#! 	> reason shared libraries and symbol versioning makes a lot of sense.
#! 	
#! 	No, it doesn't help much at all. 
#! 	
#! 	Let's take program 'a', which depends on stat. In the new order of gcc,
#! 	when built, 'a' will depend on stat from glib 2.0. A new stat comes along
#! 	with fixes. It gets built into glibc 2.1. You install glibc 2.1. Program
#! 	'a', unless I rebuild or replace it, will be using the old stat. Of
#! 	course, I might think that the shared library has fixed all binaries using
#! 	stat, and I'm wrong -- or am I right? Is the V1 stat just a wrapper? who
#! 	knows? And do you cover all the cases? And maybe it isn't calling stat and
#! 	I don't know it. Maybe it's calling one of these:
#! 	
#! 	000c888c t __GI___fxstat 
#! 	000c90cc t __GI___fxstat64 
#! 	000c90cc t ___fxstat64
#! 	000c888c T __fxstat 
#! 	000c90cc T __fxstat64@@GLIBC_2.2 
#! 	000c90cc T__fxstat64@GLIBC_2.1 
#! 	000c90cc t __old__fxstat64 
#! 	000c888c t _fxstat 
#! 	
#! 	I've found programs that call all these variants, because the functions
#! 	they call call different library functions. It's quite interesting to see.  
#! 	Which one is 'a' calling? Oh yeah, you can max out the ld.so debug
#! 	options, because of course weak symbols come into this game too, and
#! 	you're not really sure unless you watch this:
#! 	
#! 	     19595:     binding file /lib/libpthread.so.0 to /lib/libc.so.6: 
#! 	normal symbol `getrlimit' [GLIBC_2.2]
#! 	     19595:     symbol=__getpagesize;  lookup in file=date
#! 	     19595:     symbol=__getpagesize;  lookup in file=/lib/libpthread.so.0
#! 	     19595:     symbol=__getpagesize;  lookup in file=/lib/librt.so.1
#! 	     19595:     symbol=__getpagesize;  lookup in file=/lib/libc.so.6
#! 	
#! 	yup, several hundred lines of this stuff, for 'date'. Of course it's kind
#! 	of interesting: Posix threads are used by 'date'. I had no idea that 
#! 	printing a date could be so complex. Maybe that's why it's 40k -- bigger 
#! 	than some OSes. 
#! 	
#! 	The symbol versioning breaks assumptions users have about how shared 
#! 	libaries work -- that they provide a link to one version of a function and 
#! 	if you replace the library all the programs get fixed. I've seen this 
#! 	problem in practice, for both naive users and very non-naive sysadmins. 
#! 	
#! 	The symbol versioning wires programs to something beyond a library 
#! 	version, in a way that is not obvious to most people. To fix a binary that 
#! 	uses a library, you have to replace the binary, not just the library, or 
#! 	you can not be sure anything gets fixed. 
#! 	
#! 	That said, if you can't rebuild all the binaries, well then you're stuck, 
#! 	and have no idea if your new shared library is going to fix anything at 
#! 	all for some of those binaries. Some will stay broken, since replacing the 
#! 	library did not necessarily replace broken functions -- the new library 
#! 	has them too, for backwards compatibility. So the upgrade is not an 
#! 	upgrade.  This is a feature? 
#! 	
#! 	ron
#

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].