LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File glibc-2.3.90-noversion.diff of Package glibc.i686 (Project Base:build)

Index: glibc-2.16.90/elf/rtld.c
===================================================================
--- glibc-2.16.90.orig/elf/rtld.c
+++ glibc-2.16.90/elf/rtld.c
@@ -1717,6 +1717,53 @@ 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 (__builtin_expect (main_map->l_info[DT_NUM + DT_THISPROCNUM
+                                         + DT_VERSIONTAGIDX (DT_VERNEED)]
+                        == NULL, 0)
+      && (main_map->l_info[DT_DEBUG]
+          || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)))
+    {
+      struct stat test_st;
+      int test_fd;
+      int can_load;
+
+      HP_TIMING_NOW (start);
+
+      can_load = 1;
+      test_fd = __open (LIB_NOVERSION, O_RDONLY);
+      if (test_fd < 0) {
+	can_load = 0;
+      } else {
+	if (__fxstat (_STAT_VER, test_fd, &test_st) < 0 || test_st.st_size == 0) {
+	  can_load = 0;
+	}
+      }
+
+      if (test_fd >= 0) /* open did no fail.. */
+	__close(test_fd); /* avoid fd leaks */
+
+      if (can_load != 0)
+	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 (__builtin_expect (*first_preload != NULL, 0))
     {
       /* Set up PRELOADS with a vector of the preloaded libraries.  */