[M3devel] ROOT, $ORIGIN, runpath, LD_LIBRARY_PATH, symlinks, hardlinks, etc.
Tony Hosking
hosking at cs.purdue.edu
Thu Jul 2 21:48:14 CEST 2009
- Previous message (by thread): [M3devel] ROOT, $ORIGIN, runpath, LD_LIBRARY_PATH, symlinks, hardlinks, etc.
- Next message (by thread): [M3devel] ROOT, $ORIGIN, runpath, LD_LIBRARY_PATH, symlinks, hardlinks, etc.
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
On 2 Jul 2009, at 14:41, Jay wrote:
> Before I explain, more options:
>
> copy and commit the source to cm3 is viable
I don't know what this sentence means.
> heck, use a relative instead of absolute from ROOT
ditto
> go back to the old way (I'll explain)
I think I understand the shortcomings here but Jay should explain.
> There is also the option to relink or "fixup"
> upon ship and/or install. Some platforms have a "fixup"
> utility for exactly "these reasons".
> MacOS X has one.
Sounds feasible, but I worry about portability of this approach.
> The question is:
>
> How does program foo find libbar.so?
> At runtime.
Right. rpaths in the executable should do the trick.
> How does libbar.so find libfoo.so?
Same again.
> There are a bewildering array of choices.
> They are combinable.
> It varies somewhat from platform by platform, but not much really.
Ideally we use the same approach for *all* platforms. So, what do all
platforms have in common.
> The main options are:
>
>
> 1: A full path written into program foo
> or libbar pointing to e.g. /usr/lib/libfoo.so.
> Actually this is usually separate libfoo.so and
> a list of directories that apply to all .so files.
> There isn't generally a matching up of directory to file,
> I think, but a "search path" aka "run path".
i.e., rpath?
> 2: A relative path written into program foo
> or libbar.so point to e.g. $ORIGIN/../lib/libfoo.so.
> Again, the directories are split from the files.
Please explain the implications of this w.r. to hard links! I don't
want hard links.
> MacOS X doesn't have $ORIGIN by that name, but it
> has three similar things, like @executable_path.
> @executable_path goes way back and is presumably
> relative to the primary main executable.
Then we should avoid $ORIGIN. Use the linker options to specify
rpaths (and if there is need for override use $LD_LIBRARY_PATH.
> There are two other similar options.
> One is new in 10.5. Presumably one is relative
> to the reference. And maybe one is some concatenation
> of all directories anything found in so far? I don't know.
> The documenation was not clear to me.
Again, I'd like to use the same approach on all platforms (except
perhaps Windows).
> NetBSD prior to 5.0 doesn't have $ORIGIN.
A good reason not to use it.
> NT searches $PATH always.
> We put the .dlls in bin.
> Cygwin same.
OK, so things work fine there.
> Approximately all other systems seem to support about the same
> $ORIGIN feature:
> OpenBSD, FreeBSD, Linux, Solaris, NetBSD 5.0, even Interix, and
> others (Aix? Irix? HP-UX?)
> The MacOS X feature is close enough to lump in.
>
> 3: Search $LD_LIBRARY_PATH or similar.
> This has a few different names.
> LD_LIBRARY_PATH32, LD_LIBRARY_PATH64, DYLD_SOMETHING.
These are fallbacks for the situation when the default installed
configuration needs overriding.
> Now, our historical implementation was
> - record a full path /usr/local/cm3/pkg/foo/LINUX/libfoo.so,
> a path for every dependency
> The file formats are generally such that there are leaf file names
> separate from an array of directories to look in. A "normal"
> non-Modula-3 program would generally I assume have a prety small
> such array of directories. A "normal" Modula-3 program would have
> a fairly large array.
But if everything goes in INSTALL_ROOT/lib we have only one directory,
right?
> As well, doing builds for distribution would often leave you with /
> tmp/cm3
> which is a possible security problem. This definitely did occur.
Surely, building for a distro can build in the right path. Where did /
tmp/cm3 come from? If you need to be able to override while building
then use $LD_LIBRARY_PATH.
> Now, again, there are many options, and they can be combined.
> Portability is perhaps a concern, but perhaps not so much, given
> today's landscape.
Elegance is also a concern.
> Now, if we are to use relative paths, well, my understanding is that
> the "real" files need to be in relatively few directories, e.g. /usr/
> local/cm3/lib,
> and not /usr/local/cm3/pkg/foo/linux etc.
I prefer this approach.
> This way, files in lib and bin can point to $ORIGIN/../lib.
Fair enough.
> Now, keep in mind, that unshipped binaries sometimes people like to
> work,
> as well, perhaps also programs (not shared libraies, as far as I know)
> buried in the pkg store /usr/local/cm3/pkg/foo/linux/foo.
> I know cm3 sits in there, though that copy isn't used.
I don't know understand what you are trying to say here.
> I make no account for binaries buried in the package store.
>
> I do make some account for unshipped binaries.
>
> By default the run paths we are recording in current config files
> are
> $ORIGIN/../lib:/usr/local/cm3/lib
> Not a bunch of paths into pkg, just two entries.
>
>
> The "security" issue still is present by default.
> But the run path is "prettier" and probably more efficient.
>
>
> When you build a distribution however, you are expected to omit /usr/
> local/cm3/lib (it might be /tmp/cm3).
> This is controled by an environment variable, which I set in Olaf's
> scripts, but oops
> I think I set it too late. I'll fix that very very soon.
The following is a bit rambling for me to respond to in detail.
Perhaps someone else should weigh in.
>
>
> To recap:
> - full paths
> - relative paths from $ORIGIN
> - LD_LIBRARY_PATH
>
> They each have advantages and disadvantages.
> $ORIGIN provides for a "movable" install. I can install to /usr/
> local/cm3,
> you can install to /opt/cm3. It'll just work. No need to change
> LD_LIBRARY_PATH.
>
>
> However if I want to move just some of the files, not the whole
> binary tree
> together, then $ORIGIN breaks down.
>
>
> If really want one file here, another there, and another somewhere
> else, $ORIGIN doesn't do.
> You are left with full paths or LD_LIBRARY_PATH.
>
>
> Oh, and moral equivalent of LD_LIBRARY_PATH, like /etc/ld.so.conf or
> such.
> Look on birch for example, it is /usr/local/cm3/lib.
> That tripped me up actually, because, you know, my cm3 is in $HOME/
> cm3 there.
> This demonstrated another problem in this area!
> $ORIGIN keeps things more tightly together, which you often want,
> sometimes might not not.
> LD_LIBRARY_PATH lets things be spread around, again, sometimes you
> want that, sometimes not.
> I figure tightly point is the more common, but imagine if you just
> want to replace one file.
> Is that reasonable? You replace it by putting it elsewhere?
> (Imagine "patching" an install
> this way.)
>
>
> So, here now I'm rambling.
> I've laid out the options and /some/ of the disadvantages/advantages.
>
>
> There is no perfect solution, and the various solutions are
> combinable.
> I find combining them though, I start to get confused.
> Because you end up in a "probing" situation and you start wondering
> which supercedes which, and you just hope there aren't any
> "duplicates"
> so that the probe order is mostly moot (assuming there remain no
> duplicates).
>
>
> Somewhat clear?
>
>
> You run, e.g. elfdump -p foo | grep -i path or somesuch, or ldd foo
> or ldd -v or -V foo and
> investigate the various options and their effects. Solaris has a
> very nice and verbose
> ldd form.
>
>
> Now, the files in pkg.
> I consider it somewhat philosophically significant that "everything
> is in pkg".
> There is a well structured "repository" not a randomly organized
> bunch of files.
> I think. Maybe this is just a suggestion?
> You know, if they are hardlinks and we don't really use the ones in
> pkg, is
> there a point?
>
>
> Or, on the other hand, is the philosophy a big deal and we should go
> back to
> lib symlinking to pkg to appease the philosophy?
>
>
> "ship/install" certainly "likes" to put things in pkg.
> I don't think the option of using lib and not pkg is doable without
> builder changes.
> But that is doable.
>
>
> A few other folks here did pipe up some on this in the recent past and
> I think there was kinda sorta consensus that the old ways were not
> great
> (particularly 1) the big runpath 2) the runpath into /tmp)
> and the new ways maybe better, but I admit there was no clear
> consensus.
> I acted somewhat unilaterally. You know, I'm impatient and arrogant
> so...
> and Tinderbox is there to cause some restraint.
>
>
> There was definitely pushback on wanting unshipped binaries to keep
> working,
> which they largely do as a result of the discussion/pushback.
>
>
> As well, any unshipped binaries that we know we use in the build,
> like PklFonts,
> stubgen, m3bundle, we build standalone, to evade/avoid problems here,
> since $ORIGIN/../lib won't work and the full paths are meant to be
> omitted.
> I consider this not great.
>
> I think, really, we should be able to dynamically link everything
> really,
> including cm3. I don't think we should static link just to make up for
> the need for a backup. There are plenty of backups available and you
> can
> make plenty more. However this will have to wait and probably take
> more arguing and maybe demonstration of its viability.
> I will require some work to make work anyway.
>
>
> At one point I was confused about the need for static linking so
> accepted it strongly.
> Now I don't see it. If you just need backups, again, they exist, and
> you can make more.
> Static linking isn't imho a substitute for backups.
> There are technical problems to be solved though.
>
> Could be that these issues are related though. If your backup might
> load the wrong m3core.so too easily, making it not a very reliable
> backup,
> static linking could mitigate that. But $origin seems like a good
> mitigation.
> I'm strongly considering add just plain $origin, in addition to
> $origin/../lib to runpath.
> That way you can just put everything in one messy but easier to move/
> copy directory.
>
>
> - Jay
>
>
>
>
>
> > Date: Thu, 2 Jul 2009 20:04:36 +0200
> > From: wagner at elegosoft.com
> > To: m3devel at elegosoft.com
> > Subject: Re: [M3devel] ROOT
> >
> > Quoting Tony Hosking <hosking at cs.purdue.edu>:
> >
> > > That sounds plausible. Is there anything in the current setup that
> > > depends on the .so files being in pkg instead of lib?
> >
> > I don't think so offhand. But I must admit that I've lost the
> overview
> > in this area, too :-/
> >
> > Olaf
> >
> > > On 2 Jul 2009, at 13:34, jay.krell at cornell.edu wrote:
> > >
> > >> How about we put .so files only in lib and not in pkg? Or symlink
> > >> from pkg to lib instead of how it used to be the other way
> around?
> > >> Those would also fix all this.
> > >>
> > >> - Jay (phone)
> > >>
> > >> On Jul 2, 2009, at 9:21 AM, Jay <jay.krell at cornell.edu> wrote:
> > >>
> > >>>
> > >>> Are you up to date in m3-libs/m3core?
> > >>> Lots of builds have succeeded with this..
> > >>> It isn't great, but that requirement to build from previous
> 5.4 release..
> > >>>
> > >>> - Jay
> > >>>
> > >>> ________________________________
> > >>>> From: hosking at cs.purdue.edu
> > >>>> To: hosking at cs.purdue.edu
> > >>>> Date: Thu, 2 Jul 2009 11:54:51 -0400
> > >>>> CC: m3devel at elegosoft.com
> > >>>> Subject: Re: [M3devel] ROOT
> > >>>>
> > >>>> If I define ROOT then I get the following error. I think this
> all
> > >>>> needs reverting!
> > >>>>
> > >>>> --- building in SOLgnu ---
> > >>>>
> > >>>> ignoring ../src/m3overrides
> > >>>>
> > >>>> "/.gollum/u110/u86/hosking/cm3/m3-sys/cm3/src/m3makefile", line
> > >>>> 12: quake runtime error: unable to copy
> > >>>> "~/cm3/m3-libs/m3core/src/ unix/Common/UnixLink.c" to
> > >>>> "./UnixLink.c": errno=2
> > >>>>
> > >>>> --procedure-- -line- -file---
> > >>>> cp_if --
> > >>>> include_dir 12 /.gollum/u110/u86/hosking/cm3/m3-sys/cm3/src/
> m3makefile
> > >>>> 6 /.gollum/u110/u86/hosking/cm3/m3-sys/cm3/SOLgnu/m3make.args
> > >>>>
> > >>>> Fatal Error: package build failed
> > >>>> n
> > >>>>
> > >>>> On 2 Jul 2009, at 11:49, Tony Hosking wrote:
> > >>>>
> > >>>> Where did variable ROOT come from? Do I really need to define
> it?
> > >>>> Seems broken to me to depend on the source directory structure
> > >>>> as it sets that structure in stone.
> > >>>>
> > >>>>
> >
> >
> >
> > --
> > Olaf Wagner -- elego Software Solutions GmbH
> > Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
> > phone: +49 30 23 45 86 96 mobile: +49 177 2345 869 fax: +49 30 23
> 45 86 95
> > http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz:
> Berlin
> > Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr:
> DE163214194
> >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20090702/8e612487/attachment-0002.html>
- Previous message (by thread): [M3devel] ROOT, $ORIGIN, runpath, LD_LIBRARY_PATH, symlinks, hardlinks, etc.
- Next message (by thread): [M3devel] ROOT, $ORIGIN, runpath, LD_LIBRARY_PATH, symlinks, hardlinks, etc.
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the M3devel
mailing list