Date: Thu, 12 Feb 2009 10:59:36 -0800 (PST) From: Doug Ambrisko <ambrisko@ambrisko.com> To: arch@freebsd.org Subject: rtld enhancement to add osversion sub-directory search Message-ID: <200902121859.n1CIxaJd083445@ambrisko.com>
next in thread | raw e-mail | index | archive | help
Hi folks, I'd like to discuss the idea of adding an automatic directory search feature to rtld. At work we need to run 3rd party code that we get as objects or even binaries that are compiled by other groups. This works okay when our base OS is the same as the 3rd party but not so good when we upgrade our base OS and we don't want to force th 3rd party code to upgrade at the same time. Sometimes they can't since legacy systems that needs to run the 3rd party code run the older OS. Now WRT to FreeBSD's base libraries this isn't much of a problem since the OS's lib's general bump version between releases so just via the name we have unique lib's and the loader can get the correct one. However, once you start to link to stuff in ports (ie. /usr/local/lib) then these names are no longer unique and something built for FreeBSD 4 through 7 (as part of FreeBSD's release, ie pre-built packages) end up with the same name. This is a problem since sticking the old version in /usr/lib/compat is a problem since it looks based on name (ie. /usr/local/lib/libiconv.so.3). Things can get interesting when the /usr/local/lib pulls in libc. So now your FreeBSD 4 binary could pull in a libiconv.so.3 for FreeBSD 7 and libc from FreeBSD 7. Interesting things start to happen! What I've done for work is to teach the rtld to look for the .note.ABI-tag and extract the osversion. I then put that and the osversion major number (ie. 6 instead of 603000) into a "try" list. Then whenever an object/lib is attemped to be accessed I look in the osversion sub-directory then the osversion major and finally the standard location. I even extended this to LD_PRELOAD and insert this try into the path just before the object/lib if fully qualified. Actually, I do it for all fully qualified things. Now I can stick most things into /usr/lib/compat/6 and it just works. For fully qualified LD_PRELOAD I "mv" things on boot into the sub-directory for that OS. Also I had to change LD_PRELOAD to accept failure if the thing wasn't found since children in herit that and if it a different version that LD_PRELOAD might not be applicable. I don't really see a maintain for rtld since jdp when I worked with him to add LD_PRELOAD. I'd like to get feed back on this idea and get it into FreeBSD. It would help solve some of these issues for other people as well. It definitely, made my life easier at work. It would also make things easier on my FreeBSD machines, when I upgrade the OS and ports but have legacy compiled things that I don't want to recompile again. I could move all of my /usr/local/libs into /usr/local/lib/compat/<osversion major), upgrade packages and still run my old stuff. I've had issues before when OO was cross-linked with libc from 6 and 7 due to this. Rebuilding OO was not fun and I shouldn't have needed to. There is one glitch in atleast FreeBSD 6.1 didn't put the .note.ABI-tag into binaries so for now if not specified I assume FreeBSD 6. That is good enough for work but I could add an env. variable to hold the default. If not set then it wouldn't do the sub-directory thing on binaries that are not known. Loading of objects will slow done a bit since it adds extra searches. It might be good enough to just do the os version major and not for the complete osversion. BTW, I also added a feature to look at LD32_ first then LD_ when running 32bit on 64bit. Legacy SW doesn't know about LD32_ and just sets LD_. This way that stuff doesn't need to be taught about LD32_ when it shouldn't really need to. Comments, Doug A.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902121859.n1CIxaJd083445>