PATCH: Fix the unversioned lookup (take 2)

H. J. Lu hjl@lucon.org
Wed May 14 15:11:00 GMT 2003


This is an update for my unversioned lookup patch. We should use the
base version for the old unversioned application if it is available.
When we find the first version, we should keep searching.


H.J.
-------------- next part --------------
2003-05-14  <hongjiu.lu@intel.com>

	* elf/do-lookup.h (FCT): Try the base version, the first
	version and then the default version, in that order, for
	the old unversioned reference.

--- elf/do-lookup.h.base	2003-05-13 14:37:50.000000000 -0700
+++ elf/do-lookup.h	2003-05-14 07:56:59.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 == 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)


More information about the Libc-alpha mailing list