aboutsummaryrefslogtreecommitdiffstats
path: root/glibc/glibc-2.3.2/30_glibc232-base.patch
diff options
context:
space:
mode:
Diffstat (limited to 'glibc/glibc-2.3.2/30_glibc232-base.patch')
-rw-r--r--glibc/glibc-2.3.2/30_glibc232-base.patch55
1 files changed, 55 insertions, 0 deletions
diff --git a/glibc/glibc-2.3.2/30_glibc232-base.patch b/glibc/glibc-2.3.2/30_glibc232-base.patch
index e69de29bb2..91c9b557d1 100644
--- a/glibc/glibc-2.3.2/30_glibc232-base.patch
+++ b/glibc/glibc-2.3.2/30_glibc232-base.patch
@@ -0,0 +1,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)