gnu/96481: native ld(1) does not look for shared libs in
LD_LIBRARY_PATH
Thomas Quinot
thomas at FreeBSD.org
Fri Apr 28 16:40:19 UTC 2006
>Number: 96481
>Category: gnu
>Synopsis: native ld(1) does not look for shared libs in LD_LIBRARY_PATH
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Apr 28 16:40:12 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Thomas Quinot
>Release: FreeBSD 6.1-RC i386
>Organization:
>Environment:
System: FreeBSD kani 6.1-RC FreeBSD 6.1-RC #0: Mon Apr 24 13:08:50 CEST 2006 root at kani:/usr/obj/usr/src/RELENG_6/sys/KANI i386
>Description:
According to man ld:
The linker uses the following search paths to locate required
shared libraries.
[...]
5. For a native linker, the contents of the environment variable
"LD_LIBRARY_PATH".
But actually this does not occur because the NATIVE variable is
never set in genscripts.sh when we build ld.
>How-To-Repeat:
Unshar the below archive into a fresh directory.
Run script 'doit.sh'.
A working 'fred' binary should be produced. Currently we get
a link error:
/usr/bin/ld: warning: libfoo.so, needed by /var/tmp/bug/subbar/libbar.so, not found (try using -rpath or -rpath-link)
fred.o(.text+0x1e): In function `main':
: undefined reference to `foo'
doit.sh: ./fred: not found
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# fred.c
# libbar.c
# libfoo.c
# doit.sh
#
echo x - fred.c
sed 's/^X//' >fred.c << 'END-of-fred.c'
Xint main (void) { return foo () + bar (); }
END-of-fred.c
echo x - libbar.c
sed 's/^X//' >libbar.c << 'END-of-libbar.c'
Xint bar (void) { return foo (); }
END-of-libbar.c
echo x - libfoo.c
sed 's/^X//' >libfoo.c << 'END-of-libfoo.c'
Xint foo (void) { return 0; }
END-of-libfoo.c
echo x - doit.sh
sed 's/^X//' >doit.sh << 'END-of-doit.sh'
Xmkdir subfoo subbar
X
Xgcc -c -fPIC libfoo.c
Xgcc -shared -o subfoo/libfoo.so libfoo.o
X
Xgcc -c -fPIC libbar.c
Xgcc -shared -o subbar/libbar.so -L`pwd`/subfoo libbar.o -lfoo
X
Xexport LD_LIBRARY_PATH=`pwd`/subfoo:`pwd`/subbar
Xgcc -o fred fred.o -L`pwd`/subbar -lbar
X
X./fred
END-of-doit.sh
exit
>Fix:
Index: genscripts.sh
===================================================================
RCS file: /usr/ncvs/src/gnu/usr.bin/binutils/ld/genscripts.sh,v
retrieving revision 1.6
diff -u -r1.6 genscripts.sh
--- genscripts.sh 16 Jun 2004 07:09:37 -0000 1.6
+++ genscripts.sh 28 Apr 2006 16:01:15 -0000
@@ -50,7 +50,10 @@
# Set some flags for the emultempl scripts. USE_LIBPATH will
# be set for any libpath-using emulation.
- USE_LIBPATH=yes
+ if [ "x${host}" = "x${target}" ] ; then
+ NATIVE=yes
+ fi
+ USE_LIBPATH=yes
# Set the library search path, for libraries named by -lfoo.
# If LIB_PATH is defined (e.g., by Makefile) and non-empty, it is used.
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list