Index: share/mk/bsd.lib.mk =================================================================== --- share/mk/bsd.lib.mk (revision 253515) +++ share/mk/bsd.lib.mk (working copy) @@ -334,6 +334,7 @@ ${INSTALL} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} ${DESTDIR}${LIBDIR}/${SHLIB_LINK:R}.ld \ ${DESTDIR}${LIBDIR}/${SHLIB_LINK} + ${INSTALL_SYMLINK} ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK}.last rm -f ${DESTDIR}${LIBDIR}/${SHLIB_LINK:R}.ld .else Index: libexec/rtld-elf/rtld.c =================================================================== --- libexec/rtld-elf/rtld.c (revision 253515) +++ libexec/rtld-elf/rtld.c (working copy) @@ -69,6 +69,8 @@ #else #define PATH_RTLD "/libexec/ld-elf32.so.1" #endif +#define LAST_SO_SUFFIX ".last" +#define LAST_SO_SUFFIX_LEN 5 /* Types. */ typedef void (*func_ptr_type)(); @@ -2625,12 +2627,14 @@ try_library_path(const char *dir, size_t dirlen, void *param) { struct try_library_args *arg; + size_t pathlen; arg = param; if (*dir == '/' || trust) { char *pathname; - if (dirlen + 1 + arg->namelen + 1 > arg->buflen) + pathlen = dirlen + 1 + arg->namelen + 1; + if (pathlen > arg->buflen) return (NULL); pathname = arg->buffer; @@ -2638,6 +2642,19 @@ pathname[dirlen] = '/'; strcpy(pathname + dirlen + 1, arg->name); + if (pathlen + LAST_SO_SUFFIX_LEN > arg->buflen) { + strcpy(pathname + dirlen + 1 + arg->namelen, + LAST_SO_SUFFIX); + dbg(" Trying \"%s\"", pathname); + if (access(pathname, F_OK) == 0) { /* Found */ + pathname = xmalloc(dirlen + 1 + arg->namelen + + LAST_SO_SUFFIX_LEN + 1); + strcpy(pathname, arg->buffer); + return (pathname); + } + pathname[dirlen + 1 + arg->namelen] = '\0'; + } + dbg(" Trying \"%s\"", pathname); if (access(pathname, F_OK) == 0) { /* We found it */ pathname = xmalloc(dirlen + 1 + arg->namelen + 1);