summaryrefslogtreecommitdiff
path: root/glibc/glibc-2.3.2/30_glibc232-base.patch
blob: 91c9b557d1f2766b1066b064705038e38431325b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
--- 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)