[m-users.] Installed library not found

Volker Wysk post at volker-wysk.de
Wed Sep 14 12:06:27 AEST 2022


Am Mittwoch, dem 14.09.2022 um 11:28 +1000 schrieb Peter Wang:
> On Tue, 13 Sep 2022 13:47:59 +0200 Volker Wysk <post at volker-wysk.de> wrote:
> > Am Dienstag, dem 13.09.2022 um 21:28 +1000 schrieb Zoltan Somogyi:
> > > 2022-09-13 20:48 GMT+10:00 "Volker Wysk" <post at volker-wysk.de>:
> > > > desktop ~/src/tt $ ./tt
> > > > ./tt: error while loading shared libraries: libposix.so: cannot open shared
> > > > object file: No such file or directory
> > > > 
> > > > The installed library is here:
> > > > 
> > > > /usr/local/lib/mercury-srcdist-rotd-2022-09-
> > > > 07/lib/mercury/lib/asm_fast.par.gc.stseg/libposix.so
> > > > 
> > > > When I put the above path (the directory part of it) in the LD_LIBRARY_PATH
> > > > variable, the program starts okay.
> > > 
> > > What you have is a mismatch between
> > > 
> > > - where the installed shared object is, and
> > > - where the system looks for it.
> > > 
> > > You can fix this either
> > > 
> > > - by putting the shared object where the system expects it, or
> > > - by telling to system to expect it where it is.
> > > 
> > > You did the latter by including that directory in LD_LIBRARY_PATH.
> > > You can also do it by installing the shared object into a directory
> > > that is already in your LD_LIBRARY_PATH. Section 6.2.1 of the
> > > user guide will tell you how.
> > 
> > I've installed the library the standard way, "mmc -j8 --make
> > libposix.install". I think this should work out of the box, if possible.
> > 
> > The problem is, that the grade is part of the install path:
> > /usr/local/lib/mercury-.../lib/asm_fast.par.gc.stseg/libposix.so
> > 
> > The Posix library in question got installed in only one grade
> > (asm_fast.par.gc.stseg), and I'm not sure why. If it were installed in
> > several grades, the dynamic linker would need to be told somehow, which
> > grade (hence, which directory) to look in. It would (right?) not be possible
> > to add all grades to the LD_LIBRARY_PATH variable, because the differently
> > compiled .so files, which have the same file name, would come into conflict
> > with each other, wouldn't they?
> > 
> > If I installed a library in some already existing place, I would get the
> > problem with the different grades again.
> 
> To complete the picture, there is an optional variable in the binary
> called the RPATH or RUNPATH which lists locations where the loader will
> search for dynamically linked libraries (in addition to the default
> locations and LD_LIBRARY_PATH). You can see it using "objdump -p".
> 
> When you linked the posix library using "--ml" the RPATH was set
> automatically, that's why it started working. Whether you want the RPATH
> to be set depends on what the binary is intended for. You can turn it
> off with --no-default-runtime-library-directory.

I see. Thanks for the explanation.

Volker


More information about the users mailing list