--- elf/do-lookup.h.base 2003-05-15 09:29:25.000000000 -0700 +++ elf/do-lookup.h 2003-05-15 09:24:24.000000000 -0700 @@ -52,7 +52,8 @@ FCT (const char *undef_name, unsigned lo const ElfW(Sym) *sym; #if ! VERSIONED int num_versions = 0; - const ElfW(Sym) *versioned_sym = NULL; + const ElfW(Sym) *default_version = NULL; + const ElfW(Sym) *first_version = NULL; #endif map = list[i]; @@ -155,16 +156,29 @@ FCT (const char *undef_name, unsigned lo public interface should be returned. */ if (verstab != NULL) { - if ((verstab[symidx] & 0x7fff) - >= ((flags & DL_LOOKUP_RETURN_NEWEST) ? 2 : 3)) + ElfW(Half) ndx = verstab[symidx] & 0x7fff; + if (ndx >= ((flags & DL_LOOKUP_RETURN_NEWEST) ? 2 : 3)) { /* Don't accept hidden symbols. */ if ((verstab[symidx] & 0x8000) == 0 && num_versions++ == 0) /* No version so far. */ - versioned_sym = sym; + default_version = sym; continue; } + if ((flags & DL_LOOKUP_RETURN_NEWEST) == 0 && ndx != 0) + { + /* ndx == 1 is the base version. We will use it for + old unversioned application. */ + if (ndx != 1) + { + /* We remember the first version and keep looking + for the base version. */ + if (ndx == 2) + first_version = sym; + continue; + } + } } #endif @@ -179,7 +193,8 @@ FCT (const char *undef_name, unsigned lo #if VERSIONED sym = NULL; #else - sym = num_versions == 1 ? versioned_sym : NULL; + sym = first_version ?: (num_versions == 1 + ? default_version : NULL); #endif if (sym != NULL)