Address run-time linker problems: LD_PRELOAD issue on multi-ABI platforms
[openssl.git] / util / shlib_wrap.sh
1 #!/bin/sh
2
3 [ $# -ne 0 ] || set -x          # debug mode without arguments:-)
4
5 THERE="`echo $0 | sed -e 's|[^/]*$||' 2>/dev/null`.."
6 [ -d "${THERE}" ] || exec "$@"  # should never happen...
7
8 # Alternative to this is to parse ${THERE}/Makefile...
9 LIBCRYPTOSO="${THERE}/libcrypto.so"
10 if [ -f "$LIBCRYPTOSO" ]; then
11     while [ -h "$LIBCRYPTOSO" ]; do
12         LIBCRYPTOSO="${THERE}/`ls -l "$LIBCRYPTOSO" | sed -e 's|.*\-> ||'`"
13     done
14     SOSUFFIX=`echo ${LIBCRYPTOSO} | sed -e 's|.*\.so||' 2>/dev/null`
15     LIBSSLSO="${THERE}/libssl.so${SOSUFFIX}"
16 fi
17
18 case "`(uname -s) 2>/dev/null`" in
19 SunOS|IRIX*)
20         # SunOS and IRIX run-time linkers evaluate alternative
21         # variables depending on target ABI...
22         rld_var=LD_LIBRARY_PATH
23         case "`(/usr/bin/file "$LIBCRYPTOSO") 2>/dev/null`" in
24         *ELF\ 64*SPARC*)
25                 [ -n "$LD_LIBRARY_PATH_64" ] && rld_var=LD_LIBRARY_PATH_64
26                 ;;
27         *ELF\ N32*MIPS*)
28                 [ -n "$LD_LIBRARYN32_PATH" ] && rld_var=LD_LIBRARYN32_PATH
29                 _RLDN32_LIST="$LIBCRYPTOSO:$LIBSSLSO:DEFAULT"; export _RLDN32_LIST
30                 ;;
31         *ELF\ 64*MIPS*)
32                 [ -n "$LD_LIBRARY64_PATH"  ] && rld_var=LD_LIBRARY64_PATH
33                 _RLD64_LIST="$LIBCRYPTOSO:$LIBSSLSO:DEFAULT"; export _RLD64_LIST
34                 ;;
35         esac
36         eval $rld_var=\"${THERE}:'$'$rld_var\"; export $rld_var
37         unset rld_var
38         ;;
39 *)      LD_LIBRARY_PATH="${THERE}:$LD_LIBRARY_PATH"     # Linux, ELF HP-UX
40         DYLD_LIBRARY_PATH="${THERE}:$DYLD_LIBRARY_PATH" # MacOS X
41         SHLIB_PATH="${THERE}:$SHLIB_PATH"               # legacy HP-UX
42         LIBPATH="${THERE}:$LIBPATH"                     # AIX, OS/2
43         export LD_LIBRARY_PATH DYLD_LIBRARY_PATH SHLIB_PATH LIBPATH
44         # Even though $PATH is adjusted [for Windows sake], it doesn't
45         # necessarily does the trick. Trouble is that with introduction
46         # of SafeDllSearchMode in XP/2003 it's more appropriate to copy
47         # .DLLs in vicinity of executable, which is done elsewhere...
48         if [ "$OSTYPE" != msdosdjgpp ]; then
49                 PATH="${THERE}:$PATH"; export PATH
50         fi
51         ;;
52 esac
53
54 if [ -f "$LIBCRYPTOSO" ]; then
55         # Following three lines are major excuse for isolating them into
56         # this wrapper script. Original reason for setting LD_PRELOAD
57         # was to make it possible to pass 'make test' when user linked
58         # with -rpath pointing to previous version installation. Wrapping
59         # it into a script makes it possible to do so on multi-ABI
60         # platforms.
61         LD_PRELOAD="$LIBCRYPTOSO $LIBSSLSO"         # SunOS, Linux, ELF HP-UX
62         _RLD_LIST="$LIBCRYPTOSO:$LIBSSLSO:DEFAULT"  # Tru64, o32 IRIX
63         export LD_PRELOAD _RLD_LIST
64 fi
65
66 exec "$@"