Index: libexec/rtld-elf/rtld.c =================================================================== --- libexec/rtld-elf/rtld.c (revision 279326) +++ libexec/rtld-elf/rtld.c (working copy) @@ -130,7 +130,7 @@ static int relocate_objects(Obj_Entry *, bool, Obj static int resolve_objects_ifunc(Obj_Entry *first, bool bind_now, int flags, RtldLockState *lockstate); static int rtld_dirname(const char *, char *); -static int rtld_dirname_abs(const char *, char *); +static int rtld_dirname_abs(char *, char *); static void *rtld_dlopen(const char *name, int fd, int mode); static void rtld_exit(void); static char *search_library_path(const char *, const char *); @@ -3559,10 +3559,16 @@ rtld_dirname(const char *path, char *bname) } static int -rtld_dirname_abs(const char *path, char *base) +rtld_dirname_abs(char *path, char *base) { char base_rel[PATH_MAX]; + ssize_t len; + len = readlink(path, base_rel, sizeof(base_rel) - 1); + if (len != -1) { + base_rel[len] = '\0'; + path = base_rel; + } if (rtld_dirname(path, base) == -1) return (-1); if (base[0] == '/')