This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: libgcc.so.1 problem
- From: "Nelson H. F. Beebe" <beebe at math dot utah dot edu>
- To: Stefan Varga <Stefan_Varga at tempest dot sk>, gcc-help at gcc dot gnu dot org
- Cc: beebe at math dot utah dot edu
- Date: Mon, 28 Nov 2005 09:25:03 -0700 (MST)
- Subject: Re: libgcc.so.1 problem
Stefan Varga <Stefan_Varga@tempest.sk> asks on Mon, 28 Nov 2005
15:26:36 +0100 about preventing this sort of error:
$ ldd libz.so
libgcc_s.so.1 => (file not found)
I have always felt that it is a design flaw in the Unix loader that it
does not record in the output executable file the location of a shared
library that it found successfully at link time.
The solution is to specify a loader option that requests such
recording. Depending on the compiler, this is usually an option of
one of these forms:
-Wl,-rpath,$(prefix)/lib gcc, g++, FreeBSD, SGI, Sun compilers
-rpath $(prefix)/lib Compaq/DEC, SGI compilers
-Rdir:dir:dir Portland Group, Sun compilers
Notice that SGI and Sun support two such flavors.
IBM AIX 4.x compilers seem to record this information automatically,
and, in fact, don't even use .so files for shared libraries: they use
the .a versions directly, and don't even offer the user a choice
between dynamic and static linking.
Compaq/DEC OSF/1 ld automatically includes /usr/local/lib in the
search path.
Thus, when I build software on a GNU/Linux systems, I often have
something like this:
env CC=/usr/bin/cc \
CXX=/usr/bin/c++ \
LDFLAGS="-Wl,-rpath,/usr/local/lib" \
./configure && make all check
Because I often build software in over 100 compilation environments, I
hide this mess in configuration files for the build-all system:
http://www.math.utah.edu/pub/build-all/
The alternatives are all unpleasant:
(1) require all users to define LD_LIBRARY_PATH in their shell
environments to include $(prefix)/lib;
(2) wrap the executable in a shell script that sets
LD_LIBRARY_PATH, so that users do not have to;
(3) add $(prefix)/lib to the run-time loader search path.
For (3), on GNU/Linux, this means adding a directory to
/etc/ld.so.conf, then running /etc/ldconfig each time that directory
is updated with new libraries, and doing so on every machine in your
environment that shares the same $(prefix) file tree.
There is an analogous system for Sun Solaris, but we never use it,
precisely because it requires updates on every machine (in my case,
100+).
Another problem that we have run into is conflicts on some GNU/Linux
systems, notably with Gnome tools, between shared libraries in
/usr/lib vs $(prefix)/lib, so we have moved away from touching
/etc/ld.so.conf.
-------------------------------------------------------------------------------
- Nelson H. F. Beebe Tel: +1 801 581 5254 -
- University of Utah FAX: +1 801 581 4148 -
- Department of Mathematics, 110 LCB Internet e-mail: beebe@math.utah.edu -
- 155 S 1400 E RM 233 beebe@acm.org beebe@computer.org -
- Salt Lake City, UT 84112-0090, USA URL: http://www.math.utah.edu/~beebe -
-------------------------------------------------------------------------------