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. */