File glibc-2.3.90-noversion.diff of Package glibc

Index: glibc-2.20/elf/rtld.c
===================================================================
--- glibc-2.20.orig/elf/rtld.c
+++ glibc-2.20/elf/rtld.c
@@ -1591,6 +1591,52 @@ ERROR: ld.so: object '%s' cannot be load
 	}
     }
 
+#if defined(__i386__)
+  /*
+   * Modifications by Red Hat Software
+   *
+   * Deal with the broken binaries from the non-versioned ages of glibc.
+   * If a binary does not have version information enabled, we assume that
+   * it is a glibc 2.0 binary and we load a compatibility library to try to
+   * overcome binary incompatibilities.
+   *                   Blame: gafton@redhat.com
+   */
+#define LIB_NOVERSION "/lib/obsolete/noversion/libNoVersion.so.1"
+
+  if (__glibc_unlikely (main_map->l_info[DT_NUM + DT_THISPROCNUM
+                                         + DT_VERSIONTAGIDX (DT_VERNEED)]
+                        == NULL)
+      && (main_map->l_info[DT_DEBUG] != 0
+          || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)))
+    {
+      struct stat64 test_st;
+      int test_fd;
+      bool can_load;
+
+      HP_TIMING_NOW (start);
+
+      can_load = true;
+      test_fd = __open (LIB_NOVERSION, O_RDONLY);
+      if (test_fd < 0)
+	can_load = false;
+      else
+	{
+	  if (__fxstat64 (_STAT_VER, test_fd, &test_st) < 0
+	      || test_st.st_size == 0)
+	    can_load = false;
+	  __close(test_fd);
+	}
+
+      if (can_load)
+	npreloads += do_preload (LIB_NOVERSION, main_map,
+				 "nonversioned binary");
+
+      HP_TIMING_NOW (stop);
+      HP_TIMING_DIFF (diff, start, stop);
+      HP_TIMING_ACCUM_NT (load_time, diff);
+    }
+#endif
+
   if (__glibc_unlikely (*first_preload != NULL))
     {
       /* Set up PRELOADS with a vector of the preloaded libraries.  */
openSUSE Build Service is sponsored by